我打算假设您下载了CakePHP 2.0.0,解压缩后运行如git init
,git add .
,git commit
来创建一个存储库。也许你在上面做了一些编辑(如果你没有,就把它扔掉,克隆github回购,并从中工作)。
重要的是你有一个从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
然后做rebase。
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
想像一个基调像将每个提交保存为一个补丁并将它们重新应用到另一个分支。你取a1和b1之间的差异,并在w1之上提交一个新的提交b2。然后比较b1与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)是查看回购的绝佳方式。
你说你从一个zip文件中下载了CakePHP,但后来谈到了合并到一个git仓库。这个存储库是什么?它是如何形成的? – Schwern
你自己对你的蛋糕版本做了什么改变吗?如果不是,我只是做一个'git fetch; git checkout 2.0.4'(如果你有一个git克隆与cakephp在第一位)。 –