Git - 如何回滚

3
我知道这个问题以前已经被问过了,虽然给出的答案 git reset --hard HEAD~1 有效,但是我无法将其推送到服务器,因为服务器比我本地版本更新。显然,拉取代码会把我拉回到原来的状态。
我该如何重置服务器?

1
使用 git revert 命令并推送。 - Mali
3
必须公告:推送重写历史的更改被认为是"反社会的"。Git之所以让你这样做,只是出于善意,而不是因为它是个好主意。 - millimoose
对的。那么,有谁知道如何回滚吗?难道这不是源代码控制的目的,来撤销你的错误吗? - Luke Puplett
2
很遗憾,git的关键是主要用于本地仓库。因此,如果有人在你重写历史之前拉取了远程代码(即:你推送HEAD~1但已有同事拥有HEAD),他将不得不自己推送并重写历史,从而重新引入你所撤销的更改。因此,请不要使用git reset --hard HEAD~1 && git push --force,而是手动重置(逐个重新引入更改,然后git push)。 - ThanksForAllTheFish
明白了。完全理解 - git revert 是我现在认为的正确方式。如果Git的设计围绕场景有一个用户体验团队,生活将会多么美好啊。 - Luke Puplett
3个回答

5
这完全取决于项目的惯例。安全起见,使用git revert,因为如果这是该政策,您随时可以放弃提交。如果要还原合并,则需要使用git revert --mainline <parent-number>指定要还原到哪个父级(“主线”)。
您应该询问项目维护者解释在您特定情况下该怎么做。
在我们的团队中,我们使用以下一组规则:
  • 只使用rebase拉取(branch.autosetuprebase=always
  • master是唯一的“公共”分支
  • 即使将开发分支推送到共享服务器,它们仍保持“私有”状态
这意味着每个人都可以自由地在其私有分支上进行操作,您可以根据自己的意愿重新设置基础或删除提交。另一方面,我们的共享服务器被配置为拒绝对主分支的强制推送。
这并不意味着我们永远不会重置主分支,有时(可能每年一次)某人可能会意外推送合并,我们认为这会严重破坏我们的历史记录。在这些特殊情况下,我们的Git专家之一会向整个团队编写一封电子邮件,解释即将发生的事情以及更新本地克隆所需采取的步骤。

3
您想要“强制”推送。只有在您确定更改时才使用此选项。
git push origin --force

这个方法是可行的,但如果其他人已经拉取了历史记录怎么办?他将无法推送而不进行重写。 - ThanksForAllTheFish
@mardavi没错 - 另一个人可以“挑选”他们的提交 - 或许值得研究一下。为什么不直接创建另一个提交来修复你想要移除的更改,这样你的朋友就不需要这样做了。 - Oliver Atkinson
Oliver的答案立即解决了问题,尽管请看一下VonC的答案,因为它反映了我本该做的事情。 - Luke Puplett

2

如果你的同事接受将他们自己的本地分支重置为新的 origin/master(假设我们正在谈论该“master”分支),那么强制推送是一种选项。

git fetch
git reset origin/master

(不要使用 reset --hard,因为这会清除正在进行中的工作和私人文件)
(请注意,它将取消之前已添加到索引的内容)


另一个选择是“撤消您的错误”(如果您已经推送了错误的提交),可以撤销它,并创建一个新的提交来取消以前的提交。
参见 git revert

然后,您可以推送(常规推送)该撤销提交。


1
回滚通常是撤销更改的安全和正确方式。它相当于其他版本控制系统中的所有还原/撤销机制,并将错误提交和您进行的回滚记录在历史记录中。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接