78

我仍在尝试学习 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)
4

8 回答 8

99

这是您可以执行的操作:

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

如果你不强制推送,git 会抛出这个错误:Updates were denied because the tip of your current branch is behind。

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

git revert commit-id

干杯

于 2014-11-30T05:30:18.233 回答
28

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

于 2012-12-19T16:01:19.333 回答
19

我这样做的方式是:

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

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

于 2016-01-20T12:55:25.673 回答
11

唯一对我有用的东西:

git checkout <OLD_COMMIT>
git branch temp
git checkout temp
git branch -f master temp
git checkout master
git branch -d temp
于 2019-01-13T23:17:52.257 回答
9

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

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

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

这有您想要的解决方案: 我如何“覆盖”而不是“合并”Git 中另一个分支上的一个分支?

回顾一下,

git checkout my_branch
git merge -s ours HEAD

这将消除 HEAD 分支上的所有更改,并为您提供以下信息:

--A-B-D < HEAD, my_branch (both good)
   \ /
    C

在这种情况下,D 实际上与 C 相同,只是具有不同的父级。

于 2012-12-20T01:39:00.270 回答
4

对于我们这些在受保护分支上工作的人来说, push -f 不是一个选项。

反而:

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

如果您有更改想要合并到新版本的 HEAD 中,例如 OP,我会先备份它们,更正远程存储库,然后应用更改。

这也保留了您的回购历史。

于 2019-02-07T11:42:40.477 回答
3

我参加聚会有点晚了-我必须这样做:

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

请在执行此命令之前先阅读文档。

于 2018-06-15T08:58:41.760 回答
2

对我来说完美的步骤如下 -

1) git log --oneline

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

3) git checkout (这是你希望你的工作回滚到的提交 id)

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

5)就是这样:)

于 2019-11-07T21:20:29.997 回答