首页 > 解决方案 > 如何将一大块提交重新定位到另一个提交?

问题描述

我在 Git 中有一个非常丑陋的情况,在我的devel分支中我有

* deadbeef 1 hour ago (devel)
|
* ... (a bunch of commits)
|
* d5fca6e 11 days ago
*   8ca4341 11 days ago   Merge branch 
|\
| *   844d521 11 days ago    Merge Branch
| |\
| * | bdded77 11 days ago  
* | | 514e1e3 11 days ago  
* | | 61c8a0a 11 days ago  
* | | 1a155e8 11 days ago  
| |/
|/|
* | 19eeb57 11 days ago 
* | 0f6e367 11 days ago 
|/
* bb1ca0d 11 days ago   

我想得到

* bdded77' 11 days ago  
* 514e1e3' 11 days ago  
* 61c8a0a' 11 days ago  
* 1a155e8' 11 days ago  
* 19eeb57' 11 days ago 
* 0f6e367' 11 days ago 
* bb1ca0d 11 days ago  

我试图简单地cherry-pick提交以使更改线性化:

git checkout bb1ca0d
git cherry-pick 0f6e367 
git cherry-pick 19eeb57 
git cherry-pick 1a155e8
git cherry-pick 61c8a0a
git cherry-pick 514e1e3
git cherry-pick bdded77

在那之后,我需要在它的顶部重新调整其余部分我尝试的是

git cherry-pick d5fca6e..devel

我遇到了很多冲突,所以也许这个樱桃选择不会像这样工作。但是:git diff bdded77 HEAD没有向我展示任何东西。

我应该如何处理?

编辑

我发现我在最后一次挑选樱桃时犯了错误。我应该写:

git cherry-pick d5fca6e^..deadbeef 

最初的问题仍然存在,是否有更好的解决方案?

标签: gitrebase

解决方案


解决方案很好,但cherry-pick必须使用包含当前HEAD.

*   (c)
*   (b)
*   (a)
| * (a', HEAD)
|/
* 

在这里你应该写:

git cherry-pick b^..c

其中b^a的是您拥有的提交范围是:

a^..c === b, c

完成此操作后,您将获得:

* (c)
* (b)
* (a)
| * (c', HEAD)
| * (b')
| * (a')
|/
* 

推荐阅读