8,整理提交记录(拣选提交内容)
git cherry-pick c3 c4 c7; 选择几个节点,提交到当前分支。
“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。
命令形式为:
git cherry-pick <提交号>...
如果你想将一些提交复制到当前所在的位置(
HEAD
)下面的话, Cherry-pick 是最直接的方式了。cherry-pick是捡几个提交合并到当前分支。rebase是基于B分支,将当前分支的提交都合并过去。
9,交互式rebase(4,合并分支 git rebase)
git rebase -i HEAD~4;重置最近的四次提交,可以排序和删除
git rebase -i c1;重置最近几次(直到c1)的提交
当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。
但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了。
从左图到右图
方法一:git checkout master; git cherry-pick c4;
方法二:git rebase -i c1; git checkout master; git rebase bugFix;
10,提交的技巧
git rebase caption master;
接下来这种情况也是很常见的:你之前在
newImage
分支上进行了一次提交,然后又基于它创建了caption
分支,然后又提交了一次。此时你想对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下
newImage
中图片的分辨率,尽管那个提交记录并不是最新的了。我们可以通过下面的方法来克服困难:
- 先用
git rebase -i
将提交重新排序,然后把我们想要修改的提交记录挪到最前- 然后用
commit --amend
来进行一些小修改- 接着再用
git rebase -i
来将他们调回原来的顺序- 最后我们把 master 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!
当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。 最后有必要说明一下目标状态中的那几个
'
—— 我们把这个提交移动了两次,每移动一次会产生一个'
;而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。
从左到右
git rebase -i HEAD~2;
git commit --amend
git rebase -i c1;相当于git rebase -i HEAD~2
git rebase caption master
11,git rebase 的用法(后面跟一个分支、后面跟两个分支)
git rebase caption;命令后面只跟一个分支B【caption】(不是当前分支A【master】),把当前分支A的更新,基于分支B再逐步提交一次。
还原
git rebase master caption;命令后面跟两个分支A【当前master】和B【caption】,相当于把B的更新内容,基于A的内容再提交一次,并把当前分支转换为B。
再还原
git rebase caption master;命令后面跟两个分支A【caption】和B【当前master】,相当于把B更新的内容,基于A再提交一次,当前分支转为B(本来就是B)。
又还原
git rebase newImage caption;命令后面跟两个分支A【newImage】和B【caption】,两个都不是当前分支,相当于B的更新基于A再提交一次,当前分支转为B【caption】。
12,git cherry-pick
要在心里牢记 cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。