git:更好的方式为git恢复没有额外的恢复提交

我在远程+本地分支中提交了一个提交,并且我想将该提交从历史记录中删除,并将其中的一部分放入自己的分支中。

基本上,现在我有:

           D---E---F---G master

而且我要:

             E---G topic
            /
           D master

这应该是在我的本地和(只有一个,称为原产地)远程存储库。

哪种方法最简单?

此外,还有其他人已经克隆了回购和检出了主分支。 如果我想在远程回购中做这样的改变,会不会为了让他们进入相同的状态而“扯动”呢?


如果你已经出版过,那么你是对的,你不想重写master的历史。 你想要的是发布一个提交给主,让它回到状态,它在D同时保留其当前的历史,以便其他用户可以轻松地合并或重定义他们的工作。

如果你在将来的某个时刻计划将topic合并到master那么你可能想要做的就是在mastertopic之间建立一个新的公共基础,以便在随后合并topic ,不会丢失提交这是在master回复。 最简单的方法是在'撤销'提交之上进行'重做'提交,将master重置为原始状态,并将新topic分支重新设置为原来的状态。

# checkout master branch (currently at G)
git checkout master

# Reset the index to how we want master to look like
git reset D

# Move the branch pointer back to where it should be, leaving the index
# looking like D
git reset --soft HEAD@{1}

# Make a commit (D') for the head of the master branch
git commit -m "Temporarily revert E, F and G"

# Create the new topic branch based on master.
# We're going to make it on top of master and the 'undo'
# commit to ensure that subsequent merges of master->topic
# or topic->master don't merge in the undo.
git checkout -b topic

# Revert the undo commit, making a redo commit (G').
git revert HEAD

作为另一种选择,你可以让提交E',F'和G'分别重做每个部分,但是因为E,F和G已经在你发布的历史中,所以如果你只是引用'撤销'提交并且说那个可能更容易理解承诺正在被撤消。 无论如何,这就是git revert所做的。

基本上你知道的是这个。

D -- E -- F -- G -- D'      <-- master
                     
                      
                        G'  <-- topic

重要的是你没有重写历史,主题是基于主,因此合并不会意外地应用任何“撤消”提交。 您现在可以安全地将mastertopic推送到远程存储库。


如果您愿意,您可以重写您的历史记录,但如果其他人拥有历史记录副本,这是一个糟糕的主意。 在这种情况下,你可能会使用交互式rebase: git rebase -i master topic 。 这会给你一个从主人到主题的提交列表,并提供关于如何使用它们的提示。 您只需要删除包含要删除的提交的行。

这就是说,我必须强调,如果任何人有这样的历史,这么做是不负责任的。 您必须强制推送到您的中央回购站,而其他人则必须修复其存储库以匹配,可能相对简单或复杂,具体取决于环境。

在git-rebase手册页中有一个很好的部分叫做“从上游rebase恢复”,讨论如何处理这个问题,如果你真的决定这么做的话。

编辑:

对于简单的历史记录,一个常见的情况是,在强制非中央回购( push -f )的非快速推送之后,其他开发者:

  • 备份他们的老主人: git branch -m master master_old
  • 获取更新并从原点重新创建主机: git remote update origin; git branch master origin/master git remote update origin; git branch master origin/master
  • 将所有主题分支重新git rebase --onto master master_old topic到新主人: git rebase --onto master master_old topic
  • 如果他们在他们尚未成立的主分支中工作,他们将不得不变得更有魅力,将这项工作和所有主题分支重新安排到主人的新位置......这应该让你知道为什么它很糟糕重写其他人的历史。 实际上,一旦某物传入公共存储库,您应该将其视为难以记录的历史记录,而不是正在进行的工作。


    我发现git stash很有帮助

    把它藏起来,不要再看它。

    链接地址: http://www.djcxy.com/p/2575.html

    上一篇: git: better way for git revert without additional reverted commit

    下一篇: How do CSS triangles work?