如何从分支中间删除提交
How to remove a commit from the middle of a branch
我做了一些提交并将其推送到我的远程仓库。其中一个我想删除。它仅包含一个二进制文件,该文件仅在该分支的该提交中发生更改。如何在不损害以后提交的情况下删除它?
您可以使用 interactive (-i) rebase
删除之前的提交。
$ git log # copy the target commit
$ git rebase -i <target-commit>~1 # start rebase from the previous commit of target commit
编辑器将打开一个提交列表,每行一个。每行都以 pick
开头。 注释掉你的目标提交行(将#
放在目标提交行的开头)。
或者,输入 drop
或 d
而不是用 #
.
注释掉该行
$ git rebase --continue # repeat the command until finish rebase
现在,您需要强制 (-f) 推送到远程,因为 git 历史记录已更改!
$ git push -f origin HEAD
标志 --rebase-merges 应该在答案中考虑,因为接受的解决方案将删除 HEAD 和目标提交之间的合并提交~1
示例:
Before any rebase:
f3e07b4 (HEAD -> dev, origin/dev) headCommit
dd3d182 Merged PR 425: added playoutServerUsage
7ed3eb5 added playoutServerUsage
03b52af feat: add Description Series #targetCommit
0a1217c some_older_commit
git rebase -i target-commit~1
c11fa07 (HEAD -> dev) headCommit
7ed3eb5 added playoutServerUsage
0a1217c some_older_commit
git rebase -i target-commit~1 --rebase-merge
a1943b6 (HEAD -> dev) headCommit
12411a1 Merged PR 425: added playoutServerUsage
7ed3eb5 added playoutServerUsage
0a1217c some_older_commit
Rebase with flag --rebase-merges can be harder and whole process will bo longer (bigger tree), but still we have to
locate target commit and change 'pick' to 'drop'
之后我会推荐使用
git push --force-with-lease origin HEAD
改为仅强制。
force vs force-with-lease
PS。值得关注的是更改了哪些提交哈希
我做了一些提交并将其推送到我的远程仓库。其中一个我想删除。它仅包含一个二进制文件,该文件仅在该分支的该提交中发生更改。如何在不损害以后提交的情况下删除它?
您可以使用 interactive (-i) rebase
删除之前的提交。
$ git log # copy the target commit
$ git rebase -i <target-commit>~1 # start rebase from the previous commit of target commit
编辑器将打开一个提交列表,每行一个。每行都以 pick
开头。 注释掉你的目标提交行(将#
放在目标提交行的开头)。
或者,输入 drop
或 d
而不是用 #
.
$ git rebase --continue # repeat the command until finish rebase
现在,您需要强制 (-f) 推送到远程,因为 git 历史记录已更改!
$ git push -f origin HEAD
标志 --rebase-merges 应该在答案中考虑,因为接受的解决方案将删除 HEAD 和目标提交之间的合并提交~1
示例:
Before any rebase:
f3e07b4 (HEAD -> dev, origin/dev) headCommit dd3d182 Merged PR 425: added playoutServerUsage 7ed3eb5 added playoutServerUsage 03b52af feat: add Description Series #targetCommit 0a1217c some_older_commit
git rebase -i target-commit~1
c11fa07 (HEAD -> dev) headCommit 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit
git rebase -i target-commit~1 --rebase-merge
a1943b6 (HEAD -> dev) headCommit 12411a1 Merged PR 425: added playoutServerUsage 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit
Rebase with flag --rebase-merges can be harder and whole process will bo longer (bigger tree), but still we have to locate target commit and change 'pick' to 'drop'
之后我会推荐使用
git push --force-with-lease origin HEAD
改为仅强制。
force vs force-with-lease
PS。值得关注的是更改了哪些提交哈希