将主头移动到分支

时间:2012-05-25 11:05:53

标签: git version-control branch dvcs branching-and-merging

我有几个功能分支和一个主分支。功能2完成。通常我会改变(使用远程SVN仓库并希望保留历史记录,因此没有定期合并)和ff-merge。但是因为我分支后主人没有改变,所以我想把主人头(E)移到G。使用git branch -f master G不会导致任何可见的更改,我认为这是因为G位于不同的分支上。

在这里使用git update-ref -f master G是否安全?我应该坚持使用rebase / ff-merge吗?还有更好的东西?

feature1      C-D  
             /
master    A-B-E            
               \                      
feature2        F-G  

谢谢。

5 个答案:

答案 0 :(得分:12)

您不必合并分支,重置就足够了。假设主人被签出:

git reset --hard feature2

答案 1 :(得分:8)

不需要合并 - 只需重命名分支。既然你不关心feature2('已完成'),也不关心现有的主人('E')你只需要以下内容。

git branch -d master
git branch -m feature2 master

简单更好?

请记住,涉及两个关键概念:

  1. Git提交图,
  2. Git参考
  3. 当您进行合并(各种风格并包括rebase)时,您正在更改提交图。这些更改涉及添加节点,添加链接或可能移动链接。引用(包括分支和标记)仅指向提交,因此更改引用只会更改指向的提交 - 而不是图的结构。

    因此,在您的情况下,不需要对结构进行任何更改,只需更改引用即可。

    单行版本是:

    git branch -f master feature2
    

    保持feature2分支(不同于之前的两个轴的特征2)。

答案 2 :(得分:8)

定期将G合并到主人身上就可以了,不需要改变:

    feature1      C-D  
                 /
    master    A-B-E            
                   \                      
    feature2        F-G

git checkout master
git merge feature2

    feature1              C-D  
                         /
    master, feature2  A-B-E-F-G

答案 3 :(得分:1)

update-ref是安全的。一个分支头只不过是一个“读我!”标记挂在提交上。纯粹按照惯例,git会把它捡起来,并且有时候会把它挂在不同的提交上。

  

使用git branch -f master G不会导致任何可见的更改

git log --decorate --oneline --all说什么? git show master

答案 4 :(得分:0)

如果您已检出主分支,则最好使用git merge --no-ff feature2执行功能2到主服务器的非快速前向合并。您最终应该使用以下内容

feature1      C-D  
             /
master    A-B-E-----H          
               \   /                   
feature2        F-G