【发布时间】:2015-03-03 22:23:47
【问题描述】:
我有两个项目最初来自我不再拥有的共同祖先。他们每个人都在他们身边进化了很长时间。现在,我想做一个合并,我想用 git 来做这个。
我创建了这个存储库:
* Project A [BranchA]
| * Project B [BranchB]
|/
* Initial init (Project A)
首先我想识别不同的文件:
git checkout BranchA
git diff --stat BranchB
我可以很容易地从 BranchB 手动合并到 BranchA
git difftool BranchA
并将修改保存在正确的文件中。但是我有时想从 BranchA 和 BranchB 修改这两个文件。例如,如果我注意到 BranchA 上的变量名发生更改,我可以停止合并,替换 BranchB 中的变量名,提交 BranchB 上的更改并继续手动合并。
此时我会迷路,因为我中断了合并,而且我没有留下任何关于我正在处理的文件的痕迹。 git diff --stat BranchB 对我没有帮助,因为即使我成功地将更改从 BranchB 导入到 BranchA,它仍然会存在一些差异。
值得一提的是,我不能使用git merge,因为在 git 上没有可用的共同祖先,因为我在一个空的 git 存储库上导入了两个非常不同的项目。在这种情况下,git merge 会做得很糟糕。所以我正在寻找一个更好的解决方案,以便:
- 使用 difftool 从两个分支浏览每个文件,推送并获取差异,直到两个文件相同。
- 使用 git 跟踪我的更改并在需要时帮助我回滚到以前的版本。
- 使用 git 通过
git diff --stat跟踪合并过程。
我找到的唯一解决方案是初始化一个裸存储库,其中有 BranchA 和 BranchB。然后我将它克隆到两个本地目录中。他们每个人都指向不同的分支。
+-->[ ]<--+ Bare repository
| |
Branch A [ ] [ ] Branch B
| |
+->diff<--+
由此我可以使用我最喜欢的合并/差异工具手动修改两个分支上的文件。我可以随时commit、push、pull 我的工作。
但是我确信有更好的方法来做到这一点。
【问题讨论】:
-
澄清一下:你说你没有共同的祖先,但你真的有no共同祖先吗,或者这更像是一个有共同祖先的情况?古老的“祖先,在你的两个项目中那个祖先和第一次提交之间有很大的差距?
-
@WillPalmer 好点。我真的有一个共同的祖先,但它太老了,我希望忘记它。此外,该项目托管在 ClearCase 上,速度非常慢。可以提取然后将两个分支 + 共同祖先导入 git。
-
我的建议是尝试通过共同祖先进行合并。您想要详细说明设置这种合并所涉及的步骤的答案吗? (“重生”)
-
@WillPalmer 我认为下面的答案已经对我进行合并有很大帮助。我仍然必须选择最佳答案。我仍然感到困惑的是如何进行预合并或停止合并以切换回我目前使用
git diff --stat branchb作为减少差异量的指导的预合并状态。我做这个过程的方式特别痛苦,特别是如果我还必须管理共同的祖先。我的步骤是:1.识别差异,2.结帐A,3.全局替换差异,4.结帐A,5.返回(1)。
标签: git version-control merge