2012-07-29 130 views
2

我知道Git有大量的文档,并且有很多关于它的文章(例如,我看过How to delete a 'git commit'this),但没有任何工作,但我不确定在这里做什么。在Git中删除/还原合并

我有一个回购,到目前为止只有我承诺,但我最近开始从两个不同的笔记本电脑工作,不知何故我不小心推动了一些Git看到的合并,然后我推动了最新的变化。

我一直在试图弄清楚如何彻底删除最后2次提交,将回购卷回到命运之日前的状态(因为我现在有一堆新提交,我需要进入该回购)。如果您愿意给我任何指示,请注意,回购托管在github here上。

+2

你见过[这个问题](http://stackoverflow.com/q/448919/912144)? – Shahbaz 2012-07-29 21:25:34

+0

是否有任何合并代表错误的原因?如果您在两台不同的机器上进行并发更改,则合并可以说是正确的代表。 – cdhowie 2012-07-29 21:25:47

+0

@cdhowie:许多人喜欢合并,以便在历史中具有实际的语义含义。 OP可能更喜欢rebase。 – 2012-07-29 21:26:34

回答

1

为了删除最近的提交,只需使用git reset --hard HEAD^。如果最近的提交是合并,则这将返回到第一个父代(即运行merge/pull之前的状态)。

如果您可以确定您希望成为分支机构提示的确切提交,则可以使用git reset --hard $SHA,其中$SHA是有问题的提交。

+0

感谢您回复Kevin。我仍然无法完成它的工作。 'git reset --hard HEAD ^^'后我该怎么办? – rsaw 2012-07-29 22:24:21

0

这为我工作(由内存):

git reset --hard HEAD^^ 
git push --force HEAD:master 
git pull 
+0

感谢您抽出时间@shkschneider,但我必须错过关于该命令的一些信息 - ssh似乎认为'HEAD'是一个主机名。 – rsaw 2012-07-29 22:25:36

+0

奇怪...然后尝试'git push --force HEAD ^^:master; git reset --hard HEAD ^^; git pull' – shkschneider 2012-07-30 08:22:44

+1

应该是'git push --force origin master'。您已将主设备重置为本地所需的提交。现在你必须强制推送新的主引用到远程(通常称为起源)。 – patthoyts 2012-08-07 07:52:45

2

新的人,最容易做的事,而不是git reset --hard HEAD^,是使用gitk --all。

这样你可以看到你所有的历史。当前分支以粗体显示。您可以右键单击之前提交的提交,然后选择“在此重置当前分支”。系统会提示您执行什么类型的重置。选择“硬”,你应该回到你想要的位置。

+0

从来没有听说过'gitk'。将检查出来。感谢Adam。 – rsaw 2012-07-30 04:51:05

0

由于an answer在沙赫巴兹贴的问题,我最初试图

git push -f origin HEAD^^:master 

这似乎完全除去最后两次提交。但是,一旦我对本地文件进行了一些更改并且进行了推送,旧的提交就显示出来了! :(

HEAD^^^再次尝试,这一次(因为我现在需要删除最后3个提交)后,我看着git log,看到的一切仍然存在本地。无知至于如何解决这个问题,我只删除本地目录,重新克隆回购,并手动复制到我新修改的文​​件中。最后,添加和推送没有带回旧的不需要的提交。更好的方法,但是我无法通过遵循可爱的人们的建议来实现它(例如:我试图做git rebase -i HEAD~4,但我不明白我在编辑器中得到的输出 - 它让路太多了( 9),我不知道该怎么办。)

我会把它留给更有经验的人来决定是否应该删除这个问题作为重复。