在使用远程代码库时,您有合并和变基的选项,但是在阅读了相关资料之后,我无法弄清楚为什么或何时使用变基。总体而言,似乎合并是更好的选择,即使它们都有优缺点。我只能想到合并是必须的情况。因此,我想知道何时使用变基更好。
在使用远程代码库时,您有合并和变基的选项,但是在阅读了相关资料之后,我无法弄清楚为什么或何时使用变基。总体而言,似乎合并是更好的选择,即使它们都有优缺点。我只能想到合并是必须的情况。因此,我想知道何时使用变基更好。
--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
# 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
--rebase
进行获取和变基(rebase),或者通过pull.rebase = merges
将其设置为默认值。除了@Schwern提到的技术细节之外 -
合并和变基是两种不同的用例,不能将它们进行比较。
例如 -
当您执行git pull
时,您实际上是在local
分支中执行fetch
和merge
remote
。
当remote
已经前进并且您的local
分支也已经前进时,就需要使用变基。在此期间,您无法直接将更改推送到remote
。您必须首先执行pull
,不仅如此,还要执行pull --rebase
以按照从local
和remote
分支创建的每个提交的顺序应用它们。