繁体   English   中英

GIT :: Merging 2分支用另一个分支覆盖一个分支中的内容

[英]GIT :: Merging 2 branches overwrite the content in one branch with the other

我遇到了一个疯狂的问题。 我把我的整个项目放在分支中。 早些时候,一个人正在研究这个项目,但它是在SVN。 他做了一些改变,我需要将这些改变与我的整合。 两个项目都具有相同的文件夹结构,唯一的区别是使用的VCS类型。 我做了以下

  • 下载了他的代码并删除了.svn文件夹
  • 创建并切换到新分支“code_to_integrate”(指向我的主分支)
  • 复制下载的代码并用它替换我的项目文件夹。(。git文件夹保存为这样)

在这个阶段,如果我运行git status命令,我可以看到更改(文件被标记为已修改)我需要与我的主分支集成。 然后,

  • 在那里提交了那些更改。让它的提交ID为c2
  • 签出到我的主分支。(commit id c1)
  • 将其与“code_to_integrate”分支合并。

结果是我的代码在master分支中被“code_to_integrate”分支中的代码覆盖。 我失去了我的全部修改。 HEAD在c2,我也可以看到c1。 如果我使用

git reset --hard c1,

我会收回我的更改。 现在,它就像使用命令一样

git合并 - 他们的

我从合并分支(code_to_integrate)获得了整个更改,并且在合并分支(master)中丢失了更改。 发生了什么?。 这应该是直截了当的吗? 任何帮助将不胜感激。 提前致谢

问题是,你创建的code_to_integrate分支之上的您master分支。 事情看起来像这样:

... -> oldercommit -> oldcommit -> c1 (master, code_to_integrate)

当你将另一个人的代码提交给这个分支时,你会得到一个线性历史记录:

... -> oldercommit -> oldcommit -> c1 (master) -> c2 (code_to_integrate)

当你现在将code_to_integrate合并到master git中时,检测到c2比c1更新并执行了所谓的快进合并,这基本上意味着只更改master指向c2commit 想象一下code_to_integrate只是你自己做的一个快速分支,例如修复bug。 一旦完成,您将拥有完全相同的历史记录,快速合并将正是您想要的。

为了解决你的问题,你需要告诉git你们哪些旧提交是你和另一个人工作的最新共同祖先。 基本上你需要告诉git在哪个时间点另一个人分支你的master 你这样,通过检查这是最新的承诺, 无论你和其他人在你的历史,然后开始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 ,git会看到有一个不同的历史记录并进行三向合并(其中oldercommit是mergebase),提示你解决可能出现的任何冲突,等等。这就是你想要的!

总而言之,您只是从错误的提交开始了您的code_to_integrate分支。 在不知道mergebase是什么的情况下,git或任何其他版本控制系统无法进行合并。

编辑:如果您没有与其他人分享任何更改,因为您将代码放入git,那么您的mergebase是您历史记录中最早的提交。 以下应该做你想要的:

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

第一个命令检查历史记录中最早的提交,这是您和SVN人员共有的最后一个提交。 第二个命令在最早的提交中创建code_to_integrate分支并切换到它。 然后你将其他人的代码扔进你的工作目录并将其提交给code_to_integrate分支。 最后,切换回master分支并合并其他分支。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM