合并git更改而不会丢失我的工作

时间:2013-11-24 00:37:13

标签: git version-control github

让我说我去github并从github克隆一个网站项目模板。它可能是任何东西,但我只是为了这个问题提供一个例子。

所以它有一堆文件,如:

index.html
about.html
source
-styles.css
-scripts.js
images
-banner.jpg
-icon3.jpg

所以我从github克隆它,并开始适应我自己的项目。原作者没有参与我正在做的任何事情。只要我们只是谈论我的工作,我就有信心使用git来提交提交,分支和合并分支。所以我已经做了很多工作,可能会添加更多的html页面并编辑一些js&的CSS。

现在,这个项目模板的原作者对原始scripts.js进行了更改(可能修复了一个错误,或者进行了增强或其他操作)。

如何将该更改合并到我的项目中,而不会丢失我对此项目所做的任何工作?所以,让我们说在我的项目和最近推出的一个原始作者之间的scripts.js中有不同的行。有些行会有所不同,因为我自己更改了它们,有些行会有所不同,因为原作者更改了它们。

假设为了我自己的项目,我更改了行34, 78-81, 145, & 213。 原作者将行12, 16-20, 78, & 199更改为错误修复/增强功能。

我想保留对34, 78-81, 145,& 213行的更改。我想将原作者的更改合并到16-20& 199但不是12行,因为我不想进行更改而不是行78,因为我自己更改了。{/ p>

我是否可以进行合并,要求对所有不同的行进行逐行确认?我还能做些什么吗?我还在学习git如何处理冲突。

2 个答案:

答案 0 :(得分:1)

如果你有冲突(你们两个都改变了同一个段落),人类必须决定什么是正确的,一个解决方案,另一个,两者的组合,或者没有什么或完全不同的东西。

如果你拉,合并或重新绑定,git将无法完成此步骤,直到所有冲突都得到解决。

如果您发现冲突并且合并未完成,只需在命令行中键入“git mergetool”即可。如果您安装了像meld或vimdiff这样的差异查看器,git将打开它,您可以解决冲突。如果您没有合并工具,则可以手动更改文件,冲突将在文本中标记。

当您确信所有冲突都已解决时,您可以通过添加已解析的文件git git add来清理暂存区域。当一切都是绿色时,只需提交合并结果即可。它是一个rebase,你必须键入“git rebase - continue”而不是提交。

无论如何只是按照git的命令行提示来处理这种情况,每个星期都没问题。

不要让自己承受太多压力。您只能在提交所有内容或以其他方式清理(例如使用存储)时启动合并。如果你已经提交了所有东西,那就完全保存了,你不能破坏任何东西。只需在合并之前将分支重置为提交。 (对于rebase来说,它有点不同,取决于你如何变形,这在这里会很远)

如果这对你来说压力过大,你也可以给原始的develeloper一个拉取请求,或者给他发送一个/多个补丁文本文件,让他进行整合。

答案 1 :(得分:1)

  

假设我更改了第34,78-81,145和第3行。 213用于我自己的项目。原作者更改了第12,16-20,78行和第10行。 199作为错误修复/增强功能。

只有一个人更改过的行会自动合并。你们两个都改变的行会导致冲突:git无法知道应该保留哪些更改,你必须自己说明。

当没有冲突时,git会执行必要的更改并提交它们。当发生冲突时,git会在冲突的文件中添加一些标记,如下所示:

<<<<<<< HEAD
... stuff
... that
... the current branch did
=======
... stuff that
... the other branch did
>>>>>>> name_of_the_other_branch

所以这里的git无法判断哪个块应该是正确的,你必须选择一个或多个通常将两者结合起来。当然,您还必须删除<<<<<<< === >>>>>>>标记,有时也称为鱼骨标记

由于git没有提交合并,你必须进行这些更改并自行提交。

PS:图形合并工具可以帮助解决合并冲突。它值得拥有自己的文章,the help page of the mergetool command应该让你开始。

  

我是否可以进行合并,要求对所有不同的行进行逐行确认?

不是我所知道的,而且我认为无论如何都不会有太多用处。从单一变更中可能很难或不可能理解其作者的意图,通常您需要考虑全部变更。请记住,如果没有冲突,git将自动提交合并。

如果您想先查看更改,请使用git merge --no-commit。在某些情况下,您可能还需要--no-ff标志。如果存在冲突,则git diff会显示冲突的区域,并且由于自动合并的更改已暂存,您可以使用git diff --cached查看它们。这样你就可以(实际上,你应该!)逐行检查改变了什么。 (要在自动合并后查看详细信息,您可以简单地git show,因为它显示了上次提交的差异,在这种情况下是合并。)