2011-12-01 3 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 

올바르게 수행하는 방법을 알려주시겠습니까? 나는 자식, CakePHP, 그리고 MacOSX에서 초보자입니다! 감사.

+0

zip 파일에서 CakePHP를 다운로드했지만 git 저장소에 병합하는 것에 대해 이야기했습니다. 저장소 란 무엇입니까? 그것이 어떻게 생겨 났습니까? – Schwern

+0

케이크 버전을 직접 변경 했습니까? 그렇지 않다면 나는'git fetch; git checkout 2.0.4' (처음에는 cakephp를 가진 git clone이 있다면). –

답변

0

CakePHP 2.0.0을 다운로드하고 압축을 푼 다음 git init, git add ., git commit과 같은 것을 실행하여 저장소를 만드는 것으로 가정합니다. 어쩌면 당신은 그것의 위에 약간 편집을했다 (당신이하지 않았다면, 그냥 버리고, github repo를 복제하고 그로부터 작업하십시오).

중요한 것은 zipball에서 시작한 저장소가 있다는 것입니다.

이제 github 리모컨을 추가하고 가져 왔을 때 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 

각 커밋을 패치로 저장하고 다른 분기에 다시 적용하는 것과 같은 리베이스를 생각해보십시오. 당신은 a1과 b1 사이의 차를 가져 와서 새로운 위탁을 만드는 w1의 위에 그것을 저지하십시오. 그런 다음 diff b1 대 c1을 작성하고 b1을 작성하여 c2를 작성하십시오. 등등.

첫 번째 커밋이 변경되지 않은 zip 파일이 아닌 경우 모두 손실되지 않습니다. 동일한 절차를 사용할 수 있지만 첫 번째 작업을 복구해야합니다. 먼저 첫 번째 커밋과 clean 2.0.0 사이의 diff를 추출해야합니다.

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 master는 이전과 같지만 2.0.4에 직접 적용되는 대신 newmaster 상단에 있습니다.

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

newmaster를 삭제할 수 있습니다.

git branch -d newmaster 

추신 :이 모든 것이 저장소를 시각화 할 수 있으면 더 명확 해집니다. OS X에서 GitX(L)은 repo를 볼 수있는 훌륭한 방법입니다.

+0

이게 답 인 것 같습니다. 나는 rebase 명령에 대해 몰랐다. 나는 이것을 시도하고 나중에 다시 올 것이다. 감사! – pckben

+0

@pckben'rebase'는 힘내에서 가장 강력한 명령 중 하나입니다. 그것은 또한 새로운 사람에게 가장 논쟁적이고 혼란스러운 명령 중 하나입니다. 발가락을 유지하고 GitX를 사용하여 자신의 발목을 시각적으로 따라하십시오. – Schwern