A 라는 브랜치에서 B 의 브랜치를 merge 하는 경우라고 치면

$ git checkout A 
$ git merge B

로 A 에다가 B 내용을 merge 하는 명령입니다.

<<<<<<< HEAD
머지 (merge) 가 될 대상 브랜치 이다. 대부분의 경우에는 내가 작업하기 위해서 체크 아웃한 브랜치다. (즉 내꺼, HEAD) 

|||||||

=======
합쳐질 브랜치이다. 

>>>>>>>

즉 위쪽에 있는 것이 (보통 git 에서는 HEAD 라고 붙어 있습니다.) 현재 내가 작업하던 브랜치 , 아래쪽이 다른 브랜치 (pull 명령중이면 리모트 브랜치)의 내용이니 비교해서 적용하면 됨

리모트 브랜치 그대로 업데이트

외부의 소스를 받아서 변경점 그대로 업데이트 하고 싶을 때가 있습니다. 즉 외부 소스를 받아서 컴파일을 해서 사용하는 경우인데 변경된 점이 남아 있어서 'git pull' 명령을 쓰자니 컴파일을 위해서 생성된 파일들과 merge 가 되버려서 관리가 힘든 경우가 있지요. 이때 지금 변경된 것을 무시하고 리모트 브랜치로 강제로 변경하는 방법에 대해서 알아보겠습니다.

GIT 가이드

에 가시면 자세한 git 사용법에 대해서 배울 수가 있습니다. 사실 이 명령도 거기서 나온 방법이지요.

$ git fetch origin
$ git reset --hard origin/master

자주 안 쓸거 같아서 알고만 있었는데 의외로 자주 사용하게 되더군요.




저는 Command Line 에서 GIT 을 쓰고 있습니다. '뭐든지 가장 기본이 되는 것부터 마스터를 하자!' 라고 평소 떠들고 다니기도 하지만, CLI (Command Line Interface) 가 가장 마음이 편안해 (?) 지는 환경이기 때문이도 합니다. 그러나 Eclipse 에서 개발이 최적화 되어 있는 분들은 어떤 방식이 되도 무조건 Eclipse 에서 돌아가길 원합니다. (진정한 IDE 라고 할 수 있죠) 그런분들에게 추천하고 싶은 포스트가 있습니다. 

http://www.vogella.com/articles/EGit/

일단 포스트 주소입니다. 그리고 이 포스트와는 별도로 저 분의 사이트는 안드로이드 개발하는 분들에게 참조가 될 만한 내용을 정말 많이 가지고 있어서 즐겨찾기 해두시고 가끔가다 찾으시면 효율이 좋을 것입니다. 

 
색이 나오고 안 나오고의 차이가 무지 큽니다. 세팅도 쉽습니다. 

$ git config --global color.ui true



위에 것만  Command Line 상에서 쳐 주시면 끝!!  
GIT 은 소스 레파지토리 시스템인데 그 중에 특별히 '분산' 개념이 들어가 있습니다. 다른 레파지토리랑 (cvs, svn) 비교를 많이 하지만 '분산' 이라는 점에서 많은 차별점이 있습니다. 원래 태어날 때도 여타 소스 레파지토리에 '분산' 기능이 없기 때문에 태어났기도 합니다. 

조금 쉽게 이해를 하자면, GIT 은 기본적으로 제 Local 에 레파지토리를 가지고 있는 방식이라고 볼 수 있습니다. 즉 중앙 개념이 희박합니다. Local 에서 리비젼 관리가 완벽하게 이루어 집니다. Remote (원격) 개념은 공동 작업을 할 때 필요하다고 보면 될 것입니다. 결국 push / pull 은 원격에만 관여하는 것이고 나머지 기능들은 Local 에서 소스 관리하는 기능이라고 보시면 됩니다. (자질 구레한 것은 따지지 말기로 하죠 ㅎㅎ)

그렇다면 가장 헷갈리기도 하고 잘 쓰기가 어려운 merge / branch 개념을 git 에서는 필수적으로 사용할 줄 알아야 하는데 그 내용을 살펴보기로 하겠습니다. 

시나리오

1. 웹 사이트에서 일을 하는 중 
2. 새로운 스토리에 맞춰서 브랜치를 생성함
3. 위에서 생성한 브랜치에 무엇인가 작업을 하는중 

 이슈가 발생하고 핫픽스를 (hotfix) 해야 합니다. 이는 다음과 같은 절차로 할 수가 있습니다. 

1. 운영 브랜치로 바꾸고
2. 핫픽스를 추가할 브랜치를 생성합니다. 
3. 핫픽스가 테스트 됐다면,  핫픽스 를 머지(merge) 하고, 운영 브랜치로 밀어넣습니다. (push)
4. 원래 하던 작업으로 돌아가서 계속 일을 합니다. 


커밋이 세번 일어난 브랜치라고 가정합니다. 세번째 커밋을 master 가 가르키고 있는것에 주목합니다. 이 때 이슈가 발생했습니다. 이슈를 처리하기 위해서 브랜치를 만듭니다. 

$ git checkout -b iss53
Switched to a new branch "iss53"


iss53 으로 브랜치를 만듭니다. 이 명령은 실은 두가지 명령이 하나로 합쳐진 것입니다. 

$ git branch iss53
$ git checkout iss53


이렇게 하는 것이지만 귀찮으니 축약 버젼을 쓰기로 합니다. 



iss53 브랜치가 생성 됐기 때문에 2개의 브랜치가 공존하는 형태가 됩니다. C/C++ 언어의 포인터 개념과 비슷하군요 

그리고 그 브랜치에서 무엇인가 작업을 하고 커밋을 합니다. 가령 예를 들자면 

$ emacs index.html 
$ git commit -a -m 'added a new footer [issue 53]'


이런식으로 (원문의 vim 을 emacs 로 바꿨습니다.)



이제 이 와 같이 브랜치의 모습이 바꼈을 것입니다. 이제 작업한 내용을 합쳐야 합니다. 다시 master 브랜치로 바꾸어 줍니다. 

$ git checkout master
Switched to branch "master"

이제 핫픽스 해줘야 하는 경우 입니다. 브랜치를 만들고 수정을 가하고 commit 을 합니다. 

$ git checkout -b hotfix
Switched to a new branch "hotfix"
$ emacs index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix]: created 3a0874c: "fixed the broken email address"
1 files changed, 0 insertions(+), 1 deletions(-)





이 과정이 끝나면 위와 같은 형태로 브랜치들이 정리될 것입니다. 이제 머지(merge)를 해야 할 시간이 왔습니다. 

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast forward
README |    1 -
1 files changed, 0 insertions(+), 1 deletions(-)


master 로 브랜치를 변경하고 합치는 것에 유의하셔야 합니다. 



master 와 hotfix 브랜치가 같은 곳을 지정하고 있습니다. 이제 브랜치(포인터) 하나를 삭제해 줍니다. 

$ git branch -d hotfix
Deleted branch hotfix (3a0874c).



그리고 다시 원래 하던 작업으로 돌아가서 작업을 계속 합니다. 

$ git checkout iss53
Switched to branch "iss53"
$ emacs index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53]: created ad82d7a: "finished the new footer [issue 53]"
1 files changed, 1 insertions(+), 0 deletions(-)




그러면 위와 같은 형태의 브랜치 모습이 될 것입니다. 

구체적으로 merge 부분을 자세하게 보는 것과 컨플릭트(conflict)를 해결하는 방법은 원문을 살펴 보세요 

https://github.com/ 를 이용하면 좋지만 대중에게 공개를 하지 않고 나만의 공간에 git 서버가 있으면  좋겠다고 생각하신 분들이 있을 것입니다. 그런 분들을 위한 개인적인 세팅방법을 알려드리겠습니다. 

저도 사실은 얼마전까지 svn (subversion) 을 사용하는 사람중에 한명이였습니다. 개발 환경 세팅 과 업무에 필요한 자료 & 개인적인 메모들을 svn 서버에 올려다 두고 어디서건 동기화 시켜서 바로 업무에 활용할 수 있게 설정해 두고 있었습니다. 그러던 와중에 기생하고 있던 서버가 사라지는 바람에 개인적인 서버를 가지게 되었고 개인 서버를 가지게 된 김에 git 서버를 설치하자고 생각해서 이리 설치하게 되었습니다. 
 

1. git 서버가 설치될 위치에 git 를 설치합니다.
 

 $ sudo apt-get install git-core 


2. git 를 위한 계정을 만들고 접근할 때 필요한 패스워드를 설정해 줍니다. 

 

$ sudo adduser --system --shell /bin/bash --gecos 'git version control' --group --home /home/git git

 $ sudo passwd git 

   패스워드 입력..


3. git 프로젝트들이 저장될 디렉토리 생성합니다. 
 

 $ sudo -u git mkdir /home/git/repos 


 긴건 귀찮으니까 간단하게 repos (repositories의 약자라는 개념으로..) 라고 합니다. sudo -u git 는 그 작업을 git 계정으로 하라는 명령입니다.


4. 서버에 올릴 프로젝트를 한개 만들어 줍니다. /home/crazia/doc 이라고 텍스트 문서들이 저장된 디렉토리를 올린다고 가정을합니다. 


 $ cd /home/crazia 

 $ git init doc 

 $ cd doc

 $ git add .

 $ git commit -a -m "doc init" 


 doc 이라는 이름으로 프로젝트를 만들어 주라는 명령입니다. 

 doc 안에 있는 모든 (하부 디렉토리까지 전부) 파일을 더해줘서 서버랑 상관 없이 로컬에 커밋을 하라는 명령입니다. 


5. 서버에 git daemon 을 띄워 줍니다. 


 $ sudo -u git git daemon --export-all --syslog --base-path=/home/git/repos --reuseaddr --detach


 git 계정으로 git 를 daemon 으로 한개 띄우라는 것입니다. 다른 것은 그냥 써주시면 되고 --base-path 로 3 번에서 만들어 준 저장소를 지정해 줍니다. 이 데몬은 항상 서버에 띄워져 있어야 합니다. 


6. 4번에서 만들어준 프로젝트를 저장소로 옮겨주는 작업을 합니다. 


 $ cd /home/git/repos

 $ sudo -u git git clone --bare /home/crazia/doc 굵게


 4번에서 만들어준 프로젝트의 복사본이 /home/git/repos 안에 생성 됐습니다. 


7. 데몬을 통해서 접근이 가능할 수 있도록 간단한 추가 작업을 해 줍니다. 


 $ cd /home/git/repos/doc.git

 $ sudo -u git touch git-daemon-export-ok


자 이제 서버에서 설정해 주는 일은 끝났습니다. 이제 클라이언트에서 제대로 설정이 됐는지 테스트를 해 보겠습니다. 


 $ git clone git@HOSTNAME:repos/doc.git 


물어보는 비밀 번호에 답하면 프로젝트가 받아 질것입니다. 

 HOSTNAME git 서버를 설치한 서버의 호스트 네임 입니다. ip 번호로 쓰셔도 됩니다. 

 repos 는 서버에서 만들어준 repos 의 이름입니다. 

 doc.git 는 서버에서 만들어준 프로젝트의 이름입니다. (제 경우라서 doc.git)로 설정해 줬습니다. 


혹시나 SK 브로드밴드의 일부 지역에서는 SSH 의 기본 포트인 22 번을 쓸 수가 없습니다. 망 차원에서 막혀있더군요 (이것 때문에 몇시간을 고생했는지.. ㅜ.ㅜ ) 그래서 다른 포트를 부득이 하게 쓰고 계신 분들은 (서버쪽 /etc/ssh/sshd_config 에서 Port 값을 변경하신 경우겠지요?) 

 git 는 기본적으로 ssh 를 이용해서 파일을 가져오는 데 포트를 변경해서 서비스 하는 경우에는 포트값을 입력할 수가 없겠지요? 따라서 클라이언트의 

 

 $ emacs $HOME/.ssh/config 


 를 열고 아래와 같이 추가해 줍니다. 


 Host  super.mavel.com

      User crazia

      Hostname super.mavel.com

      Port 2222


super.mavel.com 은 서비스하는 호스트 이름이고 Port 가 변경해준 포트 입니다. 여기서는 2222 입니다. 



+ Recent posts