如何从分支的中间删除提交

Rus*_*old 4 git git-commit

我做了一些提交,并将其推送到我的远程仓库中。我要删除的其中之一。它仅包含一个二进制文件,该文件仅在该分支的该提交中被更改。如何删除它而对以后的提交没有危害?

KJa*_*nek 12

答案中应考虑标志--rebase-merges ,因为接受的解决方案将删除 HEAD 和目标提交之间的合并提交~1

例子:

在任何变基之前:

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
Run Code Online (Sandbox Code Playgroud)

git rebase -i 目标提交~1

c11fa07 (HEAD -> dev) headCommit
7ed3eb5 added playoutServerUsage
0a1217c some_older_commit
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用标志 --rebase-merges 进行变基可能会更困难,整个过程会更长(树更大),但我们仍然必须找到目标提交并将“pick”更改为“drop”

之后,我建议使用

git push --force-with-lease origin HEAD 
Run Code Online (Sandbox Code Playgroud)

而不仅仅是武力。

强制与强制租赁

附言。值得关注的是哪些提交哈希值被更改了


Saj*_*han 6

您可以interactive (-i) rebase用来删除先前的提交。

$ git log                          # copy the target commit 

$ git rebase -i <target-commit>~1  # start rebase from the previous commit of target commit
Run Code Online (Sandbox Code Playgroud)

编辑器将打开一个提交列表,每行一个。每行以开头pick注释掉目标提交的行(放在#目标提交行的开头)。

或者,您可以输入dropd代替用注释掉该行#

$ git rebase --continue      # repeat the command until finish rebase
Run Code Online (Sandbox Code Playgroud)

现在,由于git历史记录已更改,因此需要强制(-f)推送到远程。

$ git push -f origin HEAD 
Run Code Online (Sandbox Code Playgroud)

  • 搞定了,谢谢你。**注意:如果你想更明确,你也可以使用 `drop` 或 `d` 而不是用 `#` 注释掉该行。** (2认同)