Git - 存储全部提交

Git - Stash Full Commits

有什么方法可以存储完整的提交(增量、注释等...)吗?

我的用例是:

  1. 我有一个分支 A off master 有 10 次提交
  2. 我在 A 之外有一个分支 B,有两个提交
  3. 我对 A 进行了更改(使用交互式变基)
  4. 我需要将 B 变基到 A 中的新更改上,但是有很多手动冲突解决方法
  5. 我想 "stash" B 中的前两个提交,硬重置到 master,变基到 A,然后弹出我的 "stash"

我知道我可以使用临时分支和 cherry-pick,但是有什么方法可以就地完成吗?

更新:

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    

Is there any way to stash full commits (delta, comment, etc...)?

据我所知没有。你会创建一个临时分支。提交已经在一个分支中,因此您实际上已经拥有了所需的内容。

I need to rebase B onto the new changes in A, but there is a lot of manual conflict resolution

Cherry picking 而不是 rebase 将无济于事,因为 rebase cherry picking,它只是一系列连续的 cherry picking。因为 Git 中的冲突通常是内容冲突的结果,而不是合并算法错误,所以很少有解决冲突的巧妙方法。无论哪种方式,您都必须处理冲突。

您可以从 B 中挑选两个提交而不是变基,但除非发生非常奇怪的事情,否则将导致相同的冲突。


请注意,因为看起来您的 "changes to A" 是交互式变基的结果,所以您的存储库看起来像这样:

                              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 语法因为它更普遍地适用于分支的任何分支。