Skip to content
On this page

git 딥다이브 - git merge, rebase


해당 내용은 코드숨 강의 소프트웨어 개발의 지혜 <Git 편> 을 보고 정리한 내용입니다.

git commit —amend

보통 커밋 메시지를 수정해야할 때 해당 명령어를 사용하여 해결한다. 사실 이 명령어는 커밋 메시지를 수정하는게 아니라 아예 새로운 커밋을 만들고 마지막 커밋을 새로운 커밋으로 바꿔치는 명령어이다.

  • parent 노드: 마지막 커밋이 바라 보던 커밋

  • A: 기존 커밋 노드

  • B: amend한 커밋

  • parent (parent를 바라보는 노드는 A,B 둘다 임)

    • A
    • B
      • git/head

merge

  • 작동 순서
    1. git rebase b
    2. 두 브랜치간의 공통 부모 노드를 찾음
    3. 부모노드부터 b브랜치의 헤드까지 변경사항들을 찾음
      1. 말단 파일이 나올때까지 재귀적을 탐색하는데 효율을 위해 해쉬값이 변경되지 않은 디렉토리는 더 이상 탐색을 진행하지 않는다.
    4. 현재 브랜치에 변경사항들 적용
    5. merge 커밋은 부모 노드가 두개임. (대상이 되는 브랜치들)
      1. 참고로 부모커밋은 최대 2개까지만 가능하며 0개인 경우도 있다.(최초 커밋)

conflict

머지가 정상적으로 이루어지지 않은 경우, 자동적으로 병합되지 않고 충돌이 발생한다. 이때 어떤 코드를 지우고 어떤 코드를 남길것인지는 수동으로 직접 해결해줘야한다.

주로 병합하려는 커밋들의 변경사항중 동일한 위치의 코드가 존재하면 발생한다.장하고 있기 때문에 현재 내가 위치한 브랜치가 어딘지 알 수 있다.

cherry-pick

  • 다른 커밋의 변경사항을 현재 HEAD가 가리키고 있는 브랜치에 적용하는 명령어
  • 체리픽으로 커밋을 가져온 경우 커밋해쉬가 같지 않다. 다만 내용은 같아서 tree는 동일함
  • fast-forward
    • git cherry-pick branch-name -ff
    • 일반 체리픽을 하면 커밋이 새로 생성되지만 fast-forward 옵션을 붙이면 기존 커밋을 가져와 기존 커밋에 연결시킨다.
  • -n
    • git cherr-pick branch-name -n
    • 체리픽을 하지만, 커밋하기 직전까지만 수행한다. git status를 실행시 stage에 올라가있지만 커밋이 안되어있는 상태가 된다.

rebase 01
rebase-01.png

  • 지정한 커밋의 변경사항만 가져오는 예시

  • 한번에 여러개 체리픽하기

    • git cherry-pick a1 a2 a3
    • 연속적으로 있는 경우 git cherry-pick a1..a3

rebase

  • 작동 순서

    1. git rebase b
    2. 두 브랜치간의 공통 부모 노드를 찾음
    3. 부모노드부터 b브랜치의 헤드까지 변경사항들을 찾음
    4. 현재 브랜치에 변경사항들 적용
  • merge와 뭐가 다른가?

    • merge 커밋은 부모 노드가 두개임. (대상이 되는 브랜치들)
    • rebase는 부모노드가 1개임
  • rebase시, 현재 브랜치의 헤드가 대상이 되는 브랜치의 부모인 경우

rebase 02
rebase-02.png

- fast-forward 상태이기 때문에 변경사항이 없다. 다만 `-ff` 옵션을 사용하면 fast-foward가 아닌 머지가 가능하다.

Tags

Edit this page
최근 수정 시각 11/6/2022