Git合并并保持独立?

时间:2011-01-05 22:25:59

标签: git

有没有办法用另一个(主人或其他人)的信息更新一个分支,然后继续这两个?像一个rebase,但保留旧数据?

原件:

A---B---C---G---H  master
     \           
      D---E---F  branchA

结果:

A---B---C---G---H---L  master
     \           \
      D---E---F---J---K  branchA

这样branchA从提交C,G和H获取信息,(提交J就是合并),这样提交K仍然是一个侧分支(并且将来提交L仍然在主服务器上),但是有来自master的更新信息吗?

我不想做一个rebase,因为那最终会得到:

A---B---C---G---H---L  master
                 \
                  D'---E'---F'---K  branchA

创建D,E和F的“新版本”,好像它们发生在H而不是B之上,而问题是提交C和E是重命名中的密钥文件夹的重命名,并且我想将它们合并在一起,而尚未合并来自branchA的其他功能更新。重新定位意味着H使用新文件夹名称,D'创建旧文件夹名称,E'再次删除它,这不是最干净的。

关键是我想要在过去重命名该文件夹(C和E)并停止向前推进。这有道理吗?我向后看这个吗?或者我应该只处理凌乱的rebase“name,rename”技巧,直到分支合并为止?

2 个答案:

答案 0 :(得分:19)

如果您的历史记录在master上为H或L,在branchA上为F(即J和K尚不存在),则是,只需检查分支A并合并:

git checkout branchA
git merge H   # Use H's commit identifier if it's not the tip of master

这会将更改合并到branchA中,并且根本不会打扰主分支。

如果您已经创建了提交K并且想要在它和F之间插入合并,那么还有一些工作要做:

git checkout -b temp F   # Create a new branch at commit F
git merge H              # Merge from commit H into the new branch
git cherry-pick K        # Apply the K commit to the merged commit

# And the rest simply replaces the temp branch with branchA
git checkout branchA
git reset --hard temp
git branch -d temp

在这两种情况下,如果您稍后在任一方向合并,则提交H将是两个历史分支的最近共同祖先,因此在决定如何时,将来的合并将不会超过此提交(或过去J到F)合并。

答案 1 :(得分:2)

git merge master上的简单branchA应该执行(或git merge H H其中H是H的commit-ref,如果C不是主要的最新版本。

如果E和{{1}}重命名您必须解决的同一文件夹,则会发生冲突,但除此之外,您应该没问题。