我有一个很长的线性git历史。我想重新设置一些提交,所以就好像我创建了一个功能分支,并使用git merge --no-ff master
将其合并回主设备。
当前
A -> B -> C -> D -> E -> F
master
所需
master
A -> B -> E -> F
\ /
C -> D
feature
我想做点什么
git checkout D
git checkout -b feature
git rebase B
git merge --no-ff E
但是D
在其历史记录中已经有B
,所以这并没有做任何事情。我知道如何从E
(Split a git branch into two branches?)重新B
,但在这里,E
的所需版本有两个父母。
一些额外的细节是我的项目最初的结构类似于Desired
,而E
实际上是一个合并提交。然后我以某种方式使用git rebase
线性化了我的历史记录,从旧提交中删除了一些不需要的文件。
答案 0 :(得分:1)
您可以通过将master重置为private static final String SERVER_DATE_FORMAT = "yyyy-MM-dd HH:mm:ssZ";
public static Date javaDateFromStringDate(String stringDate) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(SERVER_DATE_FORMAT, Locale.getDefault());
return format.parse(stringDate);
}
来创建合并提交B
来执行此操作:
E
git checkout D
git checkout -b feature
git checkout master
master
A -> B -> C -> D -> E -> F
feature
git reset --hard B
master
A -> B
\
C -> D
feature
git merge --no-ff feature
master
A -> B -> E
\ /
C -> D
feature
也许不是最短的解决方案,但它以正确的顺序执行,因此更容易理解。
注意:不要忘记将git cherry-pick F
master
A -> B -> E -> F
\ /
C -> D
feature
的哈希保存在某处,因为F
会使其成为悬空提交。
答案 1 :(得分:0)
git checkout -b feature D
git checkout -b master F
git rebase -i B # change pick C, pick D to drop C, drop D
git merge D