我做了一些提交,并将其推送到我的远程仓库中。我要删除的其中之一。它仅包含一个二进制文件,该文件仅在该分支的该提交中被更改。如何删除它而对以后的提交没有危害?
KJa*_*nek 12
答案中应考虑标志--rebase-merges ,因为接受的解决方案将删除 HEAD 和目标提交之间的合并提交~1
例子:
在任何变基之前:
Run Code Online (Sandbox Code Playgroud)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 目标提交~1
Run Code Online (Sandbox Code Playgroud)c11fa07 (HEAD -> dev) headCommit 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit
git rebase -i target-commit~1 --rebase-merge
Run Code Online (Sandbox Code Playgroud)a1943b6 (HEAD -> dev) headCommit 12411a1 Merged PR 425: added playoutServerUsage 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit使用标志 --rebase-merges 进行变基可能会更困难,整个过程会更长(树更大),但我们仍然必须找到目标提交并将“pick”更改为“drop”
之后,我建议使用
git push --force-with-lease origin HEAD
Run Code Online (Sandbox Code Playgroud)
而不仅仅是武力。
附言。值得关注的是哪些提交哈希值被更改了
您可以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。注释掉目标提交的行(放在#目标提交行的开头)。
或者,您可以输入drop或d代替用注释掉该行#。
$ 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)