我在远程+本地分支中提交了一个提交,我希望将该提交从历史记录中删除,并将其中一些提交到自己的分支中。
基本上,我现在有:
D---E---F---G master
我想要:
E---G topic
/
D master
这应该是我的本地和(只有一个,称为原点)远程存储库。
哪种方法最干净?
此外,还有其他人克隆了该回购并且已经检查了主分支。如果我在远程仓库中进行这样的改变,那么'git pull'会让他们也能够进入同一个状态吗?
答案 0 :(得分:7)
如果您已发布,则表示您不想重写master
的历史记录。你想要的是发布一个提交给master,它将它恢复到D
所处的状态,同时保留其当前历史记录,以便其他用户可以轻松地合并或改变他们的工作。
如果您计划在将来某个时候将topic
合并到master
,那么您可能还想做的是在master
和{{1}之间建立一个新的共同基础因此,当您随后合并topic
时,您不会丢失在topic
中恢复的提交。最简单的方法是在“撤销”提交之上进行“重做”提交,将master
重置为原始状态,并将新的master
分支置于其上。< / p>
topic
作为替代方案,你可以让提交E',F'和G'分别重做每个部分但是因为E,F和G已经在你发布的历史中,如果你只是引用'undo'提交,那么它可能更容易理解。说这项承诺正在撤消。无论如何,这就是# 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
的作用。
基本上你知道的就是这个。
git revert
重要的是你没有重写历史记录,主题是基于master的,所以合并不会意外地应用任何“撤销”提交。您现在可以安全地将D -- E -- F -- G -- D' <-- master
\
\
G' <-- topic
和master
同时推送到远程存储库。
答案 1 :(得分:4)
如果您愿意,可以重写您的历史记录,但如果其他人拥有历史记录副本,那么这是一个坏主意。在这种情况下,您可能会使用交互式rebase:git rebase -i master topic
。这将为您提供从主人到主题的提交列表,以及有关如何使用它们的提示。您只需要删除包含要删除的提交的行。
那就是说,我必须强调,如果其他人有这段历史,这样做是不负责任的。您必须强制将其推送到您的中央仓库,其他所有人都必须修复其存储库以匹配,根据具体情况可能相对简单或复杂。
如果您真的愿意,可以在git-rebase man page中讨论如何处理这个问题的“从上游rebase恢复”这个很好的部分。
编辑:
对于简单的历史记录,一个常见的情况是,在强制非快速推送到中央仓库(push -f
)后,其他开发人员:
git branch -m master master_old
git remote update origin; git branch master origin/master
git rebase --onto master master_old topic
如果他们已经在他们的主分支中工作了,那么他们将不得不变得更加漂亮,将这项工作和所有主题分支到主人的新职位......这个应该让你知道为什么重写其他人的历史是如此可怕。实际上,一旦某些内容传递到公共存储库,您应该将其视为难以记录的历史记录,而不是正在进行的工作。
答案 2 :(得分:-3)
我发现git stash
非常有用
将它藏起来,再也不要再看它了。