不适合没有碰过git的人查看,首先,你要会用git

连续cherry-pick中的"^"

  • 相信大多数人都知道如何连续cherry-pick
  • git cherry-pick aaaaa^..bbbbb
  • 不过有个注意点要提醒一下,那就是"^"
  • "^"标志代表从当前提交(aaaaa)开始pick,如果没有这个标志,git将会从aaaaa的下一个提交开始pick,一直到bbbbb提交
  • 有人可能不喜欢"^",于是选择从aaaaa的前一个提交开始pick。但是这样做是有风险的,在遇到存在merge带来的提交的tree中,不使用"^"而选择从前一个提交开始,非常容易造成错误的cherry-pick

只pick没有冲突的提交

  • 这个技巧在内核(乱)pick中很有用
  • 首先git cherry-pick aaaaa^..bbbbb
  • 开始过程一切顺利,但是中间有一个提交出现冲突了,但我又不想解决,咋办呢?(如果直接git cherry-pick --abort,会直接回到cherry-pick之前的状态,那些没有冲突的提交都会被撤销)
  • 在出现冲突后,执行git reset --hard然后git cherry-pick --continue就能继续pick啦 (相当于跳过有冲突的提交)
@Pzqqt :可以直接使用git cherry-pick --skip跳过有冲突的提交

巨大冲突怎么pick?

  • 这是造成很多git萌新开kang的原因
  • 其实也不难
  • 首先。git cherry-pick aaaaa
  • 然后发现,卧槽,我的文件差异太大了,爆炸性冲突,但是我又想要这个提交,这可咋办?
  • 很多萌新就会放弃pick(git cherry-pick --abort)然后手动修改自己的tree(按照增减记录来),最后一个完美的git commit就完成了kang的过程😂
  • 其实这种情况下不需要取消cherry-pick,你只需要对那个被git搞砸的文件执行git checkout --ours <文件路径>就可以把那个文件还原到cherry-pick之前的状态,手动修改完成后,git commit,此时原作者信息也会得以保留
  • 如果你喜欢,你可以使用git commit -s来增加自己的sign-off (谁来解释下这东西除了装逼还有啥用)

远古提交我写错信息/提交内容有错误可咋办?

  • 这种情况其实也非常常见
  • 先reset到那个要被修改的提交git reset --hard ccccc
  • 然后在你的tree中改正错误
  • 最后执行git commit -a --amend,并改正commit信息
  • 完成后这条提交已经被修改正常了
  • 最后的最后把在这条提交之后的一大堆提交cherry-pick回来就是了
  • 别忘了git push -f
@grislux55: 远古提交写错东西可以用git rebase -i commit-SHA1来修正,这样可以不用自己手动pick那一大堆提交了

如何合并多个提交?

  • 前提是这几个提交是连续的,比如我有aaaaa,bbbbb,ccccc,ddddd,eeeee五个提交,目前我在eeeee
  • 执行git reset aaaaa
  • 执行git add * && git commit --amend
  • 此时从bbbbb到eeeee的提交就会全部被合并到aaaaa中

我不想合并到aaaaa里,我想新建一个,这可咋办?

  • git reset到aaaaa前面的那一个提交
  • git add * && git commit此时将会新建提交
这里的主区别就是--amend,带上这个后,当前修改将会合并到前一个提交当中

创建别人的提交

拯救authorship

这里介绍git commit命令的额外参数--author
用法:

改变commit的日期

按照上面那一条操作后已经可以得到具有正确作者信息的commit了
假如,你想要使commit日期也变得和原提交一样(假装cherry-pick)
那么,你可以使用
git commit --date="时间"来得到
比如git commit --date="Sun, 13 Sep 2020 20:28:14 +0800"

总结一下上面两步

  • 假如你想要pick一个提交,但是又想要手动修改,那么你可以在手动修改完成后执行
    git commit --author="作者名称 <作者邮箱>" --date="日期"来"pick"一个提交
    这样得到的提交和pick得到的完全相同(别人根本看不出来你是手动改的还是pick的)
  • 假如你已经git commit,新创建了一个提交并打上了自己的名字(kang)
    那么你可以通过git commit --amend --author="作者名称 <作者邮箱>" --date="日期"来修复上一条提交的作者信息

克隆最小仓库

  • 这也是一个比较常见的需求,有些仓库,只是拿来用的,历史记录毫无意义(比如gcc/clang仓库)
  • 此时我们可以使用git clone <url> --depth=1来克隆仓库,能有效节约时间
  • 这样得到的仓库,在git log中只有最后一次提交
  • 在depth=1状态下,你可以继续创建提交,也可以正常的将新提交推送到仓库(仓库里的提交也不会变少)。你也可以自由的git reset --hard,不需要担心远程仓库的历史记录消失
  • 但是,在depth=1的情况下,你无法合并含有历史记录的分支(但是依然可以合并同样不含有历史记录的分支)
  • 在depth=1情况下,cherry-pick不受影响

保存密码

  • 输多了密码总会厌烦
  • 你只需要运行git config --global credential.helper store之后再任意Push一次即可永久保存密码(对全部仓库生效)
  • 假如你只想对当前仓库保存密码,只需要git config --local credential.helper store即可

找回丢失的提交

  • 有时候,改完东西、git commit之后忘记了push,直接git reset --hard到前头去了,此时我们如何找回最新的提交呢?
  • 只需要git reflog即可