如何将HEAD重置为某个提交而不会丢失Git中的最后一次提交?

时间:2014-12-02 18:11:12

标签: git bitbucket

enter image description here

我的申请中断了。我无法找到错误的位置,我知道它在我做的提交( 2201e03 )时开始破坏。

我不确定如何超越它,所以我决定git reset --hard 619176e将我的应用程序重置回原来的工作位置。

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

然后,我开发了更多,保存,提交,并试图再次推动,我不能。 一旦我做出改变,并试图推动,我得到一条消息告诉我,我落后于7次提交,我应该执行并拉动然后推送。 但我不希望这样。

如果我这样做,我的申请将再次破产。因此,即使我现在支持7次提交。 我真的不想删除那些提交,但我仍然希望从619176e继续前进。

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

我应该使用git reset HEAD^吗?

任何提示建议对我来说都是一个巨大的帮助!!

4 个答案:

答案 0 :(得分:2)

基本问题是你不想丢弃有问题的提交ons master,但这正是git reset --hard 619176e所做的。你确实重置了你的分支(我假设它是分支master),但是你要推送的远程分支仍然指向旧的(错误的)状态,即7提交。

正如Dacotah已经建议的那样,这是分支机构的完美用例。您可以通过619176e从提交git checkout 619176e -b branchname开始创建新分支。然后,您可以引入新的更改,提交并可能推送它们。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我的建议,因为看起来你已经在619176e之后推送了多次提交并且不希望它们被删除,所以进行另一次提交以恢复自619176e以来所做的所有更改

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

git checkout 619176e .

这不会更改您所在的分支或影响现有提交。它只是简单地将您的文件修改为619176e中的文件。

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

其他选项:

  • 根据619176e创建另一个分支。这没问题。虽然很难将该分支整合回主人。

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

    < / LI>

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

答案 3 :(得分:1)

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

git push -F

这应该强制推送到远程并删除自619176e以来的任何提交。这有一些问题。首先,如果你有其他用户,他们可能在历史记录中有不良提交,如果他们推送,那些不良提交将返回到你的回购。其次,如果遥控器中有其他有效的提交,你将失去这些提交。

我建议逐个恢复错误提交,然后如果你想在推送已清理的存储库之前压缩它们(使用交互式rebase)。