git - 如何在上次提交之前取消提交

标签 git

假设我有 2 个分支 masterdev .

dev分支领先master通过 2 次提交,并且这些提交都没有被 merge 或推送到任何 remote .

dev分支看起来像这样:

dev A - B - C - D - E

而 A 是最旧的,E 是最新的提交。

我想达到这个状态:

dev A - B - C - E

基本上我想在最后一次提交之前取消提交,就好像它从未发生过一样。也不应该有冲突(E 不依赖于 D 的更改)。

我可以使用交互式 rebase 吗?

最佳答案

我会使用 rebase 的交互式形式。在 dev 上(您需要有干净的工作副本):

git rebase -i HEAD~~

在您最喜欢的文本编辑器中,您可以获得最后 2 次提交的列表。只需评论/删除不需要的提交行。

如果 HEAD 依赖于 HEAD~ 引入的更改,您可能会遇到 merge 冲突,解决它们后,您将丢失以前的历史记录(仍然可以通过 reflog,当然)。我通常更喜欢这种方法。

如果你想保留你以前的历史(和不需要的提交),你应该这样做

git checkout HEAD~~         # go to last good commit
git checkout -b new_branch  # create a new branch and forget about the original
git cherry_pick dev         # copy the commit on top of `dev` to `new_branch`

你仍然会遇到冲突,但你不会修改 dev 的历史记录。

另一方面,如果不需要的提交发生在 master 上并且您不想破坏任何人的构建,您可以执行 git revert HEAD~

关于git - 如何在上次提交之前取消提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882328/

相关文章:

Git 传输协议(protocol)规范

PHPUnit 和 Git : How to test with unreadable file?

git push with http/2 有时会挂起 "17 bytes stray data"

java - 如何在 JGit 中对文件进行 "cat"处理?

git - 无法将更改推送到 github

git - 我应该如何设置一个包含许多静态 Assets 的 git 存储库?

mysql - pull/子模块更新的 Git 通知

仅由一个分支更改的文件发生 Git merge 冲突

git - 按名称找到交换文件

Git 推送到 bitbucket 中的新分支