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

use*_*855 41 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)
Run Code Online (Sandbox Code Playgroud)

rad*_*tek 48

这是你可以做的:

git checkout <branch-to-modify-head>
git reset --hard <commit-hash-id-to-put-as-head>
git push -f
Run Code Online (Sandbox Code Playgroud)

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

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

git revert commit-id
Run Code Online (Sandbox Code Playgroud)

干杯

  • 如果在 git push -f 之后,您在 &lt;commit-hash&gt; 处的分离 HEAD 处“卡住”,只需执行 git checkout &lt;branch&gt; 即可再次附加分支 HEAD。 (3认同)

mea*_*gar 14

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

  • -1:`git push -f`并没有真正与"安全"结合在一起...我建议你要么澄清陷阱,要么把措辞改为"小心" - 相反的含义. (9认同)
  • @ANeves我支持我的措辞.如果您是唯一使用存储库的人,则完全安全.他声明的意图是用他的本地工作*覆盖原籍分支的现有状态.这完全是*git push -f`的目的. (3认同)
  • 我同意,看起来他只需要一个“push -f”。 (2认同)
  • 我同意这是 `git push -f` 的目的,并且它是这种情况下的解决方案。但是我不同意“安全地”这个措辞,因为`-f` 是破坏性的,并且在使用`-f` 时恢复事故对于甚至不知道`-f` 的人来说可能非常困难。(根据过去的经验...)我想这只是编写和建议方式的问题;也许我太坚强了。 (2认同)
  • @searchengine27 实际上我是未来的“Google 搜索者”(实际上我是 Duck Duck Go 搜索者,所以“Google 搜索”不是一个好用的术语),我发现这个答案非常相关,并考虑包含警告 - 我我是唯一的用户,所以我认为这对于我的情况来说是一个很好的解决方案。更多细节并不总是更好——简洁更好。meagar 特别说“如果你的存储库没有被其他人使用......”你还需要什么警告? (2认同)

Mik*_*icz 8

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

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

---A-B < HEAD (bad)
    \
     C < my_branch (good)
Run Code Online (Sandbox Code Playgroud)

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

回顾一下,

git checkout my_branch
git merge -s ours HEAD
Run Code Online (Sandbox Code Playgroud)

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

--A-B-D < HEAD, my_branch (both good)
   \ /
    C
Run Code Online (Sandbox Code Playgroud)

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


igr*_*nus 7

唯一对我有用的东西:

git checkout <OLD_COMMIT>
git branch temp
git checkout temp
git branch -f master temp
git checkout master
git branch -d temp
Run Code Online (Sandbox Code Playgroud)


Ele*_*ena 5

我这样做的方式是:

git reset --hard <commit-SHA>
git push origin HEAD:<name-of-remote-branch>
Run Code Online (Sandbox Code Playgroud)

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