重新激活和通过重新分配推动提交是什么意思

人们经常说,你不应该改变你已经推动的提交。 这可能是什么意思?

ProGit的书有一个很好的解释 。

您的问题的具体答案可以在标题为“ 重新贴现的危险 ”一节中find。 该部分的引用:

当你重新编写代码时,你将放弃现有的提交并创build类似但不同的新代码。 如果你在某个地方推提交,然后把其他人提交,然后你用git rebase重写这些提交,然后再推它们,你的合作者将不得不重新合并他们的工作,当你尝试把他们的工作拖回你的工作。

更新:
根据你的评论,这听起来像你的Git工作stream程有困难。 以下是一些可能有所帮助的参考:

  • gitworkflows手册页:请参阅“向上合并”和“主题分支”
  • ProGit:请参阅“ 私人pipe理团队 ”
  • Jarrod Spillers博客:请参阅“ git merge vs git rebase:避开Rebase Hell ”

为了理解这一点,我们需要了解一下git是如何工作的。 一个git仓库是一个树结构,其中树的节点是提交。 这是一个非常简单的存储库的例子: 当你分叉时

它在主分支上有四个提交,每个提交都有一个ID(在这种情况下,a,b,c和d)。 你会注意到d是当前主分支的最新提交(或HEAD)。 在这里输入图像说明

在这里,我们有两个分支:主人和我的分支。 你可以看到master和my-branch都包含提交a和b,但是然后他们开始发散:master包含c和d,而my-branch包含e和f。 b被认为是我的分支的“合并基础”,相对于主 – 或者更普遍的说,就是“基础”。 这是有道理的:你可以看到我的分支是基于以前版本的主。

所以我们假设我的分支已经过时了,而且你想把它和最新版本的master一起更新。 换句话说,我的分支需要包含c和d。 你可以做一个合并,但是这会导致分支包含奇怪的合并提交,这使得审查拉请求变得更加困难。 相反,你可以做一个rebase。

在这里输入图像说明

当你rebase,gitfind你的分支(在这种情况下,b)的基地,find所有提交之间的基地和HEAD(在这种情况下,e和f),并重新播放这些提交分支的头部你正在重拾(在这种情况下,主)。 Git实际上创build了一些新的提交,它们代表了你在master上面的变化:在图中,这些提交被称为e'和f'。 Git并没有抹掉你以前的提交:e和f是保持不变的,如果rebase有什么问题,你可以直接回到以前的样子。

当许多不同的人在模拟一个项目时,拉取请求可能会很快失效。 一个“陈旧”的请求是一个不再与开发主线保持一致的请求,在它被合并到项目之前需要更新。 拉请求过期的最常见的原因是由于冲突:如果两个pull请求都修改同一个文件中的相似的行,并且一个pull请求被合并,那么未合并的pull请求将会发生冲突。 有时候,pull请求可能会过时而不会发生冲突:代码库中不同文件的更改可能需要对pull请求进行相应的更改以符合新的体系结构,或者当某人意外地将失败的unit testing合并到主分支。 不pipe原因如何,如果您的pull请求已经过时,您需要将分支重新绑定到最新版本的master分支,然后才能合并。

重新激活重写历史logging。 如果没有人知道这个历史,那就完全没问题。 但是,如果这个历史是公开的,那么在Git中重写历史就像在现实世界中一样:你需要一个阴谋。

阴谋真的很难保持在一起,所以你最好避免重新启动公共分支机构。

请注意,有一些成功的阴谋的例子:Junio C. Hamano的git仓库(Git SCM的官方仓库)的pu分支经常被重新devise。 这样做的方式是,几乎所有使用pu的人也都订阅了Git开发者邮件列表,并且pu分支被重新devise的事实在邮件列表和Git网站上被广泛公开。

rebase改变你的仓库的历史。 如果你把提交信息推给世界,也就是让提交给其他人,然后你改变了对提交历史的看法,那么与任何有你的历史的人一起工作就变得困难了。

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