GIT撤消不是最新的提交,自那以后重新提交所有提交

rjm*_*nro 23 git git-rebase

早些时候,我提交了一些当时似乎是个好主意的代码,但事实上它使事情变得更糟.我想删除历史记录中的更改,因为它没有帮助,并且自那以后重新定义所有提交 - 它们应该合并而没有问题.

我尝试newMaster在错误提交(使用gitx)之前立即创建一个新分支(称为),检查并运行:

git rebase -i master
Run Code Online (Sandbox Code Playgroud)

哪个AFAICS应该给我一个关于master的提交列表以及合并或不合并它们的选项,但是它说noop,并且快速转发newMaster等于master.

做我需要的最简单的方法是什么?

CB *_*ley 29

做你想做的最简单的方法是继续(或重新检查)你想编辑的分支并运行这样的东西.

git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit>
Run Code Online (Sandbox Code Playgroud)

这会将所有错误提交到错误提交的父级,从而有效地从当前分支的历史记录中删除坏的commiit.当然,如果发生任何冲突,您将需要解决它们.

  • 一个数据点:这破坏了我的存储库. (8认同)
  • 你必须做一个 `git push --force` 才能让它工作。但是要*非常*小心。 (2认同)

Bri*_*ell 13

git rebase -i是正确的命令,但是您希望从具有最新更改的分支执行此操作,并传入作为rebase操作的"基础"的修订(在错误提交之前的修订).因此,如果您创建了一个last-good-commit指向最后一个良好提交的分支,您可能希望在运行时运行以下命令master:

git rebase -i last-good-commit
Run Code Online (Sandbox Code Playgroud)

  • 提供更多参数也可以使它更直观 - "git rebase -i last-good-commit master`做同样的事情(检查master然后使用last-good-commit作为基础进行rebase). (3认同)

dan*_*nza 5

使用rebase,我无法将更改推送到遥控器,并且每次拉动时我的变基都被取消。

我成功地恢复了一个精确的提交(不是最后一个),只需:

git revert <sha-of-bad-commit>
Run Code Online (Sandbox Code Playgroud)

然后我还可以推动遥控器