차밍이

[Github] master와 branch 병합 시나리오 - 충돌 시 해결 방법 본문

Github

[Github] master와 branch 병합 시나리오 - 충돌 시 해결 방법

2020. 4. 14. 09:53
반응형

Git 기본 문법과 branch 기초 명령

[Github] 완전기초 사용방법 : add, commit, push, pull

[Github] 독립된 작업을 위한 Branch 기초 명령어

Git : branch 병합 시나리오

branch 관련된 명령은 매우 간단합니다. 하지만 다양한 시나리오 속에서 어떤 상황인지 파악하고 자유롭게 활용할 수 있어야 합니다. branch를 병합하는 과정에서 발생될 수 있는 상황은 많습니다. 해당 경우에 어떻게 해결할 것인지 차근차근 알아보겠습니다.

상황 1. fast-foward

fast-foward는 feature 브랜치 생성된 이후 master 브랜치에 변경 사항이 없는 상황

흔히 팀원이 버스를 타는 중 >> 나만 열심히 Branch 만들고 합치고 만들고 합치고 하는 중!

  1. slave branch 생성 및 이동

    (master) $ git checkout -b slave # slave 라는 이름의 branch 
    Switched to a new branch 'slave'
    (slave) $                        # 기존의 master 부분이 slave로 바뀐 것 확인
  2. 작업 완료 후 commit

    $ touch clean.txt      # 작업을 완료한 후 만들어진 파일
    $ git add .            # add
    $ git commit -m 'Complete clean'  # slave branch에서 commit 진행
  1. master 이동

    (slave) $ git checkout master
    Switched to branch 'master'
    (master) $
  1. master에 병합 : branch에서 작업한 내용을 master로 합치는 과정

    (master) $ git merge slave
  1. 결과 -> fast-foward (단순히 HEAD를 이동)

    (master) $ git merge slave
    git merge slave
    Updating 1036e68..98079f0
    Fast-forward
     clean.txt | 0
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 clean.txt
  2. branch 삭제

    • branch를 master와 병합한 후에는 branch를 제거하는 것이 일반적입니다. 추가적인 작업이 필요하다면 남겨두어도 무방합니다. 작업에 혼란을 줄이기 위해서 필요없는 branch는 병함후 제때 삭제하는 것이 좋습니다.
    $ git branch -d slave
    Deleted branch slave (was 98079f0).

상황 2. merge commit

서로 다른 이력(commit)을 병합(merge)하는 과정에서 다른 파일이 수정되어 있는 상황

git이 auto merging을 진행하고, commit이 발생된다.

  1. slave branch 생성 및 이동

    (master) $ git checkout -b slave
    Switched to a new branch 'slave'
    (slave) $
  2. 작업 완료 후 commit

    $ touch tf.txt # 특정 작업을 완련한 후 만들어진 파일로 가정
    $ git add .
    $ git commit -m 'Complete TF'
  3. master 이동

    $ git checkout master
  4. master에 추가 commit 이 발생시키기!!

    • 다른 파일을 수정 혹은 생성하세요!
  • hotfix가 발생해서 master의 다른 파일에 수정 작업이 진행됐다고 가정하자.
  1. master에 병합

    (master) $ git merge slave
  2. 결과 -> 자동으로 merge commit 발생

    • git log로 확인해보세요!

    • 서로 다른 파일이 수정되었으므로 git이 자동으로 merge 한 후 commit을 발생시킵니다.

  3. 그래프 확인하기

    • 저의 경우 아래와 같은 그래프가 발생되며 Merge branch slave 라는 commit이 발생되면서 두 버전이 병합된 것을 알 수 있습니다.
    $ git log --oneline --graph
    *   dfc05ab (HEAD -> master) Merge branch 'slave'       
    |\
    | * 9b97ef6 (slave) Complete Tensorflow
    * | 610325b hotfix
    |/
    * 98079f0 Complete clean
    * 1036e68 Init
  1. branch 삭제

    $ git checkout -d slave

상황 3. merge commit 충돌

서로 다른 이력(commit)을 병합(merge)하는 과정에서 같은 파일의 동일한 부분이 수정되어 있는 상황

git이 auto merging을 하지 못하고, 충돌 메시지 발생

해당 파일의 위치에 표준 형식에 따라 표시해준다.

원하는 형태의 코드로 직접 수정을 하고 직접 commit을 발생시켜야 합니다.

충돌된 파일의 경우 수작업으로 병합 처리를 해주어야 합니다.

  1. visualization branch 생성 및 이동

    $ git checkout -b visualization
  2. 작업 완료 후 commit

    $ touch visual.txt
    $ git status
    On branch feature/visualization
    Changes not staged for commit:                        alization)
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in walization)orking directory)
            modified:   README.md
    
    Untracked files:
      (use "git add <file>..." to include in what will be 
    committed)
            visual.txt
    
    no changes added to commit (use "git add" and/or "git 
    commit -a")
    $ git add .
    $ git commit -m 'Complete visual'
  1. master 이동

    $ git checkout master
  1. master에 추가 commit 이 발생시키기!!

    • 동일 파일을 수정 혹은 생성하세요!
  2. master에 병합

    $ git merge visualization 
    Auto-merging README.md
    CONFLICT (content): Merge conflict in README.md
    Automatic merge failed; fix conflicts and then commit the result.
  1. 결과 -> merge conflict발생

    git status 명령어로 충돌 파일을 확인할 수 있음.

  2. (master|MERGING) $ git status On branch master # 충돌 난 곳이 있음. You have unmerged paths. # 고치고 나서 commit을 실행시킬 것. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Changes to be committed: new file: visual.txt # 충돌 파일을 해결하고 add 할 것.. Unmerged paths: (use "git add <file>..." to mark resolution) both modified: README.md

  3. 충돌 확인 및 해결

    • 아래와 같은 형태로 충돌 부분이 나타내 집니다.
    • master와 branch에서 달라진 부분을 각각 비교할 수 있도록 나타내 집니다.
    <<<<<<< HEAD
    * 분석 내용 정리
    =======
    * 시각화 작업
    >>>>>>> visualization
  1. merge commit 진행

    2번 상황에서는 merge commit 이 발생하였지만, 그 중간 과정에서 충돌이 났기 때문에 직접 변경사항을 add 하고 commit을 하여야 합니다.

    • vim 편집기 화면이 나타납니다.
  2. $ git add . $ git commit

  • 자동으로 작성된 커밋 메시지를 확인하고, esc를 누른 후 :wq를 입력하여 저장 및 종료를 합니다.

    * `w` : write
    * `q` : quit
    • 커밋이 확인해봅시다.
    • vim 편집기가 아닌 파일에 직접 들어가서 수정해도 됩니다.
  1. 그래프 확인하기

     $ git log --oneline --graph
     *   891aafc (HEAD -> master) Merge branch 'visualization'   
     |\
     | * 2d2e099 (visualization) Complete Visual
     * | 31eaefc Update markdown
     |/
     *   dfc05ab Merge branch 'tensorflow'
     |\
     | * 9b97ef6 Complete Tensorflow
     * | 610325b hotfix
     |/
     * 98079f0 Complete clean
     * 1036e68 Init
  1. branch 삭제

    $ git branch -d visualization

지금까지 Github을 활용하면서 Branch를 사용하는 과정에서 발생될 수 있는 3가지 시나리오를 보았습니다. 각 시나리오에 따라서 어떻게 충돌이 발생될 수 있는지, 충돌이 발생됐을 때 어떻게 merge가 발생되는지 알게 되었습니다. Git을 잘 관리해서 모두들 version관리를 편하게 진행할 수 있다면 좋을 것 같아요.

반응형

관련된 글 보기

Comments