如何在Git中创建一个较旧的提交HEAD?

时间:2012-12-19 15:57:19

标签: git

我还在努力学习Git的(基本?)细节,并设法让自己陷入困境。我意识到我在HEAD上犯了一些错误,检查了一个较旧的提交并从那里开始编码。当我尝试推送时,我被告知我当前的提交已落后,我需要与HEAD合并。 Git建议“git pull”。但是,HEAD有我想忽略的代码。我该如何解决这个问题?非常感谢你的帮助。

流程图:

-------- HEAD (bad) ---------------------- + (behind conflict, requires
     \                                    /   merge with HEAD, which is
      \------- Current commit (good) ----/    bad and needs to be ignored)

8 个答案:

答案 0 :(得分:35)

以下是您可以做的事情:

git checkout <branch-to-modify-head>
git reset --hard <commit-hash-id-to-put-as-head>
git push -f

如果您不强制推送,git将抛出此错误:更新被拒绝,因为您当前分支的提示落后。

请注意,这会篡改您的git历史记录,因此另一种方法是还原您不想要的每个提交。这样你就可以保留你的历史:

git revert commit-id

干杯

答案 1 :(得分:11)

如果您的存储库未被其他人使用,您可以安全地git push -f覆盖远程分支。

答案 2 :(得分:4)

ANeves是对的,“git push -f”仅适用,因为您是唯一使用该存储库的人。对大多数人来说,这不是一个可以接受的解决方案。

这是您当前的提交历史记录:

---A-B < HEAD (bad)
    \
     C < my_branch (good)

这有你想要的解决方案: How do I 'overwrite', rather than 'merge', a branch on another branch in Git?

回顾一下,

git checkout my_branch
git merge -s ours HEAD

这将踩踏HEAD分支上的所有更改,并为您提供以下内容:

--A-B-D < HEAD, my_branch (both good)
   \ /
    C
在这种情况下,D实际上与C相同,它只有不同的父母。

答案 3 :(得分:4)

我这样做的方式是:

git reset --hard <commit-SHA>
git push origin HEAD:<name-of-remote-branch>

这是git推荐的方式,git push -f对开发团队中的其他人来说可能有点问题

答案 4 :(得分:2)

我参加派对有点晚了 - 我必须这样做:

git push -f origin HEAD:<name-of-branch>

答案 5 :(得分:2)

唯一对我有用的东西

git checkout <OLD_COMMIT>
git branch temp
git checkout temp
git branch -f master temp
git checkout master
git branch -d temp

答案 6 :(得分:1)

对于在受保护的分支上工作的我们来说,push -f是不可行的。

相反:

Checkout HEAD
diff {hash of desired commit to use as new HEAD} > myChange.patch
git apply 
commit 
push

如果您希望将更改合并到OP等新版本的HEAD中,我将首先对其进行备份,更正远程仓库,然后应用更改。

这还将保留您的回购历史记录。

答案 7 :(得分:0)

最适合我的步骤如下-

1)git log --oneline

2)获取要回滚的提交(最有可能是在HEAD上一次提交并推送之前的提交)

3)git checkout(这是您要将工作回滚到的提交ID)

4)git push -f origin HEAD:master(-f将强制推翻覆盖如果push分支位于远程后面会发生的任何拒绝) HEAD:master(这是为了确保您将回滚推送到远程分支的HEAD的master分支)

5)就这样:)