在工作中,这种情况经常发生,有人不小心将一些东西提交到 master 而不是预期的功能分支,然后这个人尝试解决它,结果却突然消失了。我进行了仔细的搜索,但找不到任何文档来解释为什么会发生这种情况,或者如何纠正这种情况。
以下是重现步骤:
$ git init
$ echo hello world > testfile
$ git add testfile
$ git commit -m 'init'
$ git branch A
$ echo abc >> testfile
$ git commit -am 'append abc'
$ git revert HEAD --no-edit
$ git checkout A
$ echo fff > secondfile
$ git add secondfile
$ git commit -m 'Add second file'
$ git cherry-pick master^
此时 git 历史记录如下所示:
$ git log --oneline --all --graph --decorate
* ac6f9b4 (HEAD -> A) append abc
* 54be952 Add second file
| * 9ba1f16 (master) Revert "append abc"
| * ef7c8d6 append abc
|/
* 65a885d init
然后观察当我在 master 之上 rebase 分支 A 时会发生什么:
$ git rebase master
$ git log --oneline --all --graph --decorate
* 9d08739 (HEAD -> A) Add second file
* 9ba1f16 (master) Revert "append abc"
* ef7c8d6 append abc
* 65a885d init
A 开头的提交 ac6f9b4 发生了什么?它去哪儿了?为什么没有重新应用?
虽然这只是一个小例子,最后缺少一个提交,但有时我们最终会在长提交链的中间丢失多个提交,然后它们看起来几乎看不见:(
Rebase 不会重新应用已经在新基础中应用的提交——在这里,这是你的append abc
改变。它已经在大师历史中了。这通常是正确的,以至于 git 不做任何评论就这样做了。可以说,在随后的恢复存在的情况下,这一点至少值得一提。
查看您正在变基的任何内容是否已经是新基础历史记录的一部分(master
, here),
git log --oneline --cherry ...master
并寻找=
- 标记的提交。这些是 master 中的提交,与您分支中的提交相匹配; rebase 不会重新应用它们。交换master...
for ...master
查看本地等效项。
如果你想要一个有效的盲变基,第一次切割是
git checkout -B A master
git cherry-pick ..A@{1} # < added the very important `..` by edit
它只是将 A 移动到 master 上,然后挑选你刚刚留下的所有内容。要忽略合并(您可能应该这样做),请添加--no-merges
对于cherry-pick,事实证明,当你向cherry-pick询问一个系列时,它只是将整个集合传递给git rev-list
这样你就可以直接使用机器:
git cherry-pick --no-merges ..A@{1} # just learned now that cherry-pick takes this
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)