저번에 이야기 했던 대로 이번 포스팅에서는 브랜치의 정보를 확인하는 방법, 병합하는 방법에 대해서 포스팅을 할 예정이다. 

 

 

브랜치 정보 확인하기

 

만약 git bash를 저번 포스팅 이후 껐다가 다시 켠 것이라면, 일단 manual 디렉토리로 들어가서 git branch를 이용해서 확인을 해보고,  apple로 현재 HEAD가 가리키고 있는 것을 바꾸자. 
(저번 포스팅 이후 별다른 변화 없이 했다면 아마 ms를 가리키고 있을 것이다. )

$ cd manual 
$ git branch
$ git checkout apple

 

work.txt에 'apple content 4'를 추가 입력하여 저장하고, 새로운 텍스트 파일 apple.txt를 vim을 이용해서 생성한다. 이때 안의 내용은 마찬가지로  'apple content 4'를 입력하고 저장한다. 

$ vim work.txt
$ vim apple.txt

 

파일을 생성한 이후 각각을 git add를 통해서 올릴수도 있지만, git add .를 이용해서 현재까지 저장소에서 수정되거나 생성되어진 파일들을 한꺼번에 스테이징 할 수 있다. 그 이후 "apple content 4"의 커밋 메세지와 함께 커밋한다. 
(apple.txt 파일은 새로 생성된 파일이므로, 스테이징과 커밋을 한꺼번에 하는 git commit -am 옵션을 사용할 수 없다.)

$ git add .
$ git commit -m "apple content 4"

 

이렇게 되면 현재까지 manual 디렉토리에서는 master 브랜치가 master content 4를 가리키고 있고(모르겠다면 이전 포스팅 참고) apple은 apple content 4를, 나머지 2개(ms와 google)은 work 3를 가리키고 있다. 


이것을 확인하는 방법으로는 2가지가 있다. 

첫번째 방법으로는 그냥 줄글의 형태로 확인을 하는 방식이다.
두번째 방법으로는 슬래시(/) 등의 기호를 이용해서 조금 더 시각적으로 표현하는 방식이다. 

$ git log --oneline --branches
$ git log --oneline --branches --graph

나의 경우에는 두번째 방법으로 하는것이 조금 더 직관적으로 이해할 수 있어서 이 방법을 더 선호하는 편이다.

이렇게 전체적인 버전들의 구조를 보는 경우도 있지만, 2개의 특정 브랜치들의 차이점을 봐야하는 상황도 있다. 

이런 경우에는  $ git log <브랜치 1>..<브랜치2>를 통해서 찾을 수 있다.  이 명령어는 브랜치1에는 없지만, 브랜치 2에는 있는 내용을 출력한다. 

예를 들어 master브랜치에는 없고 apple 브랜치에만 있는 커밋은 'apple content 4'이다. 

$ git log master..apple 

apple content 4를 커밋 메세지로 하는 커밋이 출력되는 것을 확인할 수 있다. 

 

 

 

브랜치 병합하기

 

위에서 이렇게 브랜치를 나누는 경우는 추가적인 기능을 구현하는 경우에 많이 브랜치를 따게(?) 된다. 하지만, 결국은 마스터 브랜치에 병합이 되어 실질적으로 출시되는 프로그램에 적용이 되어야 한다. 이렇게 두개의 브랜치로 분리되어진  파일을 하나로 합치는 것을 병합한다고 하는데, 브랜치 병합은 어떻게 하는 것일까?

일단은 Home 디렉토리에서 manual-2의 디렉토리를 만들어서 실습을 해보자. 디렉토리를 만들고 work.txt파일을 생성하여 '1'을 입력하고 저장한 뒤 나온다. 커밋 메세지는 "work 1"로 하여 커밋한다. 

$ cd ~
$ git init manual-2
$ cd manual-2
$ vim work.txt
$ git add work.txt
$ git commit -m "work 1"

 

o2라는 새로운 이름의 브랜치를 생성해 놓고, 마스터 브랜치에 master.txt 파일을 생성하여 'master 2'를 입력한 뒤 저장하여 커밋한다. 커밋 메세지는 "master work 2"로 한다.

$ git branch o2
$ vim master.txt
$ git add master.txt
$ git commit -m "master work 2"

o2 브랜치는 새로 생성만 되었지만 work 1 커밋을 가리키고 있다. 헷갈린다면 git log --oneline --branches 혹은
git log --oneline --branches --graph 를 통해서 확인할 수 있다. 

이제 o2 브랜치로 checkout을 하고 o2.txt 파일을 생성하여 'o2 2'를 입력하고 저장한 뒤 커밋한다. 커밋 메세지는 "o2 work 2"로 한다.

$ git checkout o2
$ vim o2.txt
$ git add o2.txt
$ git commit -m "o2 work 2"

각 브랜치마다 커밋이 제대로 되었는지 확인을 한다음 마스터 브랜치로 checkout을 하고 o2를 병합한다.

$ git log --oneline --branches --graph
$ git checkout master
$ git merge o2

마지막 명령어를 실행하면 vim을 통해서 파일을 생성, 수정할 때 와 유사한 화면이 나온다. vim을 사용할 때와 마찬가지로 a나 i를 통해서 입력을 할 수 있고 esc를 누른다음 ':wq'를 통해서 저장한 뒤 나올 수 있다. 지금은 내부의 내용을 굳이 변경하지 않고 저장하고만 나온다. 

(커밋 메세지를 수정하지 않고 그대로 하는 것을 원한다면 마지막에 --no-edit 옵션을 추가할 수 있다.)

$ git log --oneline --branches --graph

위의 명령어를 통해서 브랜치를 병합한 이후에 어떻게 되었는지 확인해보자.  이전에는 |와 /만을 사용하고 직관적으로 어디에 해당 버전들이 관리되고 있는지 볼 수 있었다. 하지만 여기에서는 *표시된 부분에 해당 파일이 존재하고 있음을 유의해야 한다.

 

 

 

 

같은 문서를 병합하는 경우 

 

위의 경우에서는 병합을 하지만, 공통된 문서를 다루지 않기 때문에, 합집합의 개념으로 생각하면 병합을 하는 것이 그렇게 어렵지 않았다.  동일한 문서를 다른 브랜치에서 각각 다르게 수정한 뒤 병합을 하게 되면 어떤 방식으로 병합이 될까?

이 경우에도 2가지 경우가 존재한다. 같은 문서를 수정했지만, 다른 부분을 수정하여 수정 부분이 겹치지 않는 경우
같은 부분을 수정하는 경우가 있다.

 

수정 부분이 겹치지 않는 경우

 

새로운 디렉토리 manual-3 깃 저장소를 만들고 이동하여 마스터 브랜치에 work.txt 파일을 생성한다.

$ cd ~
$ git init manual-3
$ cd manual-3
$ vim work.txt
$ git add work.txt
$ git commit -m "work 1"

work.txt 파일 내부 입력은 아래 이미지처럼 입력한다.


o2브랜치를 생성하고, 마스터 브랜치에서는 work.txt 파일에서 3번째 비어있는 줄에 'master content 2'를 입력하고, 커밋한다. (커밋 메세지는 "master work 2")
o2브랜치로 checkout한 뒤,  work.txt 파일에서 7번째 줄에 'o2 content 2'를 입력하고, 커밋한다. (커밋 메세지는 "o2 work 2")

그 이후에 다시 마스터 브랜치로 checkout 한 뒤 o2를 병합한다. 병합한 이후에 어떻게 텍스트 파일이 저장이 되었는지 확인한다. 

$ git branch o2
$ vim work.txt
$ git commit -am "master work 2"

$ git checkout o2
$ vim work.txt
$ git commit -am "o2 work 2"

$ git checkout master 
$ git merge o2
$ cat work.txt

수정한 내용들이 전부 추가되어 있는 것을 확인할 수 있다.

 

 

수정 부분이 겹치는 경우

 

새로운 디렉토리를 만들고 master 브랜치와 o2 브랜치를 만들어서 파일을 수정하는 부분은 위와 동일하므로 코드만 적어놓겠다. 다만 마스터 브랜치에서 처음 work.txt 파일을 생성할 때에 내부에 내용을 위에서는 2줄을 띄었다면, 여기에서는 1줄만 띄운다. 

그리고 각 브랜치에서 work.txt 파일을 수정할 때에 3번째 줄 (아무것도 입력이 되지 않은 줄)을 공통적으로 수정한다. 
( master에서는 master content 2, 커밋 메세지는 "master work 2" / o2에서는 o2 content 2, 커밋 메세지는 "o2 work 2")

$ cd ~
$ git init manual-4
$ cd manual-4
$ vim work.txt
$ git add work.txt
$ git commit -m "work 1"
$ git branch o2
$ vim work.txt
$ git commit -am "master work 2"
$ git checkout o2
$ vim work.txt
$ git commit -am "o2 work 2"
$ git checkout master
$ git merge o2

여기까지 명령어를 입력했다면, work.txt 파일에서 충돌이 일어났다는 메세지를 출력 받았을 것이다. 위의 이미지에서 확인할 수 있다. 이 경우 $ vim work.txt 를 통해서 work.txt 파일에 들어가면 아래의 이미지처럼 되어 있는 것을 확인할 수 있다.

 이것을 조금 수정하여 

이런 형식으로 입력한 뒤, 수정한 파일을 "merge o2 branch"라는 커밋 메세지와 함께 커밋을 한다.

$ git log --oneline --branches --graph

명령어를 통해서 제대로 병합이 되었는지 확인 가능하다.

 

 

 

병합이 완료된 브랜치 삭제하기

 

병합이 완료되었다면 굳이 사용하지 않는 브랜치는 목록에서 지우는 것이 작업을 하는데에 더 편리하다. 하지만, 명령어를 통해서 브랜치를 지운다고 해서 완벽하게 지워지는 것이 아니라, 추후에 동일한 이름을 사용하여 브랜치를 재생성하면 이전에 작업한 내용이 다시 나타난다.  주의할 점은 삭제하는 경우에 현재 브랜치가 어디인지 확실하게 알고있어야 한다. 

$ git branch
$ git checkout master
$ git branch -d o2
$ git branch

728x90
반응형

'버전 관리 > git & github' 카테고리의 다른 글

GitHub 연동하기 1  (0) 2021.01.15
깃과 브랜치 3  (0) 2021.01.14
git과 브랜치(Branch) 1  (0) 2021.01.11
git을 이용하여 수정한 파일 되돌리기  (0) 2021.01.09
git에서 커밋한 파일 확인 및 수정하기  (0) 2021.01.08
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기