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

Shi*_*bin 6 svn git version-control merge

我遇到了一个疯狂的问题.我把我的整个项目放在分支中.早些时候,一个人正在研究这个项目,但它是在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)中丢失了更改.发生了什么?.这应该是直截了当的吗?任何帮助将不胜感激.提前致谢

Rob*_*ger 1

问题是您在分支code_to_integrate之上创建了分支master。所以事情看起来像这样:

... -> oldercommit -> oldcommit -> c1 (master, code_to_integrate)
Run Code Online (Sandbox Code Playgroud)

然后,当您将其他人的代码提交到该分支时,您会得到线性历史记录:

... -> oldercommit -> oldcommit -> c1 (master) -> c2 (code_to_integrate)
Run Code Online (Sandbox Code Playgroud)

当您现在合并code_to_integrate到 master git 时,检测到它c2比 c1 新,并进行了所谓的快进合并,这基本上意味着仅更改commit指向masterc2。想象一下,code_to_integrate这只是您自己创建的一个快速分支,用于执行一些工作,例如修复错误。完成后,您将拥有完全相同的历史记录,并且快进合并正是您想要的。

为了解决你的问题,你需要告诉 git 你们中的哪个旧提交是你和另一个人的工作的最新共同祖先。基本上你需要告诉 git 另一个人在哪个时间点分支了你的master. 您可以通过检查您和其他人在您的历史记录中拥有的最新提交然后code_to_integrate在那里启动分支。假设另一个人在 处分支oldercommit,你会先执行 a,git checkout oldercommit然后执行 a git checkout -b code_to_integrate,并且应该得到类似这样的结果。

... -> oldercommit (code_to_integrate) -> oldcommit -> c1 (master)
Run Code Online (Sandbox Code Playgroud)

一旦你提交了其他人的版本,你就会得到:

             -> c2 (code_to_integrate)
            /
... -> oldercommit -> oldcommit -> c1 (master)
Run Code Online (Sandbox Code Playgroud)

当你现在合并code_to_integrate到 时master,git 会看到存在发散的历史记录并进行三向合并(oldercommitmergebase 在哪里),提示你解决可能出现的任何冲突等。这就是你想要的!

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

编辑:如果自从您将代码放入 git 以来您没有与其他人共享任何更改,那么您的合并库就是您历史上最旧的提交。以下应该做你想做的事:

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
Run Code Online (Sandbox Code Playgroud)

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