Git

[Git] Merge Conflict specification

neck392 2024. 11. 3. 21:48

 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
  1. conflict가 일어난 파일을 열어서 수정
  2. "git add <수정 파일 이름>" 명령어로 다시 stage area에 등록
  3. "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"를 입력하면 결과 화면이 닫히고 다시 터미널 입력 상태로 돌아간다.

<CLI에서 pull 명령어로 수행된 merge commit message 형태>

 

빨간 네모 박스는 해당 commit에 대한 해시 값이며 commit ID라고도 한다.

파란 네모 박스가 pull 명령어로 수행된 merge의 commit message 형태이다.

 

<웹 브라우저에서 pull 명령어로 수행된 merge commit message 형태>