Git 重置 and/or 删除远程分支上的提交
Git reset and/or delete commit on remote branch
我有一个关于 git 的小问题。在项目开始时,我有干净的流程(图 1 和 2)。图 1 来自 Intellij,而图 2 来自 运行 gitk &
命令。正如预期的那样,我们看到了相同的状态。
但是在将 "branch3" 与 "master" 合并后,我们意识到这并不好,因此想要删除该提交。我们执行以下命令:git reset --hard HEAD~1
。正如预期的那样,执行此命令后我们处于以下状态:
然后我们从那个状态创建新分支 "branch4"。到目前为止,一切都按预期进行。但是在我们推送 "branch4" 并将其与 "master" 分支合并后,我们收到以下问题:
如您所见,我们还有 "Commit on branch3" 和 "Merged in branch 3"。请告诉我如何删除这些提交,因为我不想记录这些提交(与第一张图片类似)。因为,显然 git reset --hard
不会删除远程提交。我想强调一下,推送是使用以下命令完成的 git push --force
我应该改用什么命令?
P.S。 git reset --soft
我也一样。
让您的本地提交历史看起来完全像您想要的那样。然后将每个分支强制推送(push --force
或 push -f
)到远程。这将为您强制推送的每个分支重写远程上的历史记录,使其看起来与本地完全一样。
如果您的远程 git 服务器或存储库配置为拒绝重写历史记录,这将失败。您将不得不更改该配置。 (GitHub 默认不这样做,但 GitLab 会。我不知道 bitbucket)
在您获得要修复的分支后,在本地和远程看起来都是正确的,您可能想要清除废弃分支(您的 branch3
)的痕迹。请参阅 如何在本地和远程删除 Git 分支?
⚠️ 注意重写共享分支历史的注意事项:
- 如果任何人对您要强制推送的分支的克隆有更改,它可以 difficult/messy 将它们合并。
- 如果有人提交了对远程仓库的更改,您的强制推送将覆盖它们。您可能需要考虑
git push --force-with-lease
我有一个关于 git 的小问题。在项目开始时,我有干净的流程(图 1 和 2)。图 1 来自 Intellij,而图 2 来自 运行 gitk &
命令。正如预期的那样,我们看到了相同的状态。
但是在将 "branch3" 与 "master" 合并后,我们意识到这并不好,因此想要删除该提交。我们执行以下命令:git reset --hard HEAD~1
。正如预期的那样,执行此命令后我们处于以下状态:
然后我们从那个状态创建新分支 "branch4"。到目前为止,一切都按预期进行。但是在我们推送 "branch4" 并将其与 "master" 分支合并后,我们收到以下问题:
如您所见,我们还有 "Commit on branch3" 和 "Merged in branch 3"。请告诉我如何删除这些提交,因为我不想记录这些提交(与第一张图片类似)。因为,显然 git reset --hard
不会删除远程提交。我想强调一下,推送是使用以下命令完成的 git push --force
我应该改用什么命令?
P.S。 git reset --soft
我也一样。
让您的本地提交历史看起来完全像您想要的那样。然后将每个分支强制推送(push --force
或 push -f
)到远程。这将为您强制推送的每个分支重写远程上的历史记录,使其看起来与本地完全一样。
如果您的远程 git 服务器或存储库配置为拒绝重写历史记录,这将失败。您将不得不更改该配置。 (GitHub 默认不这样做,但 GitLab 会。我不知道 bitbucket)
在您获得要修复的分支后,在本地和远程看起来都是正确的,您可能想要清除废弃分支(您的 branch3
)的痕迹。请参阅 如何在本地和远程删除 Git 分支?
⚠️ 注意重写共享分支历史的注意事项:
- 如果任何人对您要强制推送的分支的克隆有更改,它可以 difficult/messy 将它们合并。
- 如果有人提交了对远程仓库的更改,您的强制推送将覆盖它们。您可能需要考虑
git push --force-with-lease