变基,变基推送提交是什么意思


Answers:


80

ProGit本书有一个很好的解释

您的问题的具体答案可以在标题为“变基的危险 ”的部分中找到。该部分的引言:

在对内容进行基础调整时,您将放弃现有的提交并创建相似但不同的新提交。如果您将提交推送到某个地方,而其他人则将其拉下并在其上进行工作,然后使用git rebase重写这些提交,然后再次将其上推,那么您的协作者将不得不重新合并其工作,并且当您尝试执行以下操作时,事情会变得混乱将他们的工作拉回到您的工作中。

更新:
根据下面的评论,听起来您的Git工作流程有困难。以下是一些可能有用的参考:


感谢您的解释。因此,为了使我的理解更加清楚,在我进行了某些更改之后,我不应该使用git rebase(--interactive?)重写该历史记录,这肯定是失败的秘诀。另一方面,如果我将主题的某些更改重新建立基础分支(来自分支X)并推送它,这是完全正常的,以在另一位开发人员更改主题分支后再次重新设置基础。本质上,我已经使用merge了一段时间,但我们与darwinweb.net/articles/86处于同一条船上,历史几乎无法使用。
Hemant Kumar 2010年

@Hemant:在推送到公共回购协议后,重新部署bass通常是一个坏主意。话虽如此,如果您的工作流程与他们的工作类似,您引用的darwinweb文章中的建议就很合理。请参阅我更新的回复,以获得其他可能有用的参考文献列表。
Tim Henigan'4

请更新的链接,关于“私人管理团队”,“ProGit”页面git-scm.com/book/en/...
Eimantas

因此,从技术上讲,git commits保持不变,但是“放弃现有提交并创建相似但不同的新提交”只是具有不同sha1 id的同一提交?好吧,这将是我思考为什么合作者必须重新合并自己的工作的唯一显而易见的方法!
Ciasto piekarz

@Ciastopiekarz,这是因为您要在上游存储库中重写历史记录,而其他开发人员的本地存储库可能具有指向该记录的指针。现在它们的指针已经过时了:git客户端别无选择,只能使用较旧的指针,并依靠人类来处理其余的指针。这是重新合并,并且很多混乱的更改必须手动进行清理,可能会非常混乱!因此,建议不要对任何已经推送到上游存储库的内容进行重新存储。这是一个很好的建议,除非您是一个知识渊博的专家,否则不应忽略它。
福宾

240

要了解这一点,我们需要对git的工作原理有所了解。git存储库是一种树结构,其中树的节点是提交。这是一个非常简单的存储库的示例: 当你叉

它在master分支上有四个提交,每个提交都有一个ID(在本例中为a,b,c和d)。您会注意到d当前是master分支的最新提交(或HEAD)。 在此处输入图片说明

在这里,我们有两个分支:master和my-branch。您可以看到master和my-branch都包含提交a和b,但是它们开始偏离:master包含c和d,而my-branch包含e和f。与master相比,b是my-branch的“合并基础”,或更常见的是,仅仅是“基础”。这很有意义:您可以看到my-branch是基于master的早期版本的。

假设我的分支已经过时,并且您想使用最新版本的master来更新它。换句话说,我的分支需要包含c和d。您可以进行合并,但是这会导致分支包含奇怪的合并提交,这使得审查请求请求变得更加困难。相反,您可以重新设置基准。

在此处输入图片说明

重新确定基准时,git查找分支的基准(在本例中为b),找到该基准与HEAD之间的所有提交(在本例中为e和f),然后在分支的HEAD上重新播放这些提交。您将基于此(在本例中为master)。Git实际上创建了新的提交,它们代表您的更改在master上的外观:在图中,这些提交称为e'和f'。Git不会删除您以前的提交:e和f保持不变,如果重新设置发生问题,则可以恢复到以前的状态。

当许多不同的人模拟地在一个项目上工作时,拉取请求很快就会过时。“过时的”拉取请求已不再是最新的开发主线,并且需要先进行更新,然后才能合并到项目中。拉取请求过时的最常见原因是由于冲突:如果两个拉取请求都修改了同一文件中的相似行,并且一个拉取请求被合并,则未合并的拉取请求现在将发生冲突。有时,拉取请求会过时而不会发生冲突:也许代码库中不同文件的更改需要对拉取请求进行相应的更改以符合新的体系结构,或者可能是当某人意外合并失败的单元测试到分支时创建了分支。主分支。不管什么原因


68

变基重写历史记录。如果没有人知道那段历史,那完全可以。但是,如果该历史是众所周知的,那么在Git中重写历史就像在现实世界中那样工作:您需要一个阴谋。

串谋确实很难保持在一起,因此您最好首先避免改组公共分支机构。

请注意,成功的阴谋的例子:puJUNIO C.滨野的git仓库的分支(Git的SCM的官方资料库)经常重订。这种工作方式是,几乎所有使用过pu的人也都订阅了Git开发人员邮件列表,并且pu分支机构已改组的事实在邮件列表和Git网站上广泛宣传。


4
+1。我认为pugit.git 的分支是一个非常有用的示例,说明了如何在(公共)工作流程中使用rebase。对于不熟悉它的人,通常的想法是重新整理没有提交的主题分支next(在合并到master之前是不稳定的分支),然后pu通过重置为next并合并所有主题分支来重建分支。(来源:文档/ HOWTO /保持-git.txt git.kernel.org/?p=git​​/git.git;a=blob;f=Documentation/howto/...
Cascabel

25
+1表示“在Git中重写历史就像在现实世界中一样:您需要阴谋”
Sleeper Smith

“如上所述,由于pu是一个废弃的分支机构,因此无需进行公告。” git-scm.com/docs/gitworkflows 我们在工作中做类似的事情,“ TEMP-something-latest”是一个废弃分支,它是最新更改的组合,它可以是多个功能分支的合并,可以删除并在任何时间点重新创建,因此不应继续开发。
皮尔奇

6

重新设置将更改存储库的历史记录。如果您将提交推向世界,即将其提供给其他人使用,然后您更改了提交历史的视图,那么与拥有您的旧历史的任何人一起工作将变得很困难。

我认为,认为有害的Rebase是一个很好的概述。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.