Git 重基不是';I don’我没有按预期工作,也许我应该尝试另一种方法

Git 重基不是';I don’我没有按预期工作,也许我应该尝试另一种方法,git,merge,rebase,head,Git,Merge,Rebase,Head,我想做的就是让我的主分支完全像我的开发分支一样 我试图合并我的开发分支的主控并重新设置其基础。两种解决方案都不起作用 我的开发分支有一个不同的目录结构,它被证明比我预期的更困难 我在上面的链接中尝试的rebase对测试分支有效,但对主分支无效。主服务器是最初提交的服务器,从那以后就没有更新过,所以它远远落后 尽管测试分支和主分支具有相同的目录结构。我不知道师父为什么不工作 在rebase期间,我收到一个错误,声明要在补丁文件中查找,但我不知道要查找什么 我在研究这个问题时遇到了一些问题,其中的

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

我试图合并我的开发分支的主控并重新设置其基础。两种解决方案都不起作用

我的开发分支有一个不同的目录结构,它被证明比我预期的更困难

我在上面的链接中尝试的rebase对测试分支有效,但对主分支无效。主服务器是最初提交的服务器,从那以后就没有更新过,所以它远远落后

尽管测试分支和主分支具有相同的目录结构。我不知道师父为什么不工作

在rebase期间,我收到一个错误,声明要在补丁文件中查找,但我不知道要查找什么

我在研究这个问题时遇到了一些问题,其中的问题是如何改变头部所在的分支

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


在我的情况下,这似乎比尝试重新设置基础/合并要干净得多。

我在评论中添加了一大堆内容,但为了回答提出的问题:

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

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

存储库中的提交将通过此过程保持不变。例如,在执行此操作之前,您可以从以下内容开始:

                         HEAD
                          |
                          v
o--o--...--o--o     <-- master
    \
     o--o--...--o   <-- develop
如果随后删除名称
master
,则会出现以下情况:

o--o--...--o--o     [abandoned]
    \
     o--o--...--o   <-- develop
                          ^
                          |
                         HEAD
(此时,如果您愿意,您可以将
指向
主控


无需实际删除
master
,只需将
master
指向与
develope
相同的提交即可。有两个命令可以做到这一点;使用哪一个取决于
头部的内容

更明显的命令是:

git branch -f master develop
git reset --hard develop
这告诉Git更改
master
,以便它现在指向
develope
点所在的位置。也就是说,这告诉Git使用存储在名称
develope
下的散列ID覆盖存储在名称
master
下的散列ID

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

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


(请注意,如果您不在
master
上,并且您
git reset--hard develope
,那么您只需强制重新指向您所在的任何其他分支。也就是说,
git reset
始终影响当前分支。)

我在注释中添加了一些内容,但为了回答提出的问题:

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

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

存储库中的提交将通过此过程保持不变。例如,在执行此操作之前,您可以从以下内容开始:

                         HEAD
                          |
                          v
o--o--...--o--o     <-- master
    \
     o--o--...--o   <-- develop
如果随后删除名称
master
,则会出现以下情况:

o--o--...--o--o     [abandoned]
    \
     o--o--...--o   <-- develop
                          ^
                          |
                         HEAD
(此时,如果您愿意,您可以将
指向
主控


无需实际删除
master
,只需将
master
指向与
develope
相同的提交即可。有两个命令可以做到这一点;使用哪一个取决于
头部的内容

更明显的命令是:

git branch -f master develop
git reset --hard develop
这告诉Git更改
master
,以便它现在指向
develope
点所在的位置。也就是说,这告诉Git使用存储在名称
develope
下的散列ID覆盖存储在名称
master
下的散列ID

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

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


(请注意,如果您不在
master
上,并且您
git reset--hard develope
,那么您只需强制重新指向您所在的任何其他分支。也就是说,
git reset
始终影响当前分支。)

如果
master
develope
是其他分支的祖先,则无需重新设置基础;您只需`git checkout$OLDBRANCH;git重置——硬$NEWBRANCH`。但我不确定,因为我无法理解您的分支结构