合并在分支分支上提交

use*_*997 0 git

最好用一个例子解释一下:

git init
touch a # create the file "a"
git add a && git commit -m "a"
git checkout -b test # create and checkout the branch "test" 
touch t
git add t && git commit -m "t"
git checkout master
touch b 
git add b && git commit -m "b"
git checkout test 
git merge master # when I do the merge the editor pops up asking for a commit message with something like "merge with master" as the default, and this commit is the problem
Run Code Online (Sandbox Code Playgroud)

现在这是问题所在,我希望“测试”的提交历史记录具有三个提交,这些提交在此处由其消息表示(与相同的顺序git log):

-b
-t
-a

但是我得到了:

-与主人合并
-t
-b
-a

有趣的是,[ b ]和[ 与主合并 ]提交与之前的提交具有相同的差异。更有趣的是HEAD^实际上指向“测试”上的[t] HEAD^^指向“测试”上的[a]
我想知道为什么会这样,以及如何避免[ 与主合并 ]提交。另外,请参阅Update-2。
我应该注意,如果不对分支“ test”进行[ t ]提交,则不会发生这种情况,即:合并后,我将在其历史记录中得到两次提交:[ a ]和[ b ]。

更新:

似乎我无法使用该--ff-only选项,并收到错误“无法快速前进”。但是为什么会这样(因为没有冲突)?在“ ckruczek”的评论中已经解决了这一问题。

更新2:

我想这个问题自最初发布以来已经有所变化:
commits [ 与master合并 ]和[ b ]都在其中创建了“ b”,因此“播放这些commits”时没有错误怎么办? ”?

cst*_*992 5

合并提交应该发生在不同的分支上

gitk提供比提交更好的可视化提交git log。当您合并两个分支时,它们在git log历史记录中出现的顺序就无关紧要;重要的是它们来自两个不同的分支。

这是合并之前gitk的屏幕截图:

合并之前

创建提交“ t”时,您将创建一个与master 分支的分支,该分支将继续使用test。如果您在测试分支中,将来的提交现在将添加到提交“ t”的顶部。

同时,master分支在“ a”之上还有另一个提交,即提交“ b”。当您进行合并时,git所做的是将所有测试提交浓缩为一个并在“ b”之上进行一次提交,这被称为合并提交,并且有两个父级(每个分支一个)。您可以在中观察它们gitk

这是合并后的屏幕截图:

合并后

提交“ b”和“ t”没有共同之处,因此可以在“ b”之上安全地创建合并提交,而不会发生任何冲突。

所有这些,您想要的是线性历史记录。如果是这样,请在测试分支中进行重新设置基准,而不是合并:

$ git checkout test #making sure we're in 'test' branch
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

重新设置基准之后,历史记录如下所示:

变基

完全一样的东西;只是线性的。


如果您不执行“ t”提交,则测试分支指向提交“ a”,并且测试中没有什么不在master中,因此会进行快速合并。这意味着将简单地更新测试分支指针以指向与较新的分支相同的提交。

回应OP的最新评论

您在代码中完成的操作将检出测试,然后将master合并到其中,这通常与您在实践中进行合并时相反,因为master分支是主要分支。在这种情况下,我会这样做:

$ git checkout master
$ git merge test
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

实际合并

在这里,master分支现在指向合并提交,并且合并提交中包含“ b”。

如果要还原此提交,请执行以下操作:

$ git revert <merge commit id>
Run Code Online (Sandbox Code Playgroud)

无效-因为合并是在两个分支之间。您必须指定一个父编号才能进行合并。要还原“ b”中的更改,您必须说“我要还原主master分支”,例如:

$ git revert -m 1 <merge commit id>
Run Code Online (Sandbox Code Playgroud)

这将还原提交“ b”。指定2将还原测试分支,并提交“ t”。