我遇到了一个疯狂的问题。 我的整个项目都在主分支中。早些时候,一个人正在研究这个项目,但它是在SVN。他做了一些改变,我需要将这些改变与我的整合。两个项目都具有相同的文件夹结构,唯一的区别是使用的VCS类型。我做了以下
在这个阶段,如果我运行git status命令,我可以看到更改(文件被标记为已修改)我需要与我的主分支集成。然后,
结果是我的代码在master分支中被“code_to_integrate”分支中的代码覆盖。我失去了我的全部修改。 HEAD在c2,我也可以看到c1。如果我使用
git reset --hard c1,
我会收回我的更改。 现在,它就像使用命令
git merge -s theirs
我从合并分支(code_to_integrate)获得了整个更改,并且在合并分支(master)中丢失了更改。发生了什么?。这应该是直截了当的吗? 任何帮助将不胜感激。提前致谢
答案 0 :(得分:1)
问题是您在code_to_integrate
分支之上创建了master
分支。事情看起来像这样:
... -> oldercommit -> oldcommit -> c1 (master, code_to_integrate)
当你将其他人的代码提交到这个分支时,你会得到一个线性历史:
... -> oldercommit -> oldcommit -> c1 (master) -> c2 (code_to_integrate)
当您现在将code_to_integrate
合并到主git中时,检测到c2
比c1更新并执行了所谓的快进合并,这基本上意味着只更改commit
master
c2
1}}指向code_to_integrate
。想象一下,master
只是你自己做的一个快速分支,例如,修复一个bug。一旦完成,你将拥有完全相同的历史记录,快进合并将正是你想要的。
为了解决你的问题,你需要告诉git你们哪些旧提交是你和另一个人工作的最新共同祖先。基本上你需要告诉git在哪个时间点另一个人分支你的code_to_integrate
。您这样通过检查哪个是两者您和其他人在您的历史记录中的最新提交,然后在那里启动oldercommit
分支。假设另一个人在git checkout oldercommit
分支,你会做一个git checkout -b code_to_integrate
后跟一个... -> oldercommit (code_to_integrate) -> oldcommit -> c1 (master)
并且应该得到这样的东西。
-> c2 (code_to_integrate)
/
... -> oldercommit -> oldcommit -> c1 (master)
一旦你提交了另一个人的版本,你就得到了:
code_to_integrate
当您现在将master
合并到oldercommit
时,git会看到存在不同的历史记录并进行三向合并(其中code_to_integrate
是合并库),提示您解决可能出现的任何冲突,等等。这就是你想要的!
总而言之,您只是从错误的提交中启动了git checkout $(git rev-list --all | tail -n 1)
git checkout -b code_to_integrate
[ ... put the other guys code into your working directory and commit it ... ]
git checkout master
git merge code_to_integrate
分支。在不知道mergebase是什么的情况下,git或任何其他版本控制系统都无法进行合并。
编辑:如果你没有与其他人分享任何更改,因为你将代码放入git,那么你的mergebase是你历史上最早的提交。以下应该做你想要的:
code_to_integrate
第一个命令检查历史记录中最早的提交,这是您和SVN人员共同拥有的最后一个提交。第二个命令在最早的提交中创建code_to_integrate
分支并切换到它。然后将其他人代码扔到您的工作目录中并将其提交到master
分支。最后,切换回{{1}}分支并合并另一个分支。