在Git中合并文件

时间:2011-12-01 15:26:52

标签: git github cakephp-2.0

我几周前从他们的主页上下载了CakePHP 2.0 zip包,并开始使用它编写一个网站。现在我想将它升级到CakePHP 2.0.4。我知道我可以下载类似的软件包并手动替换文件,但我认为我应该合并GitHub的版本,以免将来给我带来麻烦。我试过了

git remote add github git://github.com/cakephp/cakephp.git

然后

git merge tags/2.0.4

但它没有用。所有文件都有冲突。例如:

Auto-merging lib/Cake/View/Scaffolds/form.ctp
CONFLICT (add/add): Merge conflict in lib/Cake/View/Scaffolds/form.ctp

你能告诉我怎么做得好吗?我是git,CakePHP和MacOSX的新手!感谢。

1 个答案:

答案 0 :(得分:0)

我假设您下载了CakePHP 2.0.0,解压缩后再运行git initgit add .git commit等内容来创建存储库。也许你做了一些编辑(如果你没有,只是抛出它,克隆github repo并从中工作)。

重要的是你有一个从zipball开始的存储库。

现在当你添加github remote并获取时,github会短暂警告你“警告:没有常见的提交”。这意味着Github上的存储库与您的本地存储库之间没有提交根。

a1 -- b1 -- c1 -- d1 -- e1 -- f1        master

r1 -- s1 -- t1 -- u1 -- v1 -- w1        github/tags/2.0.4

当它合并时,两个存储库之间没有关系。冲突是因为他们两者似乎都添加了具有不同内容的相同文件。

最简单的方法是rebase您的工作在2.0.4标记之上。您可以通过重新设置之外的所有内容来添加zip文件。假设您的第一个提交是a1,而您的分支是主要的。

首先,在主人身上制作一个标签。如果出现严重错误,您可以恢复到该标签。

git tag tmp/master master

然后做转折。

git rebase --onto tags/2.0.4 a1 master

每次提交都将被重写为2.0.4版本的提交。

a1 -- b1 -- c1 -- d1 -- e1 -- f1     tmp/master

r1 -- s1 -- t1 -- u1 -- v1 -- w1     github/tags/2.0.4
                               \
                                - b2 - c2 - d2 - e2 - f2 - g2 - h2   master

想想一个rebase,比如将每个提交保存为补丁并将它们重新应用到另一个分支。你取a1和b1之间的差异,并在w1之上提交一个新的提交b2。然后diff b1 vs c1并在b1之上提交c2。等等。

如果您的第一次提交不是未更改的zip文件,则所有提交都不会丢失。您可以使用相同的过程,但必须恢复第一项工作。首先,您需要在第一次提交和干净的2.0.0之间提取差异。

git diff tags/2.0.0 a1 > first_commit.patch

然后从2.0.4标记中创建一个新分支以保存您的新作品。

git checkout tags/2.0.4
git checkout -b newmaster

申请并提交补丁。

git apply first_commit.patch
git commit -a

现在newmaster包含2.0.4加上你的第一份工作。

现在rebase像以前一样掌握,但在newmaster之上,而不是直接在2.0.4上。

git tag tmp/master master
git rebase --onto newmaster a1 master

您可以删除newmaster。

git branch -d newmaster

PS如果您可以可视化存储库,那么这一切都变得更加清晰。在OS X上,GitX(L)是查看回购的绝佳方式。