Merge를 수행할 때는 항상 conflict를 고려해야 한다. branch에서 각기 다른 부분을 수정하고 merge하는 경우(Fast-forward merge)에는 문제가 없으나 같은 코드에 대하여 변경 사항이 있는 경우 각 branch가 참조하는 commit을 기준으로 자동 merge(3-way Merge)한다. 즉, 2개의 변경 사항을 합쳐 하나의 새로운 병합 commit이 생성된다.
Types of Merge
- Fast-forward Merge
- 3-way Merge
git에서는 자체적으로 merge를 할 때 유동적으로 해결하는 기능이 있으며 conflict가 일어난 코드의 부분마다 사용자가 직관적으로 파악하여 해결할 수 있는 기능 또한 갖추어져 있다.
Conflict
그러나 2개의 commit이 하나의 변경 사항에 대한 내용이라면 conflict가 발생한다. 즉, 같은 파일에서 동일한 부분이 2개의 branch에서 수정된 경우를 의미한다. 이런 상황에서는 Git이 자동으로 merge할 수 없으며 conflict가 발생한 파일을 수동으로 다시 수정하여 merge해야 한다. 해당 과정은 아래와 같다.
// conflict 상태 확인
git status
- conflict가 일어난 파일을 열어서 수정
- "git add <수정 파일 이름>" 명령어로 다시 stage area에 등록
- "git commit" 명령어 수행
Merge command options
Fast-forward merge의 경우에 특별히 merge에 대한 commit이 생성되지 않는다. 따라서 merge 명령어의 "--no-ff" 명령어를 사용하여 merge commit을 생성할 수 있다. 이는 commit history 관리를 용이하게 해준다.
// Fast-forward merge의 merge commit 생성
git merge --no-ff <branch 이름>
// merge하는 branch들의 commit들을 하나로 합침(merge commit 없이 적용)
git merge --squash <branch 이름>
// merge 중지(보통 충돌 발생 시에 사용, merge를 중단, merge 이전 상태로 돌아감)
git merge --abort
// merge 후 리셋(merge를 완료한 이후에 이전 상태로 돌아감)
git reset --hard ORIG_HEAD
"--no-ff"와 "--squash" 옵션을 사용하여 merge 방식과 commit history를 체계적으로 관리할 수 있다.
pull은 fetch + merge를 수행하는 명령어이다. remote에서의 변경 사항들을 local로 가져와 merge한다. 이때에도 pull 명령어로 수행된 merge의 commit이 commit history에 기록된다.
git log --graph
"git log --graph" 명령어 수행으로 나오는 결과 화면에서 나가기 위해서는 "q"를 입력해주어야 한다. "q"를 입력하면 결과 화면이 닫히고 다시 터미널 입력 상태로 돌아간다.

빨간 네모 박스는 해당 commit에 대한 해시 값이며 commit ID라고도 한다.
파란 네모 박스가 pull 명령어로 수행된 merge의 commit message 형태이다.

'Git' 카테고리의 다른 글
| [Git] 특정 commit을 branch에 선택적 적용 (cherry-pick) (0) | 2024.11.04 |
|---|---|
| [Git] Commit 수정 및 복구 (revert & reset) (0) | 2024.11.04 |
| [Git] branch 병합 (merge & rebase) (0) | 2024.11.03 |
| [Git] branch 생성, 전환, 삭제 (branch, checkout & switch & restore) (0) | 2024.11.03 |
| [Git] Remote repository의 최신 정보 다운로드 (pull & fetch) (1) | 2024.11.03 |