删除已推送到远程的旧 git 提交
Remove an older git commit that has already been pushed to remote
我想删除一个 git 提交,该提交已经在 bitbucket 的 master 分支中合并了一段时间。在此示例中,我想删除下图中以黄色突出显示的提交。
请帮忙解决这个问题?
有几种方法可以解决这个问题。
一个将安全地撤消提交的更改,另一个将从历史记录中完全删除提交。您可以在下面找到详细信息。
解决方案 1:还原提交并推送到远程
这将创建一个新的 提交,用于恢复在旧提交中所做的更改。
为此,您只需要 运行 以下命令:
git revert <COMMIT_ID>
如果存在合并冲突,请解决它,然后像往常一样将新提交推送到远程。
注意:由于这是一个新的提交,你原来的提交会留在远程,新的提交会加到最上面。因此,代码将被还原,但旧的提交将保留在那里。
解决方案 2. 交互变基并强制推送到远程
这将从日志中完全删除 提交,但如果您在团队中工作并且其他团队成员已经在做,则可能 dangerous相同部分的变化。
假设您在一个分支中有 5 个提交:
commit1 -> commit2 -> commit3 -> commit4 -> commit5 (HEAD)
你在第 5 次提交(头),你想删除那里的第二次提交。
为此,您必须运行执行以下命令:
git rebase -i HEAD~4
其中 -i
是 interactive-rebase 的命令,HEAD~4
表示对最后 4 次提交进行 rebase。
运行执行命令后,将打开一个编辑器,其中包含如下文本:
pick d8389ew My Last Commit
pick f7f3f6d Another commit that is okay to keep
pick 310154e A commit that is okay to keep
pick a5f4a0d The commit that I want to remove
在那里你可以看到底部的提交是你想要删除的提交。
您需要将单词 pick
替换为 drop
pick d8389ew My Last Commit
pick f7f3f6d Another commit that is okay to keep
pick 310154e A commit that is okay to keep
drop a5f4a0d The commit that I want to remove
现在您可以保存文件,关闭编辑器,变基就完成了。
可能会再次出现一些合并冲突。如果有,就解决它们(如果需要完成它,请执行 git rebase --continue
)。
进行变基后,您的分支现在将如下所示(commit2 已删除):
commit1 -> commit3 -> commit4 -> commit5 (HEAD)
所以现在你所要做的就是将你的分支强制推送到远程。
但是警告:如果你在其他人正在工作的分支上做这件事(例如master,main),确保他们都知道这些变化,否则你可能会弄坏东西。
最后使用--force
命令推送分支:
git push origin my-branch-name --force
之后不要忘记让团队成员知道获取他们这边的最新更新。
备注:
- 有关交互式变基的更多信息,请参阅 this
- 这种方法实际上会删除最后 4 次提交并创建更新的具有相同更改的提交(将重写历史记录)。如果其他人在同一分支上工作,这将破坏其他人的引用。要解决他们方面的问题,请参阅 this。但是,如果该分支仅供您使用,那么您就可以了。
我想删除一个 git 提交,该提交已经在 bitbucket 的 master 分支中合并了一段时间。在此示例中,我想删除下图中以黄色突出显示的提交。
请帮忙解决这个问题?
有几种方法可以解决这个问题。
一个将安全地撤消提交的更改,另一个将从历史记录中完全删除提交。您可以在下面找到详细信息。
解决方案 1:还原提交并推送到远程
这将创建一个新的 提交,用于恢复在旧提交中所做的更改。
为此,您只需要 运行 以下命令:
git revert <COMMIT_ID>
如果存在合并冲突,请解决它,然后像往常一样将新提交推送到远程。
注意:由于这是一个新的提交,你原来的提交会留在远程,新的提交会加到最上面。因此,代码将被还原,但旧的提交将保留在那里。
解决方案 2. 交互变基并强制推送到远程
这将从日志中完全删除 提交,但如果您在团队中工作并且其他团队成员已经在做,则可能 dangerous相同部分的变化。
假设您在一个分支中有 5 个提交:
commit1 -> commit2 -> commit3 -> commit4 -> commit5 (HEAD)
你在第 5 次提交(头),你想删除那里的第二次提交。
为此,您必须运行执行以下命令:
git rebase -i HEAD~4
其中 -i
是 interactive-rebase 的命令,HEAD~4
表示对最后 4 次提交进行 rebase。
运行执行命令后,将打开一个编辑器,其中包含如下文本:
pick d8389ew My Last Commit
pick f7f3f6d Another commit that is okay to keep
pick 310154e A commit that is okay to keep
pick a5f4a0d The commit that I want to remove
在那里你可以看到底部的提交是你想要删除的提交。
您需要将单词 pick
替换为 drop
pick d8389ew My Last Commit
pick f7f3f6d Another commit that is okay to keep
pick 310154e A commit that is okay to keep
drop a5f4a0d The commit that I want to remove
现在您可以保存文件,关闭编辑器,变基就完成了。
可能会再次出现一些合并冲突。如果有,就解决它们(如果需要完成它,请执行 git rebase --continue
)。
进行变基后,您的分支现在将如下所示(commit2 已删除):
commit1 -> commit3 -> commit4 -> commit5 (HEAD)
所以现在你所要做的就是将你的分支强制推送到远程。
但是警告:如果你在其他人正在工作的分支上做这件事(例如master,main),确保他们都知道这些变化,否则你可能会弄坏东西。
最后使用--force
命令推送分支:
git push origin my-branch-name --force
之后不要忘记让团队成员知道获取他们这边的最新更新。
备注:
- 有关交互式变基的更多信息,请参阅 this
- 这种方法实际上会删除最后 4 次提交并创建更新的具有相同更改的提交(将重写历史记录)。如果其他人在同一分支上工作,这将破坏其他人的引用。要解决他们方面的问题,请参阅 this。但是,如果该分支仅供您使用,那么您就可以了。