Git - 这些过程是否相等?

Git - are these processes equal?

想请教一下这两种方式有什么区别

起始情况是:

master branch
|   
E  F - test branch
|  |
D  C
| /
B
|
A

第一种方法:

git checkout test
git merge master
git rebase -i master
git checkout master
git merge test

第二种方法:

git checkout test
git rebase -i master
git checkout master
git merge test

我想做的是将 C 和 F 压缩到一个提交中,然后将其 rebase 到 master 上,这样它在 master 上显示为一个新提交。

但是,我在实验中使用了第一种方法(通常使用第二种方法),但结果很糟糕。使用第一种方法后,master 上的一些更改丢失了。

所以我的问题是有什么区别?如果我在这两种方法之后都正确,最终图表应该如下所示:

master branch
|
G = C + F + old master
|   
E
|
D
|
B
|
A

将 master 合并到 test 和 rebase 是没有意义的。因为合并时测试中的更改已经存在。

要达到你想要的效果,你需要使用 --squash

  1. 结帐测试
  2. 合并或变基 master(无论哪个)
  3. 结帐大师
  4. git合并测试--squash
  5. 提交您想要的消息。

--squash 将您在测试中的所有提交压缩为一个,因此在您的历史记录中它看起来像是一个提交。

如果不确切知道您在交互式变基过程中做了什么,很难说出这两种方法之间的区别。

但是在第一种方法中,合并将向 test 分支添加一个新的提交(我们称之为 M)。所以在合并之后,回购将看起来像这样:

master branch
|
|  M - test branch
|/ |
E  F
|  |
D  C
| /
B
|
A

(注意master不变。)

现在,当您进行交互式变基时,git 意识到只有 CF(而不是合并提交,M)需要应用于master。因此,在不对变基文件中的 command/commit 列表进行任何更改的情况下,您最终会得到:

master branch
|
E --- C --- F - test branch
|
D
|
B
|
A

(再次注意 master 没有改变。)

在交互式变基期间,如果您将 pick 更改为 squash/fix 以提交 F,它将合并到 C。所以你最终会得到:

master branch
|
E --- C+F - test branch
|
D
|
B
|
A

最后,在将 test 合并到 master 之后,您最终得到:

E --- C+F - test / master branch
|
D
|
B
|
A

这两种方法的区别在于第一种方法在 test 分支上创建合并提交,然后在 test 重新基于 master.[=32= 时消失]