혼자 적어보는 노트

[Git] 브랜치 다루기, 충돌 해결 / branch / merge / rebase 본문

기타

[Git] 브랜치 다루기, 충돌 해결 / branch / merge / rebase

jinist 2022. 2. 4. 04:23


 

Branch

프로젝트를 여러 버전으로 관리해야 할 때
여러 작업을 따로 작업하고 한번에 통합할 때 사용한다.

 

혼자서 작은 프로젝트를 진행할 때에는 branch를 잘 사용하지 않았지만

다른 사람들과 함께 작업을 하거나 테스트 코드 작성시에 branch를 다양하게 사용할 수 있다.

 

로컬 branch 생성

브랜치 생성 시 현재 위치해 있던 브랜치가 복사되어 새로운 브랜치가 추가된다.

git branch [생성할 브랜치이름]

// 예시
git branch new-branch

 

원격 저장소에 있는 branch 연결

원격저장소에만 있는 branch를 로컬로 가지고 오려면 아래의 명령어를 사용한다.

git fetch

git checkout -t [원격브랜치명]

원격 브랜치 경로도 포함해야 함

 

로컬/원격 branch 목록 확인

git branch // 로컬브랜치 조회
git branch -r // 원격브랜치 조회
git branch -a // 원격브랜치를 포함한 전체 브랜치 조회

 

branch 이동

기존에는 checkout 으로 사용했지만 checkout이 하나의 명령어에 많은 기능이 들어있기 때문에

git 2.23버전부터 checkout의 브랜치 이동 기능이 switch/restore로 분리되었다. (restore은 다음에 다룰예정)

checkout / switch 모두 사용해도 되지만 switch를 사용하는 것을 권장하고 있다.

git switch [변경할 브랜치명]
git checkout [변경할 브랜치명]

 

branch 생성과 동시에 이동

git switch -c [새 브랜치명]
git checkout -d [새 브랜치명]

 

로컬 branch 삭제

git branch -d [삭제할 브랜치명]

 

원격 branch 삭제

git push [원격저장소 이름] -d [삭제할 원격브랜치 이름]

 

로컬 branch 이름 수정

git branch -m [기존브랜치명] [새 브랜치명]

 


 

브랜치 합치기 / merge, rebase

 

merge

두 브랜치를 한 커밋에 이어주는 방식
* 이전의 브랜치 history내역이 남아 있다.

 

merge 하는 법

 

1. 메인이 되는 브랜치로 이동한다.

git switch [main이 될 브랜치]

 

2. 명령어를 통해 합칠 브랜치를 입력해준다.

git merge [합칠 브랜치명]

 

3. merge된 branch삭제

git branch -d [삭제할 브랜치명]

 

❗ merge 충돌 해결

겹치지 않는 파일의 변경이나 추가만 되어있는 코드에서는 merge가 정상적으로 실행되지만
같은 파일의 같은 위치에 다른 내용을 입력할 경우 브랜치간의 충돌이 발생한다.

 

예시상황

1. main브랜치에서 user.txt에 정보를 작성 후 커밋

2. modify-user 브랜치를 추가하고, modify-user브랜치에서 user.txt파일을 전부 수정

3. main브랜치에서 modify-user을 merge

4. 충돌 발생

 

같은 파일의 같은 위치에 서로 다른 내용이 담겨있다면 충돌이 발생하며

어떤 브랜치의 내용으로 병합할 지 정해주어야 한다. 

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

충돌이 발생하면 에러메세지가 출력되는데
터미널을 보면 MERGING이 아직 진행중임을 알 수 있다.

 

충돌이 발생하고 있는 부분은 아래와 같이 VSCode 에디터 상에서 표시가 된다.


상단의 버튼들을 이용하여 해당 부분을 어떤 브랜치의 코드로 변경을 할 지 선택할 수도 있지만

해당 코드를 지우고 새로운 코드를 작성해도 된다.

 

변경사항을 적용한 후 커밋 하면  merge가 된 것을 확인할 수 있다.

git add .
git commit

 

❗ MERGING 중단 하기

충돌이 발생했을 때 MERGING상태를 아래의 명령어로 중단시킬 수 있다.

git merge --abort

 

 

다른 브랜치의 커밋들을 묶어서 가져오기

 

위와 같이 new 브랜치에 있는 커밋들을 하나로 묶어서

main브랜치로 가지고 오고 싶을 경우 main브랜치에서 아래와 같은 명령어를 사용한다

git merge --squash [묶을 브랜치]

위의 명령어를 입력하고 git status로 확인해보면 merge되거나 그런 내역 없이

해당 브랜치의 변경 사항들이 staging area에 들어와 있다.

그 상태에서 git commit을 하고 메세지를 입력하면

new브랜치의 커밋들은 그대로인 상태에서

main브랜치에 new브랜치의 변경사항들이 하나의 커밋으로 추가된다.

 

 


 

rebase

브랜치를 다른 브랜치에 이어주는 방식
* 내역이 남는 merge와는 달리 한 줄로 정리된 내역을 유지할 수 있다.

 

rebase 하는 법

 

1. 이동시킬 브랜치로 이동한다. (new-branch에서 main으로 이어주려면 new-branch로 이동)

git switch [이동시킬 브랜치명]


2. 명령어를 통해 이어줄 브랜치를 입력해준다. (main에 이어주려면 main 입력)

git rebase [이어붙일 브랜치]


3. rebase는 되었으나 이때 브랜치의 위치를 보면 이어붙이기를 한 new-branch는 상단에 위치하지만
main브랜치의 위치는 이전 커밋 위치 그대로이다.


4. main브랜치로 이동 후 아래의 명령어로 new-branch의 위치로 merge

git branch main
git merge new-branch


5. new-branch 삭제

git branch -d [삭제할 브랜치명]

 

 

❗ rebase 충돌 해결

rebase도 merge와 마찬가지로 충돌이 발생할 경우

해결 후 진행을 해주어야 한다.

 

예시상황

1. main브랜치에서 friend.txt에 정보를 작성 후 커밋

2. new-friend 브랜치를 추가하고, new-friend브랜치에서 friend.txt파일을 전부 수정

3. main브랜치로 돌아가서 friend.txt파일 삭제 후 커밋

4. new-friend 브랜치로 돌아가서 git rebase main

4. 충돌 발생

 

$ git rebase main
error: could not apply 00c14c5... Modify friend and Add new-friend
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 00c14c5... Modify friend and Add new-friend
CONFLICT (modify/delete): friend.txt deleted in HEAD and modified in 00c14c5
(Modify friend and Add new-friend). Version 00c14c5 (Modify friend and Add new-friend) of friend.txt left in tree.

merge와 마찬가지로 터미널을 확인하면 rebase중임을 알 수 있다.

git status 명령어를 입력하여 unmerged paths를 확인해보면

main에서 삭제된 friend.txt가 나타난다.

friend.txt를 add 해주고 충돌을 해결해준다.

git add friend.txt

충돌 부분을 해결했다면 아래의 명령어로 rebase를 진행한다.

 git rebase --continue

 

❗ REBASE 중단 하기

충돌이 발생했을 때 REBASE상태를 아래의 명령어로 중단시킬 수 있다.

git rebase --abort

 

다른 브랜치에서 생성된 브랜치 옮겨서 rebase

 

 

위의 그림처럼 main브랜치에서 first브랜치를 생성하고

first브랜치에서 second브랜치를 생성한 상태에서

first브랜치는 그대로 두고 second브랜치의 커밋만 main브랜치에 붙이고 싶다면

아래의 명령어를 사용하면 된다.

git rebase --onto master server client

 

Comments