2014-12-02 67 views
1

enter image description here如何在不丢失Git中的最后一个提交的情况下将HEAD重置为某个提交?

我的应用程序中断。我找不到错误在哪里,我知道它在我提交的提交(2201e03)处开始中断。

我不知道如何去超过那个,所以我决定做git reset --hard 619176e重置我的应用程序回到它曾经工作的地方。

现在工作。我收到了消息“HEAD现在在619176e修复了CD创建和编辑中的UI”,我的应用程序现在也回来了。很好!

然后,我开发了一些,保存,提交,并试图再次推动,我不能。 只要我进行修改并尝试推送,我收到一条消息告诉我,我落后了7次提交,而且我应该执行并拉出然后按下PUSH。 但我不想那样。

如果我这样做,我的应用程序将再次打破。因此,即使我现在落后于7次提交。 我真的不想删除那些提交,但我仍然想从619176e前进。

我该怎么办?如果我想保留这7个提交并强制git认为619176e是我的HEAD或MASTER?并从这里继续前进?

我应该用git reset HEAD^吗?

任何提示建议将是我的巨大帮助!

+0

对于它的价值,'git reset HEAD ^'不是你正在寻找的东西,因为它实质上是“不提交”最后一次提交而不放弃提交的提交更改。 – 2014-12-02 22:52:22

回答

1

在这种情况下,我可能会分支我的代码,一旦我回去几次提交。我不确定这是否是一种最佳做法,但它是一种潜在的修复方法。一个分支的代码是git checkout -b BranchName

+0

我对git很陌生,所以我想说我创建了一个新的分支,我最终将它与我的主人合并了吗?所以当这种情况发生时,我的应用程序会再次中断吗请稍微澄清一点。 – iori 2014-12-02 18:20:08

+0

我也是一种新的,所以这就是为什么我不知道这是否是最佳做法。如果您打算将其与主人合并,那么您可能会遇到问题。如果这个新的分支是你想成为主人(因为它工作),那么你应该参考http://stackoverflow.com/questions/2763006/change-the-current-branch-to-master-in-git一个解释。这样做可以让你在保留一个正确的主分支的同时,保留引用的破解代码 – Dacotah 2014-12-02 18:27:34

2

最基本的问题是,你不想扔掉错误的提交主人,但这正是git reset --hard 619176e所做的。您确实重置了您的分支(我假设它是分支master),但您推送的远程分支仍指向旧(错误)状态,即提前7次提交。

正如达科塔已经提出的,这是一个分支的完美用例。您可以通过git checkout 619176e -b branchname从承诺619176e开始创建新分支。然后,您可以引入新的更改,提交并可能推送它们。

只要您想将master上的工作与其上的错误重新整合,您就必须决定要使用哪部分工作以及哪部分工作不使用。您也可以修复master上的错误。您可以将这些更改提交到master,然后您可以合并分支或在主控制器上重新绑定新分支。

0

我的建议,因为它似乎你已经被推多次提交后619176e掌握,不希望将其删除,是再拍提交后归还,因为619176e所做的所有更改。

首先更改工作目录的状态以匹配619176e。

git checkout 619176e .

这不会改变你的分支或影响现有的提交。它只是修改你的文件,就像他们在619176e一样。

然后用git commit进行新的提交。

其他选项:

  • 制作基于关闭619176e的另一个分支。这工作正常。尽管如此,将分支集成到主控中将很困难。

  • 使619176e主(即git reset --hard 619176e)和强制推。如果你已经分享了主人,这可能会导致合作者对你生气。如果你还没有共享主人,这可能是一个不错的选择,并会给你一个更清晰的历史,但如果你不想失去你的七个提交,你最好先保存对它们的引用。

正如人们经常指出的那样,它一般不重新写你的主分支的历史是一个好主意(主要的例外是当你没有共享的主与任何人还)。如果您执行git reset --hard 619176e并添加更多提交,那么您将通过用新提交替换已损坏的提交来重写主分支的历史记录。硬重置本质上只是将您的主分支指向指定的提交。

1

我要告诉你的是非常危险的。如果你使用:

git push -F 

这应该强制推送到远程并删除自619176e以来的任何提交。这有几个问题。首先,如果你有其他用户,他们的历史可能会有不好的承诺,如果他们推动,那些不好的承诺会回到你的回购。其次,如果在远程中有其他有效的提交,则会失去这些提交。

我建议一个接一个地恢复坏提交,然后在推送已清理的存储库之前,如果要压缩它们(使用交互式转置)。

+1

你的意思是'git push -f'?我在'git-push'手册中看不到'-F' – ComputerDruid 2014-12-02 23:37:55

相关问题