删除 GitHub 中分支上的远程提交

Remove remote commits on the branch in GitHub

提问人:Igor 提问时间:6/1/2023 最后编辑:Igor 更新时间:6/2/2023 访问量:57

问:

很久以前,我在我的 fork 中做了一个本地分支,并对其进行了一些更改。然后我提交了一个 PR,该 PR 通过了 CI 构建。

现在,一段时间后,我回到了我生成 PR 的同一台机器上,但由于某种原因,我没有检查我在哪个分支上,并在旧分支上进行了几次提交并推送它们,因此搞砸了 PR(由于缺少测试代码,它尚未合并)。

现在我想做的是转到 Github Web 界面,删除这些提交,但将它们保留在本地,因为我可以在本地计算机上生成一个补丁,删除这些提交,切换到新分支并将补丁应用于它。

或者甚至有更好的解决方案?

那么我该如何解决这个烂摊子呢?

请记住 - 我打算通过测试完成 PR,但这是 2 件完全不相关的事情。

TIA!!

编辑:

一切都很好,我在原始笔记本电脑上的旧分支恢复正常,PR 现在很好。

但是,为了进行单元测试,我不得不去另一台机器上做一个.由于某种未知原因,在那之后,该机器上的 git 树被所有内容堵塞,包括错误的提交。git pull

我能够撤销错误的提交,但我担心当我尝试在所有平台/不同的笔记本电脑上测试我的单元测试时也会发生同样的情况,这意味着我的更改将丢失,我将需要在所有不同的机器上为 UT 再次重做它们。git reset --hard N

你能在这里帮我吗?

TIA!!

git 提交 历史记录 git-remote

评论

0赞 Code-Apprentice 6/1/2023
没有“远程提交”这样的东西。
0赞 Igor 6/1/2023
@Code-Apprentice,该命令合并了我在远程服务器上的更改,实质上创建了远程提交。或者使用更好的措辞 - 在远程分叉存储库中提交。git push
0赞 Code-Apprentice 6/1/2023
我现在正在写一个答案。大约10分钟后再回来查看。
0赞 Code-Apprentice 6/3/2023
您应该发布一个新问题。

答:

0赞 Code-Apprentice 6/1/2023 #1

经过一番思考,我最初的答案比绝对必要的要复杂得多,但我会把它留在下面。

让原始分支恢复到旧状态并保留新提交的最简单方法是创建一个新分支,然后重置旧分支并强制推送。它看起来像这样:

git checkout old-branch
git branch new-branch
git reset --hard <hash of commit you want to keep in old-branch>
git push -f

或者,您可以使用

git reset --hard HEAD~n

其中是要从旧分支中删除的提交数。n

现在,您可以对新分支执行任何操作,例如将其变基到 .这可能并非完全必要。例如,如果您的 PR 被合并,则在进行第二个 PR 之前,您仍然需要将这些更改拉入新分支。但是,如果您想在合并第 1 个 PR 之前进行第 2 个 PR,那么最好将它们分开,直到其中一个合并。main

顶级域名

修复远程存储库的最简单方法是首先在本地进行更改,然后推送(可能强制推送)到 GitHub 或其他远程存储库。

您可以先在本地完成所有操作,然后推送到 GitHub 以修复 PR。首先,您应该创建一个新分支,以及要保留但从另一个分支中删除的提交。git cherry-pick

首先获取所需提交的哈希值:

git checkout old-branch
git log --oneline --graph

复制要移动的提交的提交哈希值。然后做

git checkout -b new-branch main

对于您复制的每个哈希值:

git cherry-pick <hash>

或者,您可以使用 更轻松地执行此操作。你只需要你要保留的最旧提交的哈希值:git rebase

git checkout -b new-branch old-branch
git rebase --onto main <hash of oldest commit>~

现在回到你的旧分支,删除所有你不再需要的提交:

git checkout old-branch
git reset --hard <hash of the first commit you want to keep on this branch>

最后用力推:

git push -f

如果对命令使用了正确的哈希值,则会自动将 PR 更新回其原始状态。git reset

评论

0赞 Igor 6/1/2023
感谢。但是,我有一些问题:1.会从当前选择的分支中创建分支,对吗?所以,在做之前,我应该做,对吧?2. 当我变基时,我会将所有提交带到新分支,包括 PR 中的提交,对吧?如果是 - 我不想这样做,因为应用新分支并不容易,因为它可能会产生冲突。因此,为了简化主存储库维护者的生活,我应该进行挑选。git checkout -bgit checkout master
0赞 Igor 6/1/2023
最后,3 - 我应该从最古老到最新的樱桃开始采摘樱桃,这样历史才能被保留下来,对吗?
1赞 Code-Apprentice 6/1/2023
1. 在与提交相同的提交(或技术上任何“提交”)中创建一个新分支。这允许您在所需的位置创建一个新分支,并在一个命令中将其全部检出。有关详细信息,请参阅。git checkout -b <branch><branch>git help checkout
1赞 Code-Apprentice 6/1/2023
2. 该标志以及指定“开始提交”只会复制您想要的提交,而不是整个分支。有关详细信息,请参阅。--ontogit help rebase
1赞 Code-Apprentice 6/1/2023
3. 是的,您应该从最旧到最新进行挑选。变基会为您处理这个细节,因此即使对于 2 次提交,我也更喜欢它。