(4)-4.GIT - 4.Branch+!!!
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, 0 deletions
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, 0 deletions
이 시점까지의 이력을 보면 다음과 같습니다.
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"
- 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