二、git cherry-pick 选择
cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。
git checkout master; git cherry-pick C2
下图中左、右两张图分别是执行代码前后的样子:
是不是有点眼熟:D 没错 这个和 rebase 的效果蛮像的,这两个命令都可以实现复制提交~
三、git reset VS revert 回滚
git revert HEAD 是用一次新的 commit 来回滚之前的 commit,git reset 是直接向上移动分支,删除一些 commit 看上去像从未提交一样。这两者看似达到的效果是一样的,其实完全不同。
git reset HEAD~1git revert HEAD
如下所见,图 1 是初始状态(需要撤回 C2 提交),图 2 和图 3 是从图 1 分别执行 reset 和 revert 后的结果:
• reset执行后,master 分支移回到了 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了
• revert执行后,在我们要撤销的提交记录 C2 后面多了一个新提交 C2',而 C2' 引入了更改—— 这些更改是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
注意:
• 如果你已经 push 到线上代码库, reset 删除指定 commit 以后, 你 git push 可能导致很多冲突.但是 revert 并不会。• 如果此回退的分支合并主干分支时,reset 恢复部分的代码依然会出现在历史分支里,但是 revert 方向提交的 commit 并不会出现在历史分支里。
# 事例
reset后的123 merge了12345 还是12345
revert后的12345(-3) merge了12345 是12345(-3)
四、HEAD^n 和 HEAD~n 相对引用
HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。HEAD 总是指向当前分支上最近一次提交记录
(如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。)
1. 基础使用:
• 使用 ^ 表示向上移动 1 个提交记录。n 表示第 n 个父提交,不填默认是 1(正上方)
• 使用 ~<num> 向上移动多个提交记录
如 ~3
注意:操作符还支持链式操,如 HEAD^2~3^2.
延伸用法:移动分支:可以直接使用 -f 选项让分支指向另一个提交。
例如下面的命令会将 master 分支强制指向HEAD 的第 3 级父提交。
git branch -f master HEAD~3
这次主要就总结了这几种“不常用”git 命令,希望大家和我都可以多多练习,让他变成你需要时就可以自如使用的“常用”命令!