【问题标题】:Git commit squashed when merging upstream, how do I update my local repo合并上游时 Git 提交被压缩,我如何更新我的本地仓库
【发布时间】:2017-01-16 22:30:51
【问题描述】:

我在本地 repo 中做了一些提交,将它们推送到远程,并为上游 master 创建了一个 Pull Request。当 PR 被合并时,这些提交被压缩了。

$ git commit A
$ git push origin master
$ git commit B
$ git push origin master

创建 PR,压缩并合并到上游 master

那么当我这样做时......

$ git pull upstream master

由于提交不同,它会进行合并而不是快进。在上游更改/压缩提交后,如何更新我的本地存储库以匹配上游主历史记录?

我最终做了以下...

$ git reset HEAD~2 --hard
$ git pull upstream master
$ git push origin master --force

为了符合我的历史,但我希望有一种更清洁的方法来做到这一点。

【问题讨论】:

    标签: git github merge


    【解决方案1】:

    根据this answer,并由其他人指出,您应该在获取/更新后运行以下命令:

    git fetch upstream
    git reset --hard upstream/master
    

    然而,更重要的是知道如何避免让自己陷入困境。

    避免问题

    为避免以后出现此问题,您应该始终使用单独的分支进行开发。您发布了:

    $ git commit A
    $ git push origin master
    $ git commit B
    $ git push origin master
    

    从上面的示例中,您似乎正在使用 master 分支进行开发。这是一个很大的no-no,这似乎是您的问题的真正原因。相反,请执行以下操作:

    git checkout -b changes-for-pull-request
    # hack hack
    git commit
    git push origin changes-for-pull-request
    # hack hack
    git commit
    git push origin changes-for-pull-request
    

    您确实将您的changes-for-pull-request 分支合并到您的master 分支中。相反,您发送拉取请求并将它们指向您单独的主题分支以从中提取。您甚至可以使用他们的最新版本重新调整您的工作,以使其更轻松。例如,当您准备发出拉取请求时,您可以 rebase 如下:

    git checkout master
    git pull upstream master  # you never make changes here, so not a problem
    git rebase master changes-for-pull-request  # fix conflicts, if any
    git push origin changes-for-pull-request
    

    发送拉取请求并将它们指向您的changes-for-pull-request 分支。当他们将其合并到 他们的 master 中时,只需您再次执行 git pull upstream master 即可,您不会有任何问题。

    自己打扫卫生

    由于现在您的拉取请求已在上游合并并进入您自己的master 分支,您可以安全地在本地删除您的changes-for-pull-request 分支并在您自己的origin 中进行清理。

    git push --delete origin changes-for-pull-request
    git branch -d changes-for-pull-request  # note lower-case "-d"
    

    【讨论】:

      【解决方案2】:

      如果您没有要保存的本地更改,您可以重置本地分支以匹配远程。

      首先,从远程获取新数据

      git fetch upstream
      

      其次,在仔细检查您是否在本地 master 分支之后

      git reset --hard upstream/master
      

      这将重置您的本地分支以匹配远程分支。

      【讨论】:

      • 如果您确实有想要保存的更改,您可以先存储它们,执行硬重置,然后弹出存储。
      猜你喜欢
      • 2016-05-22
      • 1970-01-01
      • 2018-11-05
      • 2018-04-10
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多