branch, merge(--ff, --no-f), merge conflict

김도형·2022년 12월 15일
0

branch 이동


명령어 창에서도 확인하면, HEAD 가 main 브랜치를 바라보고 있다.

commit을 하면 같이 branch와 HEAD가 같이 움직임.

branch 역할

branch HEAD 처럼 단순히 커밋을 가리키는 포인터 역할

dev branch로 이동

브랜치를 변경하면 HEAD도 같이 이동됨.

$git checkout dev 


브랜치 변경 후 커밋을 하면, HEAD랑 같이 이동됨.

main 브랜치로 이동

$git checkout main

fast-forward merge

main 브랜치를 dev와 merge

$git merge dev --ff

merge : 두 브랜치가 가리키고 있는 커밋을 합치는 것
fast-forward : 전진의 의미이며 위 그림을 보면 bbb.txt 커밋에서 전진해서 HEAD가 ccc.txt 로 이동하는 것이 '전진'의 의미를 가진다. 그리고 새로운 커밋 생성하지는 않음.

no fast-forward merge

fast-forwrad는 새로운 커밋을 생성하지 않는다고 했는데,
no fast-forward merge는 무조건 새로운 커밋을 생성한다.

$git merge dev --no-ff

main 과 dev 각각 ccc.txt 는 같은 파일인데도 --no-ff 에 의해서 새로운 커밋 생성

merge conflict

main 와 dev 내용이 달랐을 때, 충돌 발생

충돌해결 및 merge 과정

1.main branch 에서 aaa.txt add 후 commit

$git add aaa.txt
$git commit -m "add aaa.txt"
  1. dev 브랜치 생성 후, dev 로 브랜치 변경
$git branach dev 
$git checkout dev
  1. 로그 확인
    HEAD ->dev, main 표시

  2. aaa.txt 내용을 111-> 111333 으로 변경
  3. dev 브랜치에서 aaa.txt 변경 파일 add 후 commit
$git add aaa.txt 
$git commit -m "modified aaa.txt"


6. main 으로 브랜치 변경 후 aaa.txt 내용을 111-> 111222 으로 변경 그리고 add 와 commit

$git checkout main 
aaa.txt 내용 변경(111 -> 111222)
$git add aaa.txt 
$git commit -m "modified aaa.txt"

  1. 현재 브랜치는 main이며, dev와 merge
$git merge dev

충돌이 발생하고, HEAD(main)과 dev 충돌 위치를 알려주고 사용자가 원하는 코드는 남기고 나머지는 삭제해주면 된다.

예시로 충돌을 수정하면 아래와 같이 한다.

8. 다시 변경된 파일을 add 하고 git status로 확인하면 console에서 문구로 "All conflicts fixed but you are still merging" 즉 충돌은 해결했으나 여전히 merging 중이다라는 의미

9. 만약 merge를 취소하고 싶다면,

$git merge --abort

아니면 merge를 진행하려면,아래와 같이 사용하고

$git merge --continue

continue 뒤에 아래 캡처처럼 왜 merge가 필요한 commit 인지 메시지를 적으라는 내용이다.

해당 메시지를 적으려면

  • i를 누른다 (commit message를 입력하기 위해)
  • merge에 대한 message를 입력한다.
  • esc를 누른다.
  • :wq를 입력한다.
  • enter를 누른다.

10.merge에 성공했다면 아래 그림처럼 된다.

로그를 확인해보면($git log --online), 커밋이 4개 있는 것을 확인할 수 있다.

  1. 여기서 dev에서는 commit을 새로 생성하면 안된다. 현재 main 브랜치가 최신본이기 때문이다. 그래서, dev 로 브랜치 변경 후 fast forward merge 를 하면 dev도 최신본을 가지고 있다.
$git checkout dev
$git merge main

main 브랜치와 merge 했을 때 Fast-forward 전진한 것을 볼 수 있고,
2 insetions(+), 1 deletion(-) 의 의미는

  • 2 insetions(+) : dev 브랜치의 aaa.txt의 222333 추가
  • 1 deletion(-) : dev 브랜치의 aaa.txt의 333 삭제

merge 전, dev 브랜치 aaa.txt의 333 이 merge 이후에도 유지되는 것이 아니라 333 삭제하고 다시 333을 추가한 것.

  1. git log를 보면 dev 브랜치가 HEAD(main 브랜치) 커밋을 같이 포인터하고 있는 것을 확인

모든 내용과 자료는 "스프링의 정석 : 남궁성과 끝까지 간다" 참고하였습니다.
출처 : https://fastcampus.co.kr/dev_academy_nks

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글