【问题标题】:Git - How to delete commits on Remote master branchGit - 如何删除远程主分支上的提交
【发布时间】:2020-09-08 11:36:37
【问题描述】:

我是 GIT 的新手,我正在努力理解它的概念。因此,我有一些基本问题。请原谅我的天真。我搜索了互联网,但最终变得更加困惑。以下是我的问题:-

$ git log -n 10 --oneline
170daa2 (HEAD -> master, origin/master, origin/HEAD) Revert "Undo Pull request from feature branch test"
e3f0714 Revert pull request test This reverts commit c6b3b1a
c6b3b1a Revert commit
b72e92e Undo Pull request from feature branch test
3077d10 (origin/feature/test1, feature/test1) First commit
1ba77e8 Updated test1
8fceee2 Revert Commit 1
ecddd63 Test for remote status
6c5a094 Cherry Pick 1
3b66732 Fixed conflict

$ git log -n 6 --oneline feature/test1
3077d10 (origin/feature/test1, feature/test1) First commit
1ba77e8 Updated test1
8fceee2 Revert Commit 1
ecddd63 Test for remote status
6c5a094 Cherry Pick 1
3b66732 Fixed conflict
  • 从上面看到,当我在master branch 上执行git log 时(上面的第一个输出)为什么它还显示我的提交 feature 分支 (feature/test1) 以及我主人的分支? 当我明确指定 git log 中的分支,然后显示与之相关的提交 只有分支,对吧?是不是因为git 会显示所有提交 (不考虑任何分支)按时间顺序组合在一起 ?谁能解释一下。

  • 如何删除 remote 分支上的提交? -
    假设我在feature 分支上创建了2 commits 并通过拉动将它们合并到remote master 请求。
    现在,我意识到那些是错误的提交,我想清理 并回滚到我的远程主机(以及 local master) 分支在拉取请求被批准之前。一世 知道我可以使用: git reset --hard HEAD~2
    摆脱本地master 上的这两个提交 分支,但是我如何从 remote ma​​ster 中摆脱它们 分支,因为它们已经合并到 master ?是reset 用于本地提交而revert 用于远程提交吗?这两个命令有什么区别?以及如何解决我的问题 -

    • 做,我需要先在本地reset master 然后“强制推送” 通过运行此状态到远程主机:git push origin +master?这是正确的方法吗? 或
    • 我是否使用git revert -m 1 <commit-hash> 撤消提交 远程分支,需要注意的是恢复将回滚和 做出新的承诺。有没有办法在两个遥控器上回滚 和本地主分支而不进行新的提交?请 建议最佳方法。

由于我刚刚开始使用 git,因此我可能问了一个错误的问题。无论哪种方式,请原谅我的幼稚。 任何帮助表示赞赏。

【问题讨论】:

  • 请问您能具体说明您想要做什么吗?我的意思是在您提供的示例中,您到底想实现什么? cz 你问了一个一般性的问题,如果你问一个一般性的问题,你会得到一个一般性的答案,如果你是初学者,那么我认为一般性的答案对你没有帮助。所以,如果你能具体化你的问题并明确你的目标,那就太好了。
  • @Alan- 我的远程 master 已通过拉取请求与来自我的功能分支的错误提交合并。我怎样才能将远程主机恢复到其早期状态。示例中的提交是我为测试所做的一些随机提交。
  • 如果你想删除对远程分支的提交,那么你自己回答,如果你在同一个分支上,只需 git reset --hard <commit_hash>git push --force

标签: git github bitbucket


【解决方案1】:
git revert -m 1 <commit-hash> 
git push -u origin master

-m 1 是必需的,因为一旦合并,您的提交实际上就存在于 2 个不同的分支(master 和 feature/test1)上。所以你需要告诉 git 在恢复提交时选择什么方向。

【讨论】:

  • git reset --hard &lt;commit-hash&gt; &amp;&amp; git push --forcegit revert -m 1 &lt;commit-hash&gt; &amp;&amp; git push -u origin master 之间的哪一个?如果我使用它revert,我仍然需要为本地做git reset --hard,对吧?
  • 不要使用--force。只是不要。 git revert 应该是你的选择
【解决方案2】:

可以简单地回答您的问题:

如果您想更正远程分支上出现的错误,只需执行以下操作:

1) 在本地结帐到要推送到 master 的分支,基本上是 master 分支,使用以下方法结帐:

git checkout master

2) git log --oneline

检查你的所有提交(我知道你知道)

3) 检查并找到您希望主分支指向的最后一个提交

4) 找到哈希提交后,执行以下操作:

`git reset --hard

5)现在你需要强制推送到master分支

确保您仍然在 master 上签出,并且:

git push --force

瞧,你完成了!但是,只要确保如果其他一些伙伴再次从 master 拉取,那么他们必须 git pull --rebase 否则如果他们已经在旧存储库上,他们的 git pull 将失败。

【讨论】:

  • 感谢您的回复。您能否还澄清一下为什么主分支上的git log 除了主分支的提交之外还显示来自我的功能分支的提交??
  • 首先你要了解什么是分支。分支实际上是一系列提交,其中 head 指向特定的提交。因此,要回答您的问题,它们肯定会显示出来,因为您从主分支中签出了功能分支。
  • 这意味着,如果您有一个只包含三个提交 A、B 和 C 的分支 master,并且您决定现在从 master 分支签出一个功能分支,那么您的功能分支也将具有三个提交 A、B 和 C。所以,现在它们是相同的。
  • 一旦你开始在特性分支上提交,例如你决定做一些改变然后你提交你的提交 D,那么你的特性分支将有 A、B、C 和 D,而主分支将有 A、B 和 C。
  • 所以这正是你的情况,你从主分支结帐到特性分支,你在特性分支中看到 A、B 和 C,因为它们实际上来自主分支。
【解决方案3】:

如果您需要删除提交(错误代码或其他),只需返回之前的提交,然后复制哈希(sha-commit):

1) git reset --hard sha-commit

2)git reset --soft HEAD@{1}

3) 此提交消息是一个示例,您可以随意更改它:

git commit -m "Reverting to the state of the project at sha-commit"

4) git push origin master

现在您在主分支中的最后一次提交是在您选择的提交上

【讨论】:

  • 我认为这不会按预期工作,因为错误的提交已经被推送到远程主机。如果我错了,请纠正我
  • 这是已经推送到 master 的错误提交的解决方案
猜你喜欢
  • 2020-07-29
  • 2016-12-05
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多