일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- vscode
- db
- 알고리즘
- 자바
- 그레이들
- react
- CS
- 동적 계획법
- BFS
- Data Structure
- LeetCode
- 안드로이드
- git
- DFS
- java
- 다이나믹 프로그래밍
- frontend
- 프로그래머스
- network
- Python
- Javascript
- Algorithm
- Database
- Redux
- VIM
- 백준
- DP
- Graph
- TypeScript
- 리트코드
- Today
- Total
늘 겸손하게
Git branch 간 병합 본문
Branch 병합의 종류
1. fast-forward merge
2. 3-way merge
기초 지식
위 두 가지 병합 방법을 이해하기 위해서는 다음을 알아합니다.
1. Commit들은 이전 commit (부모 commit)을 가리키며 저장됨
2. Branch 는 branch에 담긴 commit들 중 가장 마지막 commit을 가리키는 포인터
3. HEAD는 현재 branch를 가리키는 포인터
ls -al bash 명령어를 통해 볼 수 있는 .git 디렉토리 내부에 모든 commit 기록이 저장됩니다.
1. fast-foward merge
( Shell ) |
git branch testing |
: 현재 branch가 가리키고 있는 commit을 가리키는 testing이라는 branch를 만든다.
( Shell ) |
git checkout testing |
: HEAD가 testing을 가리키도록 변경한다. ( 현재 작업 중인 브랜치를 testing 브랜치로 변경 )
( Shell ) |
vim file1.txt git commit |
: 새로운 commit을 추가하고 HEAD가 가리키고 있는 branch (testing)가 새 commit을 가리키도록 변경한다. 바로 이전까지 testing이 가리키고 있던 commit을 새 commit이 부모로써 가리키게 된다.
( Shell ) |
git checkout master |
: HEAD가 master를 가리키도록 변경한다.
( Shell ) |
git checkout -b hotfix vim file2.txt git add . git commit |
: 급한 문제를 해결하기 위한 hotfix branch를 만들고 전환해서, 문제를 해결하고 해당 변경 사항을 commit한다.
( Shell ) |
git checkout master git merge hotfix |
: 실제 서비스되는 코드에 hotfix의 내용을 반영하기 위해, master branch에 hotfix branch를 병합한다. (merge)
-> hotfix가 Master 이후의 Commit을 가리키고 있기 때문에, 단순히 master가 hotfix와 동일한 Commit을 가리키도록 이동하면 된다. 이러한 merge를 fast-foward merge라고 한다.
branch(포인터)를 앞으로 이동시키는 Merge라고 생각하면 편하다.
2. 3 - way merge
( Shell ) |
git branch -d hotfix |
: 더 이상 필요없는 Hotfix branch를 삭제
( Shell ) |
git checkout Testing vim sample.txt git add . git commit |
: Testing 브랜츠로 돌아와서 작업을 진행한다. 앞서 작업한 hotfix는 Testing branch에 반영되지 않은 상태
-> 구현완료한 Testing 을 master 브랜치에 merge 하려고 싶지만 Testing 브랜치는 master의 commit을 가리키지 않기 때문에 fast-foward merge를 적용할 수 없다.
이런 경우 Git은 각각의 branch의 Commit 중 공통 조상인 commit 하나를 이용하는 3-way merge를 한다.
Merge 충돌 해결
브랜치간 병합을 하다보면 같은 부분을 수정한 부분이 존재하여 conflict(충돌)이 발생할 수 있다.
branch 1 에서 file1.txt를 수정하고 branch 2 에서도 file2.txt를 수정했다고 가정하자. 이 상황에서 Git은 어느 수정본이 사용자가 원하는 수정본인지, 어떤 것을 덮어씌울지 판단할 수가 없다. 이 부분을 개발자가 수정해주어야한다.
- 충돌 예시
>>>> , <<<< , ==== 등을 지우고 겹친 부분을 원하는 코드로 수정한 후 add & commit 하면 된다.
Conflict 발생 시 Merge 취소
일단 merge를 취소한 후 나중에 다시 merge 해야겠다고 생각한다면
git merge --abort 명령을 사용하면 된다.
'Programming Library & Tools > Git' 카테고리의 다른 글
Git - core.autocrlf input으로 개행문자 차이로 인한 문제 해결하기 (0) | 2023.08.22 |
---|---|
Git 과거 버전으로 돌아가기 - Revert & Reset (0) | 2022.02.17 |
Git 기초 3 - Branch (0) | 2022.02.15 |
Git 기초 2 - 변경 내역 확인, 수정, 되돌리기 (0) | 2022.02.15 |
Git 기초 (0) | 2022.02.15 |