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

Git pull.rebase这可能是一个危险的操作,git,git-rebase,git-pull,Git,Git Rebase,Git Pull,在文档中,有关pull.rebase的信息如下: 拉回基础 如果为true,则在获取的分支上重新设置分支的基础, 而不是在以下情况下合并来自默认远程的默认分支: “git pull”正在运行。请参阅“分支..重基”以了解如何在 以分行为基础 注意:这可能是一个危险的操作;除非你愿意,否则不要使用它 理解其含义(有关详细信息,请参见git rebase(1)) 有人能详细描述一下什么是“注意:这可能是一个危险的操作;除非您理解其含义(请参阅git rebase(1)了解详细信息)”的意思吗?reb

在文档中,有关pull.rebase的信息如下:

拉回基础

如果为true,则在获取的分支上重新设置分支的基础, 而不是在以下情况下合并来自默认远程的默认分支: “git pull”正在运行。请参阅“分支..重基”以了解如何在 以分行为基础

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


有人能详细描述一下什么是
“注意:这可能是一个危险的操作;除非您理解其含义(请参阅git rebase(1)了解详细信息)”
的意思吗?

rebase是一个用于重写提交历史记录的命令,重写提交会导致其SHA ID发生更改。重定您自己的私人承诺,其他人没有基于他们自己的工作(即在上面进行承诺)是可以的

但是,当您重新设置共享公共历史的基础时,您会遇到麻烦,因为具有您重新设置基础的旧历史的其他人被迫在新历史的基础上同步或重做他们的承诺(这可能是一个困难的过程),或者尝试用新历史解决旧历史,这肯定会产生冲突。从:

对其他人基于其工作的分支进行重定基址(或任何其他形式的重写)是一个坏主意:该分支下游的任何人都必须手动修复其历史记录

因此,除非您确定没有其他人共享您正在重定基址的提交,否则不应重定基址

也就是说,您应该真正学会重新设置基址,无论是以交互方式还是以非交互方式,因为它是Git武库中最强大、最有效的工具,如果您不知道如何使用它,那么您就不能有效地使用Git


您可以从的部分了解有关重定基址的更多信息,当然也很好。

假设您有以下Git存储库:

  • 你的私人回购,坐在你的工作电脑上
  • 您的公共回购,
    ,托管在某个地方
  • 主回购协议,
    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选项的
git pull--rebase
git pull
)。 这将创建两个新提交。您可以将它们推送到公共回购协议和
来源
。为了使事情进一步复杂化,我们假设在此之后将一个新的commit 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只存在于你的私人回购中,那么重定基期是可以的,而且可能是最好的做法,因为它使历史变得简单而有意义。只有当分支有很好的理由存在时(例如,功能分支),发散历史才有意义。

值得一提的是,在对包含与其他提交不冲突的“邪恶更改”的“邪恶合并”进行重定基址时,来自分支的“邪恶更改”可以无声地丢失

您的团队中是否有人会直接从您的存储库副本中提取更改(而不是每个人都推送到的中心副本)?Gareth,我们在公司中使用该流程,因为我们只有一个存储库,并且不支持GitHub中的“forks”之类的内容。感谢Cupcake,文档中对所有内容都进行了完美的描述,我只是想弄明白,在文档中是否有任何未写的关于重定基址的隐藏技巧。我试图解决的问题是,使用常规的
pull
在回购中有很多不必要的合并提交,
--rebase
选项很有帮助,但开发人员总是忘记使用它,所以我寻求一些自动方式,但我意识到这是危险的。根据您的工作流程,也有可能,
rebase
永远不会有危险。如果您的开发人员总是从同一个“中心”存储库中推送和获取,并且不在其他任何地方发布其提交或彼此获取,那么您可以设置“pull.rebase”:重定基础的提交将始终是尚未发布的提交。然后,如果你总是做git pull--rebase,你就安全了?如果你只与一个远程回购进行交互:是的,这可能是IMHO的最佳实践。如果您有多个remote,那么就没有了,您必须小心哪些提交已经被推到了某个地方,并且可能会被
拉--rebase
重新设置基址