如何在当前本地主服务器之前的两个提交中合并远程主服务器

时间:2009-09-23 16:37:08

标签: git merge github dvcs

导致问题的步骤

以下是我在提出问题时所做的事情:

  1. 将项目分配到Github并在本地克隆
  2. 对我的本地仓库做了两次提交以修复错误
  3. 将这两个提交推送到我的分叉Github repo
  4. 通过Github向原始回购拥有者发送拉取请求
  5. 原所有者提出了不同的提交来解决错误
  6. 问题

    如何合并原始所有者的提交,以便我的本地主人与他的主人相同(基本上我想做一个Github快进)并且我在新分支上做了两次提交?

    问题出现之后采取的步骤

    以下是我迄今为止所做的事情(我认为我需要做的就是完成我想要的事情):

    1. 将原始仓库添加为远程:git remote add original-repo git://github.com/blah/blah.git
    2. 获取原始回购:git fetch original-repo
    3. 获取原始回购主文件:git fetch original-repo master
    4. 在头灯模式下进入鹿,所以谷歌搜索失败后发布问题到Stackoverflow。 Stackoverflow上有一些类似的问题,但我没有看到任何试图完成同样事情的事情。

2 个答案:

答案 0 :(得分:2)

有点像问题“Take all my changes on the current branch and move them to a new branch in Git

基本上,您需要将主分支重置为提交前的状态,并将它们放在新分支“myBranch”(或您想要的任何其他名称)中:

$ git checkout -b myBranch SHA1_before_your_commits
$ git rebase master # to replay all your commits on top of this new branch
$ git checkout master
$ git reset --hard SHA1_before_your_commits

然后从原始仓库中添加提交:

$ git pull original-repo master

然后您将需要force the push到您的GitHub分叉回购(因为您已经重写了分支的历史记录)

 git push --force origin master 
  

警告:这不仅会破坏遥控器上的历史记录,还可能会向从同一遥控器更新的任何人发出错误消息(取决于您重写的历史记录)。仅将此作为最后的手段。

在这里,如果没有人克隆你的分叉存储库,这可能是一个可行的解决方案。

答案 1 :(得分:1)

VonC提供的解决方案的替代解决方案是使用“我们的”合并策略来加入历史记录,但是要采用一个版本:

$ git checkout -b tmp original-repo/master
$ git merge -s ours master  # take version from 'tmp', i.e. from 'original-repo/master'
$ git checkout master
$ git merge tmp                    # should be fast forward
$ git branch -d tmp              # 'tmp' branch is no longer needed

上面你要做的就是“他们”合并。

警告: 此解决方案解决原始问题如果自上次合并(上次更新)后本地分支上没有其他提交,那么将被原始存储库中的版本替换!!!

因此,此解决方案可以保留您解决历史问题的版本,但在应用程序中更受限制。


下面是一组ASCII艺术图表,显示了每个步骤中存储库中发生的情况:

  1. 在第一个命令之前:
    \*---\*---x---A                 <-- original-repo/master (remote-tracking branch)
                    \
                      \\--a---b           <-- master <-- HEAD
    
  2. 在“git checkout -b tmp original-repo/master”之后:
                                              <-- original-repo/master,
    *---*---x---A                 <-- tmp  <-- HEAD
                    \
                      \--a---b           <-- master
    
    其中'tmp'(本地分支)和'original-repo / master'(远程跟踪分支)指向同一个提交。
  3. 在“git merge -s ours master”之后:
                            /-------------- original-repo/master
                          v
    *---*---x---A----A'       <-- tmp  <-- HEAD
                    \              /
                      \--a---b           <-- master
    
    其中,提交A'是合并提交,但具有与提交A相同的内容(相同的树)
  4. 在“git checkout master && git merge tmp”之后(合并应该快进):
                              /-------------- original-repo/master
                            v
    *---*---x---A----A'       <-- tmp,
                    \              /          <-- master <-- HEAD
                      \--a---b
    
    'master'和'tmp'都指向同一个提交。
  5. 在“git branch -d tmp”之后,以及一些图表的重新组织
    \*---\*---x---A-----\            <-- original-repo/master
                    \                   \
                      \\--a---b---A'      <-- master <-- HEAD
    
  6. 最后:

    • 远程跟踪分支“original-repo/master”(即“refs/remotes/original-repo/master”)指向提交A,
    • 本地分支“master”(即“refs/heads/master”),即当前分支,指向提交A'。
      承诺A'有:
      • 将A作为其第一个父级(A'^1 == A),
      • 将b提交为第二个父(A'^2 == a),
      • 及其内容(其树)与提交A(A'^{tree} == A^{tree})相同。
相关问题