git:更好的方式为git恢复没有额外的恢复提交
我在远程+本地分支中提交了一个提交,并且我想将该提交从历史记录中删除,并将其中的一部分放入自己的分支中。
基本上,现在我有:
D---E---F---G master
而且我要:
E---G topic
/
D master
这应该是在我的本地和(只有一个,称为原产地)远程存储库。
哪种方法最简单?
此外,还有其他人已经克隆了回购和检出了主分支。 如果我想在远程回购中做这样的改变,会不会为了让他们进入相同的状态而“扯动”呢?
如果你已经出版过,那么你是对的,你不想重写master
的历史。 你想要的是发布一个提交给主,让它回到状态,它在D
同时保留其当前的历史,以便其他用户可以轻松地合并或重定义他们的工作。
如果你在将来的某个时刻计划将topic
合并到master
那么你可能想要做的就是在master
和topic
之间建立一个新的公共基础,以便在随后合并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
重要的是你没有重写历史,主题是基于主,因此合并不会意外地应用任何“撤消”提交。 您现在可以安全地将master
和topic
推送到远程存储库。
如果您愿意,您可以重写您的历史记录,但如果其他人拥有历史记录副本,这是一个糟糕的主意。 在这种情况下,你可能会使用交互式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