【问题标题】:Git Rebase -> Why is there a merge when pulling?Git Rebase -> 为什么拉的时候有合并?
【发布时间】:2020-02-21 02:48:32
【问题描述】:

我创建了一个分支来开发新功能。由于此新功能完全是作为一个新项目开发的,因此唯一可能的冲突来源是解决方案文件。

随着功能的开发,主分支更新了好几次。当我完成开发和测试时,我做了:

git checkout master
git fetch
git pull
git checkout myFeature
git rebase master

变基(和所有其他命令)运行良好,没有报告任何冲突/错误/问题。我的下一步是git status,结果是:

在分支 myFeature
你的分支和'origin/myFeature'已经不同了, 分别有 7 个和 5 个不同的提交。 (使用“git pull”将远程分支合并到你的)

当我git pull 合并打开并查看历史记录时,我的提交被重复了。在我看来,这种重复是不应该发生的。我期待我的提交应该在最后一次(当前)提交到 master 之后重新应用。

是我做错了什么还是我的期望错了?

【问题讨论】:

    标签: git rebase git-rebase


    【解决方案1】:

    为什么会有合并提交

    当您执行变基时,您正在更改 Git 历史记录。当你再次拉动时,Git 会再次尝试合并这两个历史。默认情况下,git pullgit fetch + git merge,这将导致合并提交。

    这不是您在更改历史记录后想要的,因为它会(部分)恢复您的历史记录更改。不幸的是,git status 的提示有点误导......

    在变基/改变历史之后你应该做什么

    更改历史记录(例如变基)后,您需要强制推送,以便您也可以在遥控器上获取该历史记录。然后你告诉 git “历史不同,但相信我,这是故意的”。

    建议使用“带租约的强制推送”:git push --force-with-lease - 请参阅git push --force-with-lease vs. --force

    修复当前状态的步骤

    幸运的是,您可以使用 Git reflog 回到 git pull 之前!

    这将修复错误的拉动,并且不会有任何冲突需要解决:)

    所以步骤:

    1. 在 reflog git reflog 中找到正确的提交,因此在 git pull 之前(注意:您可以通过键入 q 退出 reflog)
    2. Git 重置为该提交,例如git reset 327fb961e --hard
    3. 仔细检查并执行git push --force-with-lease

    注意:如果您在使用 git reset 时出错,您可以再次使用 git reflog :)

    注意 2:reflog 仅在您的本地计算机上

    【讨论】:

    • 所以在git rebase master 之后我会使用git push --force-with-lease 而不是git pull
    • 确实如此!你明白了:)
    【解决方案2】:

    这部分足以使用master 分支进行变基。

    git checkout master
    git fetch
    git pull
    git checkout myFeature
    git rebase master
    

    但是,您可以只使用以下命令而不是上述所有命令来执行相同的操作。

    $ git pull origin master --rebase
    

    在这之后所有的提交哈希都将被重写,这就是为什么git status 表明你的分支已经分歧了。

    忽略这一点,您可以运行以下命令将重新定位的代码推送到远程分支。

    $ git push origin HEAD -f
    

    在变基时,如果您遇到冲突并且不想继续变基,您可以运行 git rebase --abort 来中止变基。

    在任何情况下,如果您发现自己处于一些与提交相关的危险之中,您可以按照以下步骤操作。

    • git reflog - 找到最后一个完美的提交并记下它的提交哈希
    • git reset --hard <commit-hash> - 提供最后一个完美的提交哈希

    它将带你到回购的最后一个完美代码。

    【讨论】:

      【解决方案3】:

      上一个答案看起来很棒。只是试图直观地说明正在发生的事情,以防万一:

      由于git rebase 修改了历史记录,因此您在变基后的分支看起来与您在原点上的不同。

      来源/主人

      A -> B -> C -> D -> E
      

      你的分公司,原产地/你的分公司:

      A -> B -> F -> G -> H
      

      变基后,yourbranch 将如下所示:

      A -> B -> C -> D -> E -> F -> G -> H
      

      然后,当您拉出 origin/yourbranch 时,您将拥有:

      A -> B -> C -> D -> E -> F -> G -> H - I (merge commit)
            \                              /
              -> F -> G -> H -------------
      

      由于历史不同,它变成了正常的非快进合并。实际上,您的远程和本地分支已成为不同的分支。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2021-08-06
        • 2011-02-22
        相关资源
        最近更新 更多