2011-12-01 119 views
0

幾周前我從他們的主頁下載了CakePHP 2.0 zip包,並開始用它編碼一個網站。現在我想升級到CakePHP 2.0.4。我知道我可以下載類似的軟件包並手動替換文件,但認爲我應該合併GitHub的版本以便在將來爲我節省麻煩。我試圖在Git中合併文件

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的新手!謝謝。

+0

你說你從一個zip文件中下載了CakePHP,但後來談到了合併到一個git倉庫。這個存儲庫是什麼?它是如何形成的? – Schwern

+0

你自己對你的蛋糕版本做了什麼改變嗎?如果不是,我只是做一個'git fetch; git checkout 2.0.4'(如果你有一個git克隆與cakephp在第一位)。 –

回答

0

我打算假設您下載了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)是查看回購的絕佳方式。

+0

看起來這是答案。我不知道「rebase」命令。我會試試這個,稍後再回來。謝謝! – pckben

+0

@pckben'rebase'是Git最強大的命令之一。這也是對新來者最有爭議和最迷惑的命令之一。保持你的腳趾,並使用Gi​​tX視覺上遵循它在做什麼。 – Schwern