不适合没有碰过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
用法:
git commit --author="TH779 <[email protected]>" -m "我最喜欢女装了"
就可以创建一条身份为@TH779 的提交
所以...它的用法是git commit --author="用户名 <邮箱>"
那么问题来了,用户名和邮箱哪里搞?
一个小细节(其实是github的)
随便找个提交
比如我想pick这个( https://github.com/xzr467706992/android_kernel_oneplus_sm8250/commit/cc3b62468272131470c4b72c26c300f2cd5c6019 ),但是我没有用git cherry-pick
,而是手动改了文件,现在我想要得到作者信息。
那么
只需要在网址后面加上.patch,变成 https://github.com/xzr467706992/android_kernel_oneplus_sm8250/commit/cc3b62468272131470c4b72c26c300f2cd5c6019.patch 即可进入一个文本页面,从From: LibXZR <[email protected]> Date: Sun, 13 Sep 2020 20:28:14 +0800
即可找到作者信息
不过有时候,我们找提交时得到的网址可能是这样的
https://github.com/xzr467706992/android_kernel_oneplus_sm8250/commit/cc3b62468272131470c4b72c26c300f2cd5c6019#diff-d6194c68fcc7e79bb57401be603cb1cc
此时直接加上.patch是无法打开那个文本页面的
首先我们要去掉#diff以及后面的内容,得到
https://github.com/xzr467706992/android_kernel_oneplus_sm8250/commit/cc3b62468272131470c4b72c26c300f2cd5c6019
然后再加上.patch得到作者信息
改变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
即可