我已经提交了一些更改并将它们推送到我的远程仓库。其中一个我想要删除。它只包含一个二进制文件,在那个分支的那次提交中才发生了更改。如何在不影响后续提交的情况下删除它?
我已经提交了一些更改并将它们推送到我的远程仓库。其中一个我想要删除。它只包含一个二进制文件,在那个分支的那次提交中才发生了更改。如何在不影响后续提交的情况下删除它?
$ 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
现在,由于 Git 历史记录已经被更改,你需要进行强制推送 (-f) 到远程仓库!
$ git push -f origin HEAD
origin
)将会被更新(从Git历史中删除提交)。 - Sajib Khan应该考虑使用标志 --rebase-merges,因为接受的解决方案将删除头部和目标提交之间的合并提交~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 be longer (bigger tree), but still we have to locate target commit and change 'pick' to 'drop'
git push --force-with-lease origin HEAD
不要只使用强制。
附注:值得注意的是哪些提交哈希值发生了变化
.git
文件。
git rebase -i TARGET_COMMIT~1
然后不要选择TARGET_COMMIT
,我认为这样会起作用。 - CollinD--force-with-lease
),因为你的更改无法快速前进。 如果你想避免这些问题,可以使用git revert
来撤销此次提交。 - kolejnik