Remote Repository의 변경 사항이 있을 때마다 fetch 받아서 merge를 하는 것은
왠지 비효율적인 것 같고 불편한 것 같이 느껴진다.

Git이 그런 아이가 아닌데....

물론 이와는 다른 방법이 있다. 편한 방법이...
이에 대해서 하나씩 살펴보자.



1. After merge

   - 앞에서 진행한 내용이후의 상황을 살펴보자.


$ git status
$ git log -4

   - remote의 변경 사항을 fetch 받아서 지금 작업하고 있는 내용에 merge를 한 상황이다.
   - 그런데, [ git status ]를 하면 "Your branch is ahead of 'origin/master' by 2 commits" 라고 보인다.

   - 하나는 local master branch에서 push 하지 않은 commit 이고,
   - 다른 하나는 merge로 인해서 발생한 commit 이다.



2. clean

   - 일단, 다른 것을 확인해보기 위해서 위와 같이 확인을 했다면, 잠시 정리 작업을 진행하자.


$ git push
$ git status

   - local에 남아있는 commits을 remote로 밀어 넣자.
   - [ git status ] 실행 결과가 위와 같이 깔끔해야 한다.



3. pull

   - 앞의 포스팅을 따라했다면, "2nd/bare1repo" 를 만들었을 것이다.
   - 만약에 없다면, 그냥 무시~ ^^


$ git pull


   - remote repository에서 소스를 받아온 후, 아무런 작업이 없었다면 (push 안된 commit이 없는 경우)
   - 위와 같이 그냥 소스코드를 업데이트 하곤 끝이다.



4. remote repository update

   - 오늘 살펴볼 내용을 만들기 위해서 별도의 local에서 작업 후 push하여 remote를 업데이트 해보자.


   - 일단은 모두 정리를 했다면, 위 그림과 같다.


   - 작업을 한 다음에 commit을 하나 했다면 위 그림과 같다.


 

$ git status
$ nano ./readme.txt
$ git commit -a -m "modify readme.txt in master, 2nd"
$ git push


   - 파일 하나 수정 후 commit을 하고, 마지막으로 [ git push ]를 해주자.

   - 위 그림과 같이 "A" commit 상태에서 "B" commit 상태로 'master'와 'origin/master' 모두 변경되었다.



5. git pull

   - 이제 원래 작업하던 local로 변경하여보자.



   - "A" commit 상태였지만, 저 위의 작업으로 인해서 'origin/master'의 실제 상태는 "B" commit 이다.

   - 그런데, master branch에서 소스 수정 후 commit을 하게 되면 어떻게 될까?



   - 이제는 [ git pull ]을 해 볼 시간인데... 어떻게 될까?


   - [ git pull ]을 하게 되면 바로 앞의 포스팅과 같이 'merge commit'을 생성하면서 코드를 섞어준다.


   - 그림으로 살펴보면 위와 같다.



결론은, 아래와 같다.

[ git pull ] = [ git fetch ] + [ git merge origin/master ]

즉, 최신 변경된 내역을 내가 작업하고 있는 것에 반영하기 위해서는 'git pull'을 사용하는 것이 편하다!!!


더불어서, git의 merge는 "3-way merge"라는 방식이다.




헥헥~ 오늘은 내일 '근로자의 날'을 앞두고,
일요일에 진행한 "두산 vs KIA" 경기를 다시보기로 보면서 역전승이라는 드라마에 감동하면서 포스팅하고 있다.
두산 파이팅~!!!

반응형

세입자의 설움으로 전셋집 옮기고 체력고갈,
더불어 진급자 회식 및 결혼 예비 후배들과의 회식들로 인한 추가 체력고갈...
그리고 마지막으로 안또라이들 학습.... 그리고 결정적인 귀차니즘으로 또 다시 오랜만에 찾아온 Git... ^^

조금 더 공부하고 조금 더 분석해야하는데, 그게 말처럼 쉽지가 않다.... 월급쟁이의 비애라고하면 변명이겠지!? ^^


오늘은 remote repository에 대해서 조금 더 알아보고자 한다.


$ git clone /srv/repository/BareRepo.git
$ cd ./BareRepo
$ git remote
$ git remote -v

[ git remote ]라는 명령어는 어떨 때 사용하는걸까!?
어떤 repository의 어떤 branch를 사용하고 있는지 알기 위해서 또는 관리를 위해서 사용하는 명령어이다.

만약 여러 repository를 사용할 경우 그 리스트도 주르륵 보여준다.


여기에서 당연히 의문을 가져야 한다!!!
"여러 repository를 사용"한다고?!

 

$ git remote add other /srv/repository/otherRepo.git
$ git remote
$ git remote -v

이미 "BareRepo.git"을 가져온 상태에서, 그 안에서 [ git remote add ]를 통해서 다른 repository를 가져온 것이다.
'other'라는 것은 임의로 해당 repository를 지칭하는 별명을 지어준 것이다.

본래 있던 것은 'original'이라는 이름이고, 새로 추가한 것은 'other'라는 이름이다.


그러면, 여기에서 또 하나의 의문이 생겨야 한다.

하나의 공간에 2가지의 것이 같이 있으면, 지금 작업하고 있는 것이 어떤 것에 속하는지 어떻게 알려줄까?


$ git fetch other

아직 branch에 대해서 알아보지 않았으므로 이에 대한 설명은 뒤로 넘기겠다.

여하튼, [ git fetch ]라는 명령어를 이용하여 두 가지를 오락가락 할 수 있다!
그런데, 지금 "otherRepo.git"이라는 repository를 넣었다고 했는데 그 파일들은 어디에 있을까?!

지금 사용하고 있는 "otherRepo.git" repository에 들어있는 파일은 "readme.txt"이다.
그런데, "BareRepo.git" repository에도 같은 이름의 파일이 있다.
"혹시 그래서 뭔가 충돌이 난 것은 아닐까?!"라는 생각이 들었다.

그래서, 응급으로 "otherRepo.git"에 "other.txt" 파일을 push해 넣었다.
그런 후 다시 fetch를 해보았다.


다시 fetch를 했음에도 파일 내용은 바뀐 것이 없다.


이 즈음해서 아! 내가 변경 사항을 받아오는 것에 대해서 살펴보지 않았구나~!!!라는 생각이 번뜩!
그래서 바로 직전 글 [ git pull ]에 대해서 블로깅을 했다!!!!


$ git pull
$ git pull other master

그냥 [ git pull ]을 하게 되면 뭔가 받아오는데, 우리가 새로 추가한 repository, otherRepo의 자료는 보이질 않는다.
그러면 어떻게 해야 otherRepo의 내용을 받아올 수 있을까?!

[ git pull other master ]라고 하면 된다.
그런데, 위의 스크린샷을 보면 알겠지만 'CONFLICT'가 발생을 했다.

앞에서도 말했지만, 두 개의 repository에 'readme.txt' 파일이 똑같은 이름으로 존재하고있다.
그래서 충돌이 난 것이다.
보통은 git이 똑똑하게 자동으로 merge를 해주기도 하는데, 위의 경우엔 그것도 실패한 경우이다.



이번 블로그에서는 뭘 배우는 것이 아니라,
앞으로 무엇을 봐야할 지에 대해서 확인하고자 하는 블로깅이다.

[ git pull other master ]라는 명령어에서 'master'라는 것이 무엇인고 하니, 바로 branch 이름이다.
앞으로 branch에 대해서 살펴보도록 하겠다.

그 다음엔 위의 경우처럼 merge를 하는 경우에 대한 것이다.
repository를 여러개를 사용할 경우도 있지만, 주로 서로 다른 branch에서 하나로 merge하는 경우가 더 많을 것이다.


앞으로 하나씩 더 알아가 보도록 하자.

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Git Branch (브랜치) - Local Ⅰ (branch 생성, HEAD)  (0) 2012.04.12
Pro Git 번역본  (0) 2012.03.22
업데이트 - git pull, 중간 정리  (0) 2012.03.17
Remote Repository - git push  (2) 2012.03.04
Git Server - push + 한글  (1) 2012.02.26

앞에서 먼저 설명을 했었어야 했는데,
아무 생각없이 건너뛴 부분이 생각나서 급하게 블로깅을 한다.


우선 기존의 repository들이 정리가 안된 느낌이라서 이번에 새로 repository를 생성해보겠다.


$ mkdir ./bare1repo.git
$ cd ./bare1repo.git
$ git --bare init

이제는 생성한 repository를 clone하여 보자.


$ git clone chani@localhost:/srv/repository/bare1repo.git
$ cd ./bare1repo.git
$ git status

잘 clone 받아온 것을 확인할 수 있다.

지금은 파일이 하나도 없으니, 일단 파일 하나를 추가하고 commit 해보자.


$ nano ./readme.txt
$ git add ./readme.txt
$ git commit -m "create readme.txt"

Remote repository로 변경 사항을 보내보자.


$ git status
$ git push

보내기 위해서 'git push'를 했는데,
error가 발생을 했다.

push를 하기 위해서는 git에게 어떠한 방식으로 push를 할 것인지에 대해서 꼭 알려줘야 한다.
이전에도 한 번 언급을 했지만, 여기에서 다시 한 번 해보자.


$ git config push.default tracking
$ git push

이번에는 잘 되었다!


테스트를 위해서 clone을 하나 더 해보자.


$ mkdir 2nd
$ cd ./2nd
$ git clone chani@localhost:/srv/repository/bare1repo.git

여기 repository에서 파일 하나를 더 추가해보자.


$ nano ./readme1.txt
$ git add ./readme1.txt
$ git commit -m "create readme1.txt"
$ git push


여기에서 새로운 내용을 Remote repository에 넣었으나
이전에 내려 받은 repository에는 당연히 새로 변경된 내용이 반영이 되지 않았다.

그러면 이전에 내려 받은 repository에서 내용을 업데이트 하기 위해서는 어떻게 해야할까?


$ git pull

위 스크린샷을 보면 알겠지만 'git pull'을 하면 만사 OK다.

흐름을 살펴보면 아래와 같다.




여기에서는 바로 'git pull' 하나만 언급하지만, 실제로는 여러가지 작업이 복합되어 있다.

'git fetch'를 통해서 변경 사항을 내려받고, 지금 작업하고 있는 내용에 merge를 하는 과정을
한 방에 처리해주는 것이 바로 'git pull'이다.


나중에 'branch'와 'merge'에 대해서 학습을 하고선 다시 한 번 이 부분을 분석해보도록 하자!!!

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Pro Git 번역본  (0) 2012.03.22
Remote - remote, fetch, pull  (0) 2012.03.19
Remote Repository - git push  (2) 2012.03.04
Git Server - push + 한글  (1) 2012.02.26
Git Server - Remote Connect  (0) 2012.02.25

+ Recent posts