17

git-config文档中有关 pull.rebase 的信息:

拉.rebase

如果为 true,则在获取的分支之上重新设置分支,而不是在运行“git pull”时从默认远程合并默认分支。请参阅“branch..rebase”以在每个分支的基础上进行设置。

注意:这是一个可能很危险的操作;除非您了解其含义,否则不要使用它(有关详细信息,请参阅 git-rebase(1))。

谁能详细描述一下是什么"NOTE: this is a possibly dangerous operation; do not use it unless you understand the implications (see git-rebase(1) for details)"意思?

4

3 回答 3

19

假设您有以下 Git 存储库:

  • 您的私人仓库,位于您的工作计算机上;
  • 您的公共回购you,托管在某处;
  • 一个主要的 repo,origin它是主要的开发树。

你正在做某事并做了两个提交 A 和 B。你将它们发布到你的公共仓库。同时,origin还有另一个提交 Z。

     /-A-B master, you/master
o-o-o
     \-Z origin/master

现在假设一位同事需要您的两次提交才能开始一项新功能。他从您的公共回购中拉出您的分支,并在此基础上进行一些提交。

          /-C-D-E colleague/master
     /-A-B master, you/master
o-o-o
     \-Z origin/master

您现在想要在origin/master. 您从中获取origin并进行变基(相当于git pull --rebasegit pull带有 pull.rebase 选项集)。这会创建两个新的提交。您将它们推送到您的公共回购和origin. 更复杂的是,假设origin在此之后推送了一个新的提交 F。

     /-A-B-C-D-E colleague/master
o-o-o
     \-Z-A'-B'-F master, you/master, origin/master

现在的问题是你的同事有一些基于两个“弃用”提交的工作,并且为了避免进一步的复杂性(合并时的冲突,弄乱历史),他必须将他的分支重新设置在 B' 之上(假设他不想要F)。你需要告诉他这件事,否则他可能不会注意到你做了什么。

            /-C-D-E colleague/master
o-o-o-Z-A'-B'-F master, you/master, origin/master

如果你不告诉他,稍后他会将他的分支合并回原点,历史将如下所示:

     /-A-B-C-D-E
o-o-o           \
     \-Z-A'-B'-F-M colleague/master, origin/master

您有两次 A 和 B 提交,但名称不同。历史变得更难阅读,你遇到可怕的合并冲突。记住这个例子很简单。如果有几十个人在做这个项目,而且origin进展很快,历史很快就会变得一团糟。

如果只有一位同事,那应该没问题。但是如果你不能确切地知道谁从你那里拉了出来,你就不能知道你必须警告谁。在开源开发中尤其如此。

主要规则是:不要对已经发布的提交进行变基。如果 A 和 B 仅在您的私人仓库中,那么变基很好,并且可能是最好的做法,因为它使历史更简单和有意义。只有当分支有充分的理由存在时(例如,功能分支),分歧的历史才有意义。

于 2013-08-08T23:49:40.470 回答
10

Rebase 是一个用于重写提交历史的命令,重写提交会导致它们的 SHA ID 发生变化。重新设置您自己的私人提交,其他人没有基于他们自己的工作(即在其之上进行提交)是好的。

但是,当您重新设置共享公共历史记录时会遇到麻烦,因为拥有您重新设置的旧历史记录的其他人被迫在新历史记录之上同步或重做他们的提交(这可能是一个困难的过程),或者用新的历史来化解旧的历史,必然会产生矛盾。来自官方 Linux Kernel Git 文档rebase

Rebase(或任何其他形式的重写)其他人基于其工作的分支是一个坏主意:它下游的任何人都被迫手动修复他们的历史记录。

因此,除非您确定没有其他人共享您正在变基的那些提交,否则您不应该变基提交。

也就是说,你真的应该学会以交互方式和非交互方式进行变基,因为它是 Git 武器库中最强大和最有效的工具,如果你不知道如何使用它,那么你就没有有效地使用 Git .

您可以从免费的在线 Pro Git 书籍的重写历史部分了解更多关于变基的信息,当然Linux Kernel Git 的官方文档也非常好。rebase

于 2013-08-08T23:37:06.197 回答
1

值得一提的是,“邪恶合并”中的“邪恶改变”可能会在重新定位包含不与其他提交冲突的“邪恶改变”的“邪恶合并”时静默丢失。

于 2017-06-15T04:12:20.457 回答