合并还是变基?

3

在使用远程代码库时,您有合并和变基的选项,但是在阅读了相关资料之后,我无法弄清楚为什么或何时使用变基。总体而言,似乎合并是更好的选择,即使它们都有优缺点。我只能想到合并是必须的情况。因此,我想知道何时使用变基更好。


请返回翻译后的文本:https://dev59.com/BXRA5IYBdhLWcg3w2xwIhttps://stackoverflow.com/search?q=%5Bgit%5D+merge+rebase - phd
这些链接中有很多细节,因此我不会重复,但值得一提的是,在“发布”到公共分支之前,我会将正在进行和私有分支rebase以清理代码。否则,我会进行合并。 - joanis
这个回答解决了你的问题吗?在什么情况下你会使用Git rebase而不是Git merge? - Pino
2个回答

2
合并功能分支,重新基于更新。
如果要合并一个功能分支,请进行合并。实际上,使用--no-ff(不快进)强制进行合并。这样可以在历史记录中留下一个“功能泡泡”,显示哪些提交被分组在一个分支中。您可以通过git log --graph查看此信息。
A - B --------- M - H <-- master
     \         /
      E - F - G

如果你进行变基操作,你只会得到一个扁平的历史记录。
A - B - E - F - G - H <-- master

有些人喜欢这种扁平的历史,它更简单,但却丢失了无法恢复的信息。一些人喜欢挤压合并的原因也是如此。

A - B - S - H <-- master

非常整洁,但却丢失了所有有用的提交信息。
当更新分支时,使用变基(rebase)。这是因为更新合并对于理解代码编写的原因没有太大兴趣,它们只会模糊真正的合并。
# Updating with `git merge master`
# This can look considerably worse if everyone is doing it.

      E - F   G - H  <-- other people's features
     /     \ /     \
A - B ----- M ----- M <-- master
     \       \       \
      C - D - M - I - M - K - L  <-- your feature

# Updating with `git rebase master`
      E - F   G - H  <-- other people's features
     /     \ /     \
A - B ----- M ----- M
                     \
                      C - D - I - K - L  <-- your feature

不再使用旧版本和新版本的主分支组合来构建你的分支,而是每个提交都基于最新的主分支版本。这样可以使调试和审查变得更简单,并且最终合并的分支也更简洁。

# Merge after updating with `git merge master`
# Again, it can be considerably worse.

      E - F   G - H
     /     \ /     \
A - B ----- M ----- M --------- M <-- master
     \       \       \         /
      C - D - M - I - M - K - L

# Merge after updating with `git rebase master`
      E - F   G - H
     /     \ /     \
A - B ----- M ----- M ----------------- M <-- master
                     \                 /
                      C - D - I - K - L

同样地,拉取(pull)只是获取(fetch)加上合并(merge)。拉取只是更新,所以可以使用--rebase进行获取和变基(rebase),或者通过pull.rebase = merges将其设置为默认值。

我喜欢这个答案,但它忽略了一个重要的观点:永远不要对已经推送到其他地方的内容进行变基操作,请参考http://www.git-scm.com/book/en/v2/Git-Branching-Rebasing#_rebase_vs_merge。 - Pino
1
@Pino 一个很好的经验法则,但不必盲目遵循。只要每个人都使用rebase进行更新,简单的通过rebase更新就不会有问题。 - Schwern

1

除了@Schwern提到的技术细节之外 -

合并和变基是两种不同的用例,不能将它们进行比较。

例如 -

当您执行git pull时,您实际上是在local分支中执行fetchmerge remote

remote已经前进并且您的local分支也已经前进时,就需要使用变基。在此期间,您无法直接将更改推送到remote。您必须首先执行pull,不仅如此,还要执行pull --rebase以按照从localremote分支创建的每个提交的顺序应用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接