ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명령어로 Git을 사용하자! Git CLI ( Branch & Conflict )
    Knowledge/Git 2019. 11. 28. 00:44
    반응형

     

     

     


     

     

     

    이 포스팅은 이고잉 님의 Git CLI - BackupBranch & Conflict ( https://opentutorials.org/course/3840 ) 강의를 듣고 정리한 내용입니다.

     

    - Branch란?

     

    가지란 원래 단어의 뜻처럼 같은 뿌리를 공유하면서도 서로 다른 방향의 뻗어나가는 각각의 다른 버전들을 말한다.

     

    - Branch의 사용법

     

    먼저 branch의 목록은

     

    1
    git branch

     

    명령어로 확인할 수 있다.

     

     

    별도로 생성한 branch가 없으니 현재는 master만 존재한다. 

    branch를 생성해보자. branch를 생성하려면 

     

    1
    git branch 브랜치명

     

    명령어로 만들 수 있다. google, apple, ms란 이름의 branch를 만든 후에 다시 git branch를 입력해보면

     

     

    추가된 branch들을 확인할 수 있다. 현재는 표시된 것 처럼 master branch가 선택되어 있다.

    선택된 branch를 변경하려면 

     

    1
    git checkout branch명

     

    명령어로 바꿀 수 있다. 

     

    apple이 선택된 걸 확인할 수 있다

     

    만약 이렇게 branch를 바꾼 상태에서

    파일을 변경해서 커밋해 버전을 만들면 해당 버전은 apple branch 에서만 존재하게 된다

     

    실제로 보자. apple branch에서 두개의 commit을 한다음 

     
    1
    git log --all --graph --oneline

     

    명령어를 입력하면 

     

     

    위와 같이 head가 가르키고 있는 apple은 apple work2에 있고 ms, master, google는 work 3에 멈춰 있는 걸 볼 수 있다

    이 상태에서는 사실 git log 뒤에 붙은 옵션들의 의미를 잘 확인할 수 없는데

    여기서 branch를 ms로 변경해서 버전을 추가로 만들고 git log --all --graph --oneline 명령어를 다시 한번 입력해보면

     

     

    위와 같이 그래프 형태로 브랜치간 변경 내역을 확인할 수 있다.

    만약 이 상태에서 사용하지 않은 google branch를 삭제하고 싶으면

     

    1
    git branch -d 삭제할 branch명

     

    명령어를 활용해

     

     

    이처럼 branch를 삭제할 수 있다

     

    - Branch 병합

     

    이처럼 각기 다른 방향으로 뻗어나가던 Branch를 특정 시점에서 하나로 병합 ( Merge )할 수도 있다. 이 때

     

    Base는 병합하려는 Branch들의 공통 조상을

    merge commit은 병합해 만든 새로운 버전을 뜻한다.

     

    예를 들어 git init 명령어를 활용해 저장소를 처음 초기화하고 파일을 추가해 work1 이란 메모와 함께 한번 commit

    그리고 저장소 내부를 변경해 master work2란 이름으로 한번 더 커밋,

    마지막으로 o2란 브랜치를 생성해 선택한 후 파일을 변경하고 한번 o2 work 2란 이름으로 커밋한 다음 로그를 보면

     

     

    위와 같은 형태가 나온다. 여기서 병합을 해보자. 병합은 간단하다 우선 master branch를 선택하고

     

    1
    git merge master와 병합할 branch명

     

    명령어를 입력한 다음 다시 한번 그래프 로그를 보면

     

     

    이처럼 잘 병합된 걸 확인할 수 있다.

     

    그런데 이런 경우는 어떨까?

     

    파일명이 같은 파일을 o2 branch에서는

     

     

    이렇게 작성한 상태에서 commit하고, master branch에서는

     

     

    이렇게 작성해 commit한 상태에서 merge를 시도한다면 ?

     

     

    그래프 log를 확인했을 때는 별 다른 점을 찾기 힘들지만 

    두 branch에서 각각 다른 부분을 수정해 commit한 work.txt 파일을 nano 에디터로 열어보면

     

     

    위와 같이 수정한 각각의 부분이 합쳐져 있는 걸 확인할 수 있다.

     

    이처럼 Git은 이름이 같은 파일의 다른 부분을 각기 다른 branch에서 변경한 상태에서 merge하면

    그 내용들을 알아서 합쳐주는 기능을 가지고 있다.

     

    - Conflict

     

    그런데 같은 파일의 같은 부분을 변경해서 merge하려고 한다면..? 그 때 Conflict 즉 충돌이 발생한다.

     

    예를 들어 master branch에서는 work.txt를

     

     

    이처럼 작성해 commit하고 o2 branch에서는 work.txt를 

     

     

    이처럼 작성해 commit한 상태에서 두 파일을 merge 하면

     

     

    위에서와 달리 제대로 merge 되지 않고

    충돌이 발생해서 자동으로 merge할 수 없으니 충돌을 해결하고 결과를 commit 하라는 문구가 나온다.

     

    git status 명령어를 입력해 상태를 봐도

     

     

    비슷한 내용이 적혀 있으니 파일 내부를 확인해서 merge를 직접 확인해보자. 열어보면

     

     

    위와 같이 우리를 당황시키는 내용이 나오는데 알고보면 별 거 없다.

     

    2번이 기준이고

    기준으로부터 1번까지의 위쪽이 master branch의 내용이고

    기준으로부터 3번까지의 아래쪽이 o2 branch의 내용이라는 안내에 불과하다.

     

    그러니까 이렇게 중복된, 즉 자동으로 판단할 수 없어 충돌이 발생한 부분은 표시해줬으니

    그 내용을 어떻게 합칠지 정해서 커밋하라는 안내다. 그러니 이걸 원하는대로

     

     

    예를 들어 뭐 이런 식으로 변경해 저장한 후 git add 명령어를 활용해 Staging Area에 올리고 상태를 보면

     

     

    이처럼 안도의 초록색을 볼 수 있다. 이 상태에서 git commit을 입력하면

     

     

    커밋 메시지를 입력하는 창에서 자동 merge 를 명령했을 때와 비슷한 내용의 commit 메세지 템플릿을 볼 수 있다.

    이걸 저장하고 그래프 log를 보면

     

     

    위와 같이 성공적으로 merge된 걸 확인할 수 있다.

     

    - 3 Way merge

     

    merge가 이런 식으로 작동하는 원리는 아래 동영상과 같다

     

     

    - 외부 도구를 이용해서 병합하는 방법

    이런 merge를 p4merge라는 툴을 이용해서 보다 쉽게 처리할 수도 있다. 

    먼저 https://www.perforce.com/downloads/visual-merge-tool 여기서 Install 파일을 다운로드받아

    오직 Merge and Diff Tool (p4Merge) 만 설치한 후

     

    이렇게 체크!

     

    git cmd 창에서 

     

    1
    git config --global merge.tool p4merge

     

    명령어로 p4merge를 git 기본 merge tool로 설정해주고 

     

    1
    git config --global mergetool.p4merge.path "C:/Program Files/Perforce/p4merge.exe"

     

    명령어를 이용해 p4merge의 경로를 알려주면 세팅이 끝난다. 

     

    이렇게 세팅한 상황에서 merge가 발생했을 때 git mergetool을 입력하면

     

     

    이처럼 p4merge에서 충돌이 발생할 파일이 열리고

    이 GUI 도구를 활용해 충돌이 발생한 부분을 보다 쉽게 변경한 다음

     

     

    저장 버튼을 누르고 종료하면 다시 CMD 창으로 돌아온다. git status를 확인해보면 

     

     

    위와 같은 화면을 볼 수 있는데 orig는 merge하기 전의 파일을 뜻한다.

    수동으로 merge한 파일은 이제 text.txt 파일에 잘 저장되어 있으니 rm 명령어로 orig 파일을 지우고

    git add 수정한 merge file명 -> git commit의 과정을 거치면 

     

     

    위와 같이 merge가 잘 완료된 걸 확인할 수 있다.

    반응형

    댓글

Designed by Tistory.