본문 바로가기
App Programming/Git

[Git] Branch 사용하기 (2)

by goatlab 2022. 9. 6.
728x90
반응형
SMALL

Branch 삭제하기

 

'project1' 브랜치의 내용이 모두 'master'에 통합 되었기 때문에 이제 더 이상 'project1' 브랜치가 필요없다. 브랜치를 삭제하려면 branch 명령에 -d 옵션을 지정하여 실행하면 된다.

 

$ git branch -d <branchname>

 

'project1' 브랜치를 삭제하려면, 다음 명령어를 실행한다.

 

$ git branch -d project1
Deleted branch project1 (was b2b23c4).

 

이제 'project1' 브랜치는 삭제되었다. 정말로 브랜치가 잘 삭제 되었는지 branch 명령어를 이용해서 확인한다. 아래와 같이 'master' 브랜치만 목록에 남아 있게 된다.

 

$ git branch
* master

 

동시에 여러 작업하기

 

이번에는 두 개의 브랜치를 생성하여 동시에 여러 작업을 처리해본다. 'project2' 와 'project3' 브랜치를 만든 후, 'project2' 브랜치로 전환한다.

 

$ git branch project2
$ git branch project3
$ git checkout project2
Switched to branch 'project2'
$ git branch
* project2
  project3
  master

 

'project2' 브랜치의 myfile.txt 에 아래와 같이 commit에 대한 설명을 추가하여 커밋한다.

 

add : 변경 사항을 만들어서 인덱스에 등록
commit : 인덱스 상태를 기록
$ git add myfile.txt
$ git commit -m "commit 설명 추가"

 

[project2 8f7aa27] commit 설명 추가
 1 files changed, 2 insertions(+), 0 deletions(-)

 

이번에는 'project3' 브랜치로 전환한다.

 

$ git checkout project3
Switched to branch 'project3'

 

myfile.txt 파일을 열어 내용을 확인한다. commit 명령의 설명은 'project2' 브랜치에서 추가했기 때문에, 'project3' 브랜치로 전환한 후의 myfile.txt 파일에는 add 명령의 설명 밖에 없다. 이번에는 pull 명령어의 설명을 추가하여 변경 사항을 커밋한다.

 

add : 변경 사항을 만들어서 인덱스에 등록
pull : 원격 저장소의 내용을 가져오기 
$ git add myfile.txt
$ git commit -m "pull 설명 추가"
[project3 e5f91ac] pull 설명 추가
 1 files changed, 2 insertions(+), 0 deletions(-)

 

이처럼 각각의 브랜치에서는 독립적으로 서로 다른 작업을 처리할 수 있다.

 

병합할 때 발생하는 충돌 해결하기

 

이번에는 'project2' 브랜치에서 변경한 부분과 'project3' 브랜치에서 변경한 부분을 모두 'master' 브랜치에 통합한다. 먼저, 'master' 브랜치를 체크아웃한 다음 'project2' 브랜치를 병합한다.

 

$ git checkout master
Switched to branch 'master'
Updating b2b23c4..8f7aa27
Fast-forward
 myfile.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

 

이렇게 하면 'fast-forward (빨리감기) 병합'이 실행된다. 'master' 브랜치에 'project2' 브랜치가 병합된 것을 확인할 수 있다. 이번에는 'project3' 브랜치를 병합한다.

 

$ git merge project3
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Automatic merge failed; fix conflicts and then commit the result.

 

'CONFLICT (충돌)'이라 나오는 것을 보니 자동 병합에 실패한 것이다. 앞서 각각의 브랜치에서 변경한 내용이 myfile.txt 의 같은 행에 포함되어 있기 때문이다. 실제로 myfile.txt의 내용을 확인해 보면 다음과 같이 변경되어 있다. 충돌이 있는 부분에 Git이 자동으로 충돌 정보를 포함하여 파일 내용을 변경한다. 이 내용을 통해 어떤 브랜치에서 어떤 부분이 충돌되었는지 확인할 수 있다. 충돌이 일어난 부분은 이렇게 일일이 확인해서 수정해 주어야 한다. 충돌 부분을 모두 수정하고 다시 커밋한다.

 

$ git add myfile.txt
$ git commit -m "project3 브랜치 병합"
# On branch master
nothing to commit (working directory clean)

 

병합은 충돌 부분을 수정했기 때문에 그 변화를 기록하는 병합 커밋이 새로 생성되었다. 그리고 'master' 브랜치의 시작 ('HEAD')이 그 위치로 이동해 있는 것을 확인할 수 있다. 이런 방식을 'non fast-forward 병합'이라고 한다.

 

rebase로 병합하기

 

앞선 두 개의 브랜치를 'master' 브랜치로 모두 병합시켰다. 그로 인해 두 개의 줄기로 브랜치가 분기되었다가 다시 하나로 합쳐지는 것을 확인했다. 'project3' 브랜치를 병합 할 때에 rebase를 먼저 실행한 후 병합을 시도한다면 그 이력을 하나의 줄기로 만들 수도 있다. 이를 하기위해 이전에서 마지막으로 진행했던 병합 명령을 취소한다.

 

$ git reset --hard HEAD~

 

이제 'project3' 브랜치로 전환하여 'master' 브랜치에 rebase를 실행한다.

 

$ git checkout project3
Switched to branch 'project3'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: pull 설명 추가
Using index info to reconstruct a base tree...
<stdin>:13: new blank line at EOF.
+
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Failed to merge in the changes.
Patch failed at 0001 pull 설명 추가

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

 

merge 때와 마찬가지로 myfile.txt 파일 내용에 충돌이 있기 때문에 그 부분을 이전과 동일하게 처리한다. 충돌난 파일 내용을 적절히 변경해야 한다. rebase의 경우 충돌 부분을 수정 한 후에는 commit이 아니라 rebase 명령에 --continue 옵션을 지정하여 실행해야 한다.

 

$ git add myfile.txt
$ git rebase --continue
Applying: pull 설명 추가

 

만약 rebase 자체를 취소하려면 --abort 옵션을 지정하면 된다. 이전에 merge 명령어를 사용했을 때와 같이, rebase만 실행한 경우에는 'project3' 브랜치가 두 브랜치의 앞 쪽으로 위치가 옮겨졌을 뿐 'master' 브랜치는 아직 'project3'의 변경 사항이 적용되지 못한 상태로 뒤에 남겨져 있다. 이제 'master' 브랜치로 전환 하여 'project3' 브랜치의 변경 사항을 모두 병합하면 된다.

 

$ git checkout master

 

Switched to branch 'master'
$ git merge project3
Updating 8f7aa27..96a0ff0
Fast-forward
 myfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
728x90
반응형
LIST