Git 重定基可将一组提交从一个分支移动到另一个分支。我对这个过程的理解正确吗?
我有三个分支:Git 重定基可将一组提交从一个分支移动到另一个分支。我对这个过程的理解正确吗?,git,rebase,Git,Rebase,我有三个分支:master,develope,和release。在release之外,我分支了一个单独的分支,名为my bug fix 这个分支有五个分支。我将其合并回版本,因此我基本上有以下内容: 现在我想通过f提交b,并将这些修复移到developer中。我不能直接合并,因为我不想引入c。所以我发现你基本上可以做到: git checkout -b my-bug-fix-for-develop h git rebase --onto develop d^ git checkout deve
master
,develope
,和release
。在release
之外,我分支了一个单独的分支,名为my bug fix
这个分支有五个分支。我将其合并回版本
,因此我基本上有以下内容:
现在我想通过f
提交b
,并将这些修复移到developer
中。我不能直接合并,因为我不想引入c
。所以我发现你基本上可以做到:
git checkout -b my-bug-fix-for-develop h
git rebase --onto develop d^
git checkout develop
git merge my-bug-fix-develop
我抽象地理解这里发生的事情。我们创建一个指向commith
的新分支。然后,我们使用develope
作为新的基础,从d
的父提交开始(因此也包括d
)
我不明白的是,这到底是怎么回事,我想知道,因为我不喜欢在不了解实际情况的情况下盲目地运行命令。这是我到目前为止的理解。当我们创建my bug fix develop
时,我们最终得到以下结果:
这就是我感到困惑的地方。现在,当我们做git-rebase--on develop d^
时,git是否将my bug fix develop
的头设置为指向b
(即develop
开始的提交),然后重放从d
到h
的所有提交
我想我的主要问题是git checkout-b我对developh的bug修复的重要性。如果我在没有指定h
的情况下进行分支,并且我尝试将git-rebase——改为development d^
,那么我会得到一些甚至不是来自错误修复的其他更改。为什么将新分支的起点设置为h
可以实现这一点
这是我认为正在发生的事情,我想知道我是对的还是偏离了底线。它找到了mybug fixdevelope
和develope
的共同祖先,即a
。然后它从MyBug fix develop
上的每个提交中获取所有差异。这将包括d
到h
,因为我指定从d^
开始。然后它重置当前分支(MyBugFixDevelop
)以指向develop
(我正在重定的分支),然后在上面播放所有提交(d
到h
)
这就是正在发生的事情吗 git-rebase
将是实现这一点的一种方法,但我想我会推荐git-cherry-pick
:
git checkout develop
git cherry-pick c..h
主要区别在于,git cherry pick
不会移动您的my bug fix
和my bug fix develope
refs-它只会通过h
提交develope
中所做更改集的副本来推进develope
但是,如果您希望在develope
上使用side分支和merge commit,使其看起来有点像原始分支,那么请执行以下操作:
git checkout -b develop-bug-fix develop
git cherry-pick c..h
git checkout develop
git merge --no-ff develop-bug-fix
我对你们的图表有点困惑,因为它们的排序方式似乎有点不一致。箭头是否表示提交父级?还是要孩子?如果它们表示父级,则my bug fix
只包含一个提交,而该提交不在release
中,d
,并且i
-e
无法从任何分支访问。若它们表示子对象,那个么develope已经合并到master中,并且并没有父对象,那个么您的重基示例的行为将和您期望的完全不同。我很困惑…@Ajedi32箭头表示父母。我标记的分支只是指向单个提交的指针。我现在才意识到我把图片弄糟了,因为我的bug补丁也应该指向h
。我会换照片的。好的,谢谢。现在这就更有意义了。我以前肯定用过樱桃采摘。我只是好奇在这种情况下,重定基调是如何工作的。在这种情况下,重定基调的工作原理与樱桃采摘一样,在完成后,再加上移动分支参考点的步骤……啊,好的。那么,它的行为与rebase通常的行为类似?在a
找到共同祖先,然后将新分支设置为指向b
,然后通过h
在其上播放d
?@vivinvaliath在这种情况下,它不会找到develop
和my bug fix develop
的“共同祖先”,但是d^
和我的bug修复出现了
。关于rebase,请参见此格式的文档:(git-rebase--on
)当然了。这是有道理的。非常感谢你!