git merge --no-ff, --ff, --squash, rebase

꼬디바아 ㅣ 2024. 2. 20. 11:38

728x90

대표이미지

 

🖥️ git merge 종류

git merge의 종류는 4가지가 있다.

  1. 보통의 병합(--ff)
  2. 이기적 병합(--no-ff)
  3. 소심한 병합(--ff-only)
  4. 양아치 병합(--squash)

 

⌨️ 보통의 병합

$ git merge {병합할 브랜치 명}

 

기본적인 merge 방법이다. git merge 옵션을 적지 않으면 --ff와 같은 뜻이다.

 

  • 브랜치와 병합할 브랜치가 Fast-Forward 관계 o : 병합할 브랜치(커밋)을 따라감. without Merge 커밋
  • 브랜치와 병합할 브랜치가 Fast-Forward 관계 x : 병합할 브랜치와 병합됨. with Merge 커밋

아래는 git merge {브랜치명} --ff 할 경우 log이다.

master > git merge Hotfix --ff 
Updating a7ee0c1..03c0e57
Fast-forward
master > git log
* 03c0e57 (HEAD -> master, Hotfix) fix bugB
* 1693ca1 fix bugA
* a7ee0c1 (origin/master) base commit

git merge --ff

 

⌨️ 이기적인 병합

$ git merge --no-ff {병합할 브랜치 명}

 

현재 브랜치와 병합 대상의 관계가 Fast-Forward이던 아니던 무조건 Merge 커밋과 같이 병합되는 옵션

 

master > git merge Hotfix --no-ff  // merge내용 작성
Merge made by the 'recursive' strategy.
master > git log
*   842db67 (HEAD -> master) Merge branch 'Hotfix'
|\  
| * 03c0e57 (Hotfix) fix bugB
| * 1693ca1 fix bugA
|/  
* a7ee0c1 (origin/master) base commit

git merge --no-ff

 

이 때, 만들어진 commit(Merge branch 'Hotfix')는 2개의 Parent(Hotfix, master를 갖는다.

 

📌 --ff가 적용이 안되고 --no-ff로 적용되는 경우
--ff로 옵션을 주어도 --no-ff로 적용이 되는 경우가 있다. 그 경우를 살펴보자

hotfix가 작업을 하는동안 master에 변경 내역이 있는경우
- master 작업 추가
master > vi testC.txt
master !1 > git add .
master +1 > git commit -m "testC.txt"  
master > git log
* | 00c9de9 (HEAD -> master) testC.txt
| * 03c0e57 (Hotfix) fix bugB
| * 1693ca1 fix bugA
|/  
* a7ee0c1 (origin/master) base commit​

 

--ff가 아닌 --no-ff 적용 될 시

 

- merge
master > git merge Hotfix --ff   
// Merge branch 'Hotfix'
master > git log 
*   1925dd0 (HEAD -> master) Merge branch 'Hotfix'
|\  
* | 00c9de9 testC.txt
| * 03c0e57 (Hotfix) fix bugB
| * 1693ca1 fix bugA
|/  
* a7ee0c1 (origin/master) base commit​

--no-ff

 

⌨️ 소심한 병합

$ git merge --ff-only {병합할 브랜치 명}

 

현재 브랜치와 병합 대상의 관계가 Fast-Forward인 경우에만 병합 진행, Merge 커밋이 생성되지 않음

 

⌨️ 양아치 병합

$ git merge --squash {병합할 브랜치 명}

 

현재 브랜치와 병합 대상과의 차이나는 commit을 하나로 합쳐서 커밋'

 

master > git merge --squash Hotfix
Updating a7ee0c1..03c0e57
Fast-forward
Squash commit -- not updating HEAD
 testA.txt | 2 +-
 testB.txt | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
 
// squash는 commit이 생성되지않고 Staged상태만 된다
// commit 추가

master +2 > git add .
master +2 > git commit -m "fix bugA,B"
[master 48975f6] fix bugA,B
 2 files changed, 2 insertions(+), 2 deletions(-)
master > git log
* 48975f6 (HEAD -> master) fix bugA,B
| * 03c0e57 (Hotfix) fix bugB
| * 1693ca1 fix bugA
|/  
* a7ee0c1 (origin/master) base commit

 

git merge --squash

 

728x90

'👨‍💻 Git' 카테고리의 다른 글

깃 커밋 메시지  (1) 2024.02.21
Git Branch Strategy(깃 브랜치 전략)  (0) 2024.02.20