기타

[git]merge ff only, merge squash, merge no ff

변기원 2023. 2. 17. 12:05

이 글의 이미지는 위키독스의 visual studio 사용자를 위한 git이라는 e-book을 출처로 합니다

 

오늘도 열심히 개발하고 테스트 서버에 코드를 병합하던 중,

첫 출근 날 다른 개발자분이 '병합은 스쿼시로 해주시면 되고요..'라는 말을 듣고 습관처럼 스쿼시 병합을 하던 중 

병합전략? 다른것들을 뭘까 나는 왜 스쿼시 병합을 하고 있을까?라는 생각이 들어 글을 쓰게 되었다.

하나씩 실습하면서 알아보자

 

일단 이상태를 만들어 준다

출처: https://wikidocs.net/153871

main에서 feature브랜치를 따고 두 개의 커밋이 ff 상태로 추가된 상태다.

 

1. git merge --ff-only 

--ff-only (fast-forward only) 옵션은 현 브랜치와 merge 대상 브랜치가 fast-forward 관계에 있는 경우 새로운 commit을 생성하지 않고 브랜치의 참조 값만 변경되도록 한다. ff 상태가 아니면 버튼자체가 비활성화된다.(aws codecommit의 경우..)

지금은 ff상태이니 해당 명령어로 병합할 수 있다 . 해보자

main 브랜치에 feature-1 커밋내역들이 병합되었고 병합커밋은 생성되지 않았다.

아래와 같은 상태가 된 것이다.

 

2. git merge --squash

이번에는 squash를 해보자

아까와는 다르게 저절로 병합이 되지 않고 스테이지에 변경된 파일들이 올라갔다.

불편해 보인다? 하지만 squash를 사용하면서 얻을 수 있는 이점이 바로 이 순간 발생한다. 

스테이지에 올라왔으니 커밋하고 로그를 찍어보자

아래와 같은 상태가 되었다.

squash라는 단어는 '으깨다'라는 뜻으로 통한다고 한다. 오렌지 짓이기고 으깨서 만든 오렌지 주스 생각하면 될 듯,

main브랜치로 병합했을때 작업브랜치의 커밋내역들을 으깨서 하나로 만들어 하나의 커밋으로 만든다.

그래서 위에서 변경된 파일들을 스테이지에만 올려놓고 커밋을 할 수 있도록 한 것 같다.

main의 입장에서는 feature-1에서 어떤 커밋을 남겼는지 모르는 상태가 되었다.

3. git merge --no-ff

이번에는 --no-ff 로 병합을 해보자

git merge --no-ff feature-1을 입력하면 --ff-only와 다르게 커밋내용을 입력하는 화면이 뜬다. 기본 커밋내역을 그대로 두고 

:wq로 나온후에 로그를 찍어보자!

--no-ff는

아래와 같은 상태가 된 것이다.

 

 

첫 출근에 다른 개발자분이 "병합은 스쿼시로 하시면 되고요..."라고 하셨던 이유는

develop브랜치에 병합을 한다는 것은 어떤 기능이 완성되어 테스트서버에 올린다는 것이고,

develop브랜치는 작업자들이 어떤 커밋들을 남겼는지까지는 알 필요가 없을 것 같다. 

로컬이나 원격의 작업브랜치에 세세한 커밋내역들을 남겨두고

기능이 배포되는 develop에는 각 기능별로 커밋을 남겨서 커밋내역을 보기 좋게 관리하고

기능별로 태그를 붙이거나 reset이나 revert등의 관리가 쉽게 하기 위함이 아니었을까?!

 

 

https://wikidocs.net/153871

 

05-04 merge 옵션 : --ff, --no-ff, --squash

> *앞에서 dev1 브랜치의 작업 내용을 `git merge` 하였더니 fast-forward merge가 되면서 master에 dev1의 commit이 모두 합쳐졌다. …

wikidocs.net