我还在努力学习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)
答案 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)就这样:)