Git pull.rebase这是一个可能很危险的操作

时间:2013-08-08 23:28:31

标签: git git-rebase git-pull

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

  

pull.rebase

     

如果为true,则rebase在获取的分支顶部分支,   而不是在默认远程时合并默认分支   “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)"的含义吗?

3 个答案:

答案 0 :(得分:16)

假设你有这些Git存储库:

  • 你的私人仓库,坐在你的工作电脑上;
  • 您的公共仓库,you,托管在某处;
  • 主要仓库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获取并使用pull.rebase选项设置一个rebase(相当于git pull --rebasegit pull。 这会创建两个 new 提交。你将它们推送到你的公共仓库和origin。为了进一步复杂化,我们假设新的提交F在此之后被推送到origin

     /-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只在您的私人仓库中,那么变形很好并且可能是最好的事情,因为它使历史更简单且有意义。只有在分支有充分理由存在时(例如特征分支),分歧历史才有意义。

答案 1 :(得分:10)

Rebase是一个用于重写提交历史记录的命令,重写提交会导致其SHA ID发生变化。重新定位你自己的私人提交,没有其他人基于他们自己的工作(即做出提交)很好。

但是,在重新分配共享公共历史记录时会遇到麻烦,因为具有旧历史记录的其他人被迫在新历史记录之上同步或重做其提交(这可能是一个困难的过程) ),或尝试用新的历史解决旧的历史,这肯定会产生冲突。来自official Linux Kernel Git documentation for rebase

  

重新定位(或任何其他形式的重写)其他人根据其工作的分支是一个坏主意:下游的任何人都被迫手动修复其历史记录。

因此,你不应该重新提交提交,除非你确定没有其他人分享那些你正在改变的提交。

也就是说,你应该学会互动和非互动,但是因为它是Git武器库中最强大和最有效的工具,如果你不知道如何使用它,那你就不是有效地使用Git。

您可以从Rewriting Historyfree online Pro Git book部分了解有关变基的更多信息,当然official Linux Kernel Git documentation for rebase也非常出色。

答案 2 :(得分:1)

值得一提的是,来自"evil merge"的“邪恶变化”可能会丢失默默,同时重新定义一个“邪恶的变化”,其中包含一个与之不冲突的“邪恶变化”其他提交。