【问题标题】:Remove other peoples' commits on my branch after rebase gone wrong在变基出错后删除其他人在我的分支上的提交
【发布时间】:2019-01-11 20:26:40
【问题描述】:

我在这里陷入了一些 git-funk。我需要自己解决这个问题。

我加入了一个新团队并创建了一个功能分支:

git checkout -b feature_branch

做了一些更改,然后将它们提交/推送到分支。

git commit -am "Changes"
git push origin feature_branch

有人在我的 PR 上留下了评论,所以我进行了更改,然后签出 master 并重新设置我的分支,然后再次提交/推送到该分支:

// from feature_branch make some changes
git commit -am "New changes"
git checkout master
git checkout feature_branch
git rebase origin/master
git push feature_branch

一旦我这样做了,我注意到我的 PR(在 Github 上)接受了其他人的提交。然后我被告知,这个新团队中的典型方法是结帐以掌握并合并回我的分支而不是变基。

现在这是最时髦的部分——我开始使用 git reset --hard 并选择了我想要的提交,该提交在其他人的提交之前。

一切都很好,至少我是这么认为的。然后我把它推了上去,它似乎已经从我的 PR 中删除了其他人的提交。

我今天早上查了一下,现在有一堆其他人的提交被拾取了。

所以现在我处于这种奇怪的状态。我查看了我的 PR,几乎有 30 个提交(其中 6 个来自不同的人)。实际的差异(文件更改)只是我接触的文件,这很好,但历史本身看起来很荒谬。

清理此问题的最佳方法是什么?一切都建议使用git rebase,但是,我被建议不要使用rebase。

不幸的是,我需要保留这个分支。清理它并删除除我之外的所有其他提交的最佳方法是什么?只需将其完全重置,然后将更改挑选回分支?

请帮忙:|

编辑:这是历史的示例:

Commits on Jul 30, 2018
<SOMEONE ELSES>

Commits on Jul 31, 2018
<SOMEONE ELSES>
<MY ORIGINAL COMMIT>
<SOMEONE ELSES>

Commits on Aug 1, 2018
<SOMEONE ELSES>
<MY COMMIT [Merge branch master into my feature branch]>
<MY COMMIT>
<SOMEONE ELSES>
<MY COMMIT>
<MY COMMIT>
<SOMEONE ELSES>
<MY COMMIT>

etc etc

【问题讨论】:

    标签: git rebase git-reset


    【解决方案1】:

    如果您的分支上有多个自己的提交,您可以将所有提交变基并压缩到您的最新提交中,这会将您的所有更改放在分支的尖端,这将停止 GitHub从拉入您提交之间发生的所有更改。

    您可以从那里强制将重新定位的分支推送到远程,它应该只显示您新压缩和重新定位的提交。

    【讨论】:

      【解决方案2】:

      清理此问题的最佳方法是什么?一切都建议使用 git rebase,但是,我被建议不要使用 rebase。

      即使团队自己不使用变基工作流程,它也可能是 修复未合并分支的更好方法。只要您确定没有 另一个正在使用 并且 你知道possible implications if 事实并非如此。

      注意:我假设你的遥控器被命名为 origin 并且分支是 在 ma​​ster 上创建。如果不是这种情况,只需将它们替换为 合适的。

      在任何事情之前,隐藏所有修改(如果有的话):

      git stash save
      

      然后结帐到您的分行:

      git checkout mybranch
      

      (推荐)使用临时标签原样备份分支:

      git tag mybranch_bkp_rebase
      

      变基

      As mentioned,你可以变基到创建分支的位置,然后 删除提交与您的分支无关的行。

      git rebase -i "$(git merge-base origin/master HEAD)"
      

      这样,您的分支中剩下的唯一提交将是那些已经 当你创建分支时在那儿,加上来自那些行的提交 没有被删除。

      (可选)检查一切正常后,您可以重新设置为 当前大师

      git rebase origin/master
      

      重置

      如果你不想变基,你可以重置到以前已知的好 状态。那可能是您自己分支中的提交,也可能是提交 创建于或当前的ma​​ster

      # Pick one
      last_known_good_rev=hash_of_last_good_commit
      last_known_good_rev="$(git merge-base origin/master HEAD)"
      last_known_good_rev='origin/master'
      
      git reset --hard "$last_known_good_rev"
      

      然后检查 git log 是否有可能丢失的提交:

      git log --oneline mybranch_bkp_rebase..HEAD
      

      还有cherry-pick他们:

      git cherry-pick hash1 hash2 hash3
      

      【讨论】:

      • 我想给你一个赏金。非常有用。当这允许我时,我会尝试。
      • 看来我只能赏金未接受的答案。继续前进并在其他地方帮助您;)
      【解决方案3】:
      // from feature_branch make some changes
      git commit -am "New changes"
      git checkout master
      git checkout feature_branch
      git rebase origin/master
      git push feature_branch
      

      完成此操作后,我注意到我的 PR(在 Github 上)获取了其他人的提交。

      如果您所做的只是在 origin/master 之上进行变基,那是不可能的。

      但是,这个序列有点可疑。你永远不会做 git fetch 所以 origin/master 不知道是最新的。如果确实发生了变基,git push feature_branch 应该会失败,因为变基无法快速转发。你必须使用git push -f feature_branch

      我怀疑您没有向我们展示的其他问题。完整的命令历史记录会有所帮助。

      使用 rebase 更新分支的正确顺序是这样的。

      # Update all your remotes
      git fetch
      
      # Rebase your branch on top of origin/master
      git checkout feature_branch
      git rebase origin/master
      
      # Force push the branch
      git push -f
      

      幸运的是,你的旧提交在 rebase 后没有丢失,它们只是没有连接到任何东西。要找到它们,请使用git reflog。这将在每次 HEAD(即您当前的结帐)更改时显示。

      在 reflog 中,寻找类似这样的内容...

      081abed HEAD@{8}: rebase finished: returning to refs/heads/feature_branch
      081abed HEAD@{9}: rebase: the last commit message from your branch
      0a5b366 HEAD@{10}: rebase: another commit message
      e9c4d18 HEAD@{11}: rebase: the first commit message from your branch
      e6780bf HEAD@{13}: rebase: checkout origin/master
      0ee63b1 HEAD@{14}: checkout: moving from master to feature_branch
      

      0ee63b1 将是您的旧分支提示。 git reset --hard 0ee63b1 并且你已经撤消了 rebase。


      还有另一种解释:您针对错误的分支进行了 PR。仔细检查。

      【讨论】:

      • 谢谢!所以这就是我意识到发生的事情。有一个 CI bot 几天前更新了我的 PR 并合并到 2 个分支中。这 2 个分支包含来自其他人的提交(总共 6 个),这就是为什么它让我如此困惑的原因。我不敢相信我忽略了这一点,但是一旦我点击查看它实际合并的内容,这是一个启示。我也确实最终清理了我的历史记录,并且我喜欢这个提示以供将来使用(例如,基本上将所有内容重置为该分支上的第一个“干净”提交)。
      【解决方案4】:

      清理内容的最佳选择可能是使用git rebase -i 在您要清理的所有内容之前使用分支1 中已有的先前更改,然后删除更改您不希望从编辑器中的更改列表中获得(只留下您想要的更改)。这将重写更改以仅包含您的更改并让您回到“干净”(相对)状态。

      完成此操作后,您可以按照 git 流程的建议从 master(或任何地方)git merge


      1如果您想清除之前重新定位/合并到您的分支中的所有内容,或者可能是以后的某个 refpoint,则可能是您最初分支的更改。您选择的点越早,您(可以)清理的东西就越多,但您需要做的工作也可能越多。

      【讨论】:

      • 感谢您的信息。根据您的评论,我最终沿着这条路线走,但最终没有推动它(使用--force),但在我之前尝试过一种方法时推迟了。现在我知道如何在未来使用它了 :)
      猜你喜欢
      • 2015-02-13
      • 2017-03-17
      • 2020-10-18
      • 2015-12-25
      • 2014-03-23
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多