我假设这里没有插话其他人之间犯你的工作,以及你的不良承诺在回购的历史中形成一个连续的范围。否则,你将不得不变得更加复杂。我们假设您的历史记录如下所示:
e82401b - (master, HEAD) My most recent private commit
...
bc2da37 - My first private commit
cf3a183 - (origin/master) My most recent bad public commit
...
292acf1 - My first bad public commit
82edb2a - The last good public commit
我们想要做的第一件事就是吹掉您尚未公开的提交。你可以用下面的命令做到这一点(注意,您的更改将会消失,应视为不可恢复的):
git reset --hard cf3a183
相同(更易读):
git reset--hard origin/master
现在你的观点该存储库与origin/master
中的视图一致。您现在想要恢复您的不良公开更改并将其作为恢复提交发布。这些说明用于创建单个恢复提交。
您可以使用git revert --no-commit a..b
恢复开始在所有提交的提交后a
(注意!),并在结束,并包括提交b
。将会为您提交回复。所以,在这里,我们会做:
git revert --no-commit 82edb2a..HEAD
,或等效:
git revert --no-commit 292acf1^..HEAD
记住,HEAD
现在指向同一个地方origin/master
。
运行revert
命令后,您现在已经完成了更改并准备好提交,因此只需运行一个简单的git commit -m "Reverting those bad changes I accidentally pushed and made public"
即可。
谢谢,这是我需要的那种信息。还有一个问题:我如何获得(主,头)或(起源/主)信息,以便我可以知道何时执行这两组命令? –
@Pat最简单的方法是建立一个'git log'的替代形式来一目了然地获取这些信息。您可以阅读[这里](https://www.kernel.org/pub/software/scm/git/docs/git-log.html)关于使用的格式。一个好的起点是这样的:'git log --pretty =“%h%Cgreen%d%Creset%s%an%Cblue(%cr)”' –