(4)-4.GIT - 4.Branch+!!!

[Git & Gerrit Home으로 돌아가기]

4. Branch !!!

  • 1.Branch 만들기 - git branch <branch name>
  • 2.Branch 전환하기 - checkout
  • 3.Branch 병합하기 - Fast Forward Merge
  • 4.Branch 삭제하기 - branch -d
  • 5. 동시에 여러 작업하기 
  • 6. 병합할 발생하는 충돌 해결2

1.Branch 만들기 - git branch <branch name>
실습을 위해 먼저 새로운 Working Directory를 만들고 실습합니다.
$ mkdir Branch
$ cd Branch : Branch 폴더에 myfile.txt 이라는 이름으로 파일을 만든 후 커밋합니다.
$ git init : Branch 폴더를 Git working directory로 초기화 합니다.
$ vi myfile.txt : "this is myfile"란 내용으로 파일 생성
$ git add myfile.txt
$ git commit -m "1st commit"
[master (root-commit) a73ae49] 1st commit
1 files changed, 1 insertions(plus), 0 deletions(minus)
create mode 100644 myfile.txt
여기까지 진행했다면, 아래 그림과 같은 이력이 남게 됩니다.

issue1' 이라는 이름으로 새로운 브랜치를 작성합니다. 브랜치는 branch 란 명령어로 만들 수 있습니다.

  • git branch <branchname> : 'issue1' 이라는 이름으로 브랜치를 만들어 봅시다.
    $ git branch issue1 : issue1 branch 생성
    $ git branch : 옵션을 지정하지 않고 branch 명령어를 실행하면 브랜치 목록 전체를 확인할 수 있습니다.
    앞 부분에 * 이 붙어있는 것이 현재 선택된 브랜치입니다.
    issue1
  • master

    2.Branch 전환하기 - checkout

  • 앞에서 우리가 새로 만든 'issue1'라는 이름의 브랜치를 사용하여 어떤 작업을 수행하려면,
  • 이 브랜치를 사용 하겠다고 명시적으로 지정해 주어야 합니다.
  • 이 때 사용하는 명령어가 바로 checkout 입니다.
  • 체크아웃(checkout)이란, 내가 사용할 브랜치를 지정하는 것을 의미합니다.
  • git checkout <branch> : checkout 명령어 뒤에 사용할 브랜치 이름을 입력하면 됩니다.
    $ git checkout issue1: 아래와 같이 입력하여 'issue1' 브랜치를 체크아웃 해 봅시다.
    Switched to branch 'issue1'
    checkout 명령에 -b 옵션을 넣으면 브랜치 작성과 체크아웃을 한꺼번에 실행할 수 있습니다.
  • git checkout -b <branch>

    'issue1' 브랜치를 체크아웃한 상태에서 커밋을 수행하면, 'issue1' 브랜치에 그 이력이 기록됩니다. mylife.txt 에 아래 박스에서와 같이 문장을 추가한 후에 커밋해봅시다.
    $ vi myfile.txt : "this is myfile" 뒤에 "branch chekout"추가.(기존 파일에 한 라인 추가)
    $ git add myfile.txt
    $ git commit -m "branch commit"
    [issue1 b2b23c4] branch commit
    1 files changed, 1 insertions(plus), 0 deletions(minus)
    이 시점까지의 이력을 보면 다음과 같습니다.

    3.Branch 병합하기 - Fast Forward Merge

    브랜치 병합은 merge 명령어로 실행합니다.
  • git merge <브랜치 명> : 'master' 브랜치에 'issue1'를 병합하기 위해서는 우선 'master' 브랜치에 'HEAD'가 위치하게 만들어야 합니다.
    $ git checkout master : 이 때에는 checkout 명령어를 이용하여 현재 사용중인 브랜치를 'master'로 전환합니다.
    : 병합하기 전에 myfile.txt 파일을 열어 내용을 확인. "this is myfile"
    : 현재 파일 편집은 'issue1' 브랜치에서 실행 했기 때문에 'master' 브랜치로 브랜치를 전환한 지금,
    : myfile.txt 파일을 확인했을 때 그 내용이 변경되어 있지 않아야 합니다.
    그럼 이제 병합을 시작해볼까요?
    $ git merge issue1 : 이제 'master' 와 'issue1'이 병합되었습니다.
    이런 방식의 병합을 'fast-forward (빨리감기) 병합'이라고 합니다.
    myfile.txt 파일을 열어 내용을 확인해 봅시다.
    "this is myfile"
    "branch chekout" : 기존 파일에 한 라인 추가

    4.Branch 삭제하기 - branch -d

    'issue1' 브랜치의 내용이 모두 'master'에 통합 되었기 때문에 이제 더 이상 'issue1' 브랜치가 필요없게 되었습니다. 
    브랜치를 삭제하려면 branch 명령에 -d 옵션을 지정하여 실행하면 됩니다.
    (흠흠... 놔두면 안되나요? - 안된다고 말씀드릴꼐요. git에서 브랜치는 자신이 관리해야 하기 때문에... 안 지우시면 나중에 헷갈리실 수 있습니다.)
    $ git branch -d <branchname> : 'issue1' 브랜치를 삭제하려면, 다음 명령어를 실행합니다.
    $ git branch -d issue1 : 이제 'issue1' 브랜치는 삭제되었습니다.
    $ git branch : 정말로 브랜치가 잘 삭제 되었는지 branch 명령어를 이용해서 확인합니다.
  • master : 아래와 같이 'master' 브랜치만 목록에 남아 있게 됩니다.

    5. 동시에 여러 작업하기 

     여러 개의 브랜치를 생성하여 동시에 여러 작업을 처리하는 상황을 만들어 보겠습니다.
    'issue2' 와 'issue3' 브랜치를 만든 후, 'issue2' 브랜치로 전환 합니다.
    $ git branch issue2
    $ git branch issue3
    $ git checkout issue2
    Switched to branch 'issue2'
    $ git branch
  • issue2
    issue3
    master
     이 그림과 같이 브랜치를 생성한 것은 하나의 노드에 이름표를 하나 더 붙인 것과 같습니다.
    'issue2' 브랜치의 myfile.txt 를 변경한 후 커밋해 보도록 하겠습니다.
    $ vi myfile.txt
    "this is myfile"
    "branch chekout"
    "issue2 branch editing" : 위의 내용이 이 한줄을 추가합니다.
    $ git add myfile.txt
    $ git commit -m "issue2 commit"
    실제 커밋을 해야 HEAD가 움직입니다.
    이번에는 'issue3' 브랜치로 전환하여, myfile.txt를 수정해보겠습니다.

    $ git checkout issue3
    Switched to branch 'issue3'
    myfile.txt 파일을 열어 내용을 확인합니다.

    $ cat myfile.txt : issue2 에서 추가한 내용은 들어 있지 않은 것을 확인합니다.
    "this is myfile"
    "branch chekout"

    $ vi myfile.txt : 여기에 "issue3 branch editing" 을 추가하고 변경 사항을 커밋해 보도록 하겠습니다.

    $ git add myfile.txt
    $ git commit -m "issue3 commit"

    지금까지 myfile.txt에
    'issue2' 브랜치에  "issue2 branch editing" 'issue3' 브랜치에  "issue3 branch editing" 
    라고 한줄 씩 추가하여  커밋해 보았습니다.
    이처럼 각각의 브랜치에서는 독립적으로 서로 다른 작업을 처리할 수 있습니다. 다음 단계에서는 이 두 브랜치를 병합하여, 내용이 달라진 myfile.txt 파일에 대한 충돌을 해결하는 방법에 대해 알아보도록 하겠습니다.
    6. 병합할 발생하는 충돌 해결
    이번에는 'issue2' 브랜치에서 변경한 부분과 'issue3' 브랜치에서 변경한 부분을 모두 'master' 브랜치에 통합해 보도록 하겠습니다.
    먼저 'master' 브랜치를 체크아웃한 다음 'issue2' 브랜치를 병합합니다.

    $ git checkout master
    $ git merge issue2
    이렇게 하면 앞서 설명되었던 'fast-forward(빨리감기) 병합'이 실행됩니다.
    아래 그림을 보면, 'master' 브랜치에 'issue2' 브랜치가 병합된 것을 확인할 수 있습니다.

    이번에는 'issue3' 브랜치를 병합합니다.

    $ git merge issue3
    Auto-merging myfile.txt
    CONFLICT (content): Merge conflict in myfile.txt
    Automatic merge failed; fix conflicts and then commit the result.
    'CONFLICT(충돌)'이라 나오는 것을 보니 자동 병합에 실패했군요.
    myfile.txt 의 내용을 확인하여 Conflict를 해결합니다.
    해결하는 방법은 ===== 기준으로 위 또는 아래를 선택하거나, 새로 작성한 후 <<<< , ===== , >>>> 등의 구분자를 지운 후, 다시 커밋하면 됩니다.
    $ cat myfile.txt
    this is my file
    branch checkout
    <<<<<<< HEAD
    issue2 branch editing
    =======
    issue3 branch editing
    >>>>>>> issue3

    $ vi myfile.txt : 아래와 같이 충돌을 해결했습니다.

    $ cat myfile.txt
    this is my file
    branch checkout
    issue2 branch editing
    issue3 branch editing
    충돌 부분을 모두 수정했으므로, 다시 커밋합니다.
    $ git add myfile.txt
    $ git commit -m "issue3 branch merged"
  1. On branch master
    nothing to commit (working directory clean)
    이 시점까지의 이력을 보면 다음과 같습니다. 이번 병합은 충돌 부분을 수정했기 때문에 그 변화를 기록하는 병합 커밋이 새로 생성 되었습니다. 그리고 'master' 브랜치의 시작('HEAD')이 그 위치로 이동해 있는 것을 확인할 수 있습니다. 아래와 같은 방식을 '3 way Merge'이라고 합니다.

    6. 병합할 때 발생하는 충돌 해결2

  • 같은 내용이지만 스크립트 하나 더 드릴꼐요. 이 것도 따라해보셔요.
  • 막상 conflict가 안나는 상황이 많아서. 이 정도 스크립트는 외워두는 것을 추천합니다.

$ mkdir Conflict
$ cd Conflict
$ git init : Conflict 폴더를 Git working directory로 초기화 합니다.
[branch - conflict - merge] 브랜치 2개 생성 후 1개 반영 후 나머지 충돌 해결 시
$ vi conflict.txt : 파일 생성 "master branch : file created"
$ git add *
$ git commit -m "master branch commit"
$ git branch br1
$ git branch br2
$ git checkout br1
$ vi conflict.txt : -> 파일 수정 "br1 : edited"
$ git add *
$ git commit -m "br1 commit"
$ git checkout master
$ git merge br1 : master에 br1 브랜치 Merge
$ git checkout br2
$ vi conflict.txt : -> 파일 수정 "br2 : edited"
$ git add *
$ git commit -m "br2 commit"
$ git checkout master
$ git merge br2 : master에 br2 브랜치 Merge
$ vi conflict.txt : -> 충돌 해결
$ git add *
$ git commit -m "conflict resolved"

$ git branch -d br1 : 언제든 브랜치를 만들 수 있기 때문에 그 때 그 때 지워주지 않으면 혼란스러운 상황이 올 수 있음.
$ git branch -d br2