Git - Stash Full Commits

时间:2017-05-16 03:28:34

标签: git rebase

有没有办法存储完整的提交(delta,comment等等)?

我的用例是:

  1. 我有一个分支A off master,有10次提交
  2. 我有一个B分支A和两个提交
  3. 我对A进行了更改(使用交互式变基)
  4. 我需要将B重新绑定到A中的新更改,但是有很多手动冲突解决方案
  5. 我想"藏匿"在B中排名前两位,在主人身上进行硬重置,在A上重新绑定,然后弹出我的" stash"
  6. 我知道我可以使用临时分支和樱桃选择,但有没有办法在现场进行?

    更新

    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
         ↑                        ↑         ↑
       master                     A         B
    
    After making changes to A:
    
    1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
         ↑                          ↑     
       master                       A  
    
    Now I'd like for B to look like
    
    1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
         ↑                          ↑         ↑
       master                       A         B    
    

    使用我的挑选解决方案(有没有替代方案,也没有任何冲突?)

    git checkout B
    git branch tmp_B
    
    1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
         ↑                          ↑         ↑
       master                       A         B   
                                            tmp_B
    
    git reset master --hard
    
    1 -> 2
         ↑
       master
         B
    
    git rebase A
    
    1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
         ↑                          ↑     
       master                       A  
                                    B
    
    git cherry-pick 8..9 // no merge conflicts
    git branch -D tmp_B
    
    1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
         ↑                          ↑         ↑
       master                       A         B    
    

1 个答案:

答案 0 :(得分:3)

  

有没有办法存储完整的提交(delta,comment等等)?

据我所知。你会做一个临时分支。提交已经在分支中,因此您已经有效地拥有了所需的内容。

  

我需要将B重新绑定到A中的新更改,但是有很多手动冲突解决方案

采摘樱桃而不是变基不会有帮助,因为重新定位樱桃采摘,它只是一堆樱桃挑选系列。因为Git中的冲突通常是内容冲突的结果,而不是合并算法傻瓜,所以很少有一种巧妙的解决冲突的方法。无论如何,你都必须处理冲突。

你可以从B中选择两个提交而不是重新设置,但除非发生非常奇怪的事情,否则会导致相同的冲突。

请注意,由于看起来您对“A的更改”是交互式rebase的结果,因此您的repo如下所示:

                              A
                              ↓
                 5A -> 6A -> 7A
                /     
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
     ↑                                  ↑
   master                               B

如果您只是git checkout B; git rebase A,那么Git可能会感到困惑。它可能会尝试将提交5到9重新设置为7A。这可能会导致5到5A,以及6和6A之间的冲突。

相反,您可以使用git rebase --onto A 7 B重新定义8和9。这将改变7和B之间的所有内容,但不包括7.实际上,樱桃选择8和9到A.或者你可以git cherry-pick 8 9,但最好习惯git rebase --onto here from to语法因为它更普遍适用于分支机构的任何分支。