我打算假設您下載了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在第一位)。 –