Rebase没有按预期工作,也许我应该尝试不同的方法

时间:2016-09-27 22:06:54

标签: git merge rebase head

我想做的就是让我的主分支与我的开发分支完全一样。

我试图将我的主人从我的开发分支合并并重新绑定。两种解决方案都不起作用。

我的开发分支有不同的目录结构,事实证明它比我预期的要困难。

Previous Rebase

我在上面的链接中尝试的rebase为测试分支工作,但不是主人。主人是最初的提交,因此没有更新,所以它远远落后。

虽然测试分支和主分支都具有相同的目录结构。我不知道为什么主人没有工作。

在rebase期间,我收到一条错误,说明要查看补丁文件,但我不知道要查找什么。

我正在研究这个问题,并遇到了一些线程,其中的问题是如何更改HEAD所在的分支。

那么,我可以将HEAD更改为开发,然后删除master分支并从develop分支创建一个新分支吗?

在我的情况下,这似乎比试图改变/合并要干净得多。

1 个答案:

答案 0 :(得分:2)

我在评论中放了一堆东西,但回答提出的问题:

  

那么,我可以将HEAD更改为开发,然后删除master分支并从develop分支创建一个新分支吗?

是的,你可以做到这一点。事实上,您甚至不必这样做,您可以强行移动标签master(即,不需要单独的“删除”步骤 - 请参阅下面的第二部分。)

此过程中存储库中的提交将完全不变。例如,在你这样做之前,你可能会开始使用:

                         HEAD
                          |
                          v
o--o--...--o--o     <-- master
    \
     o--o--...--o   <-- develop

在中间,当HEAD指向develop而不是master时,您会得到:

o--o--...--o--o     <-- master
    \
     o--o--...--o   <-- develop
                          ^
                          |
                         HEAD

如果您删除名称master,则可以使用

o--o--...--o--o     [abandoned]
    \
     o--o--...--o   <-- develop
                          ^
                          |
                         HEAD

如果您再添加master作为指向与develop相同的提交的另一个名称,则会得到:

o--o--...--o--o     [abandoned]
    \
     o--o--...--o   <-- develop, master

(此时,如果您愿意,可以将HEAD指回master

如果不实际删除master,您只需将master指向与develop相同的提交即可。有两个命令可以做到这一点;使用哪一个取决于HEAD中的内容。

更明显的命令是:

git branch -f master develop

这告诉Git更改master,以便它现在指向develop点的任何位置。也就是说,这告诉Git使用名称master下存储的哈希ID覆盖名称develop下存储的哈希ID。

如果HEAD当前指向 master,则命令为:

git reset --hard develop

使用git reset的原因是,如果HEAD当前指向master,则表示工作树(及其相应的索引)已设置为与提交匹配其中master分。如果您更改 master指向的提交,而不更改索引和工作树,Git的内部将不同步(不是完全灾难,但可能非常令人困惑)。 git reset --hard的缺点是它消除了你在工作树中所做的任何未提交的工作。这也是git reset --hard优势。 (如果这是你想要的,这是一个优势;如果没有,这是一个缺点。)

(请注意,如果您master上的且您git reset --hard develop,那么您只是强行重新指向您所在的其他分支 on。也就是说,git reset总是影响当前分支。)