티스토리 뷰

study/Git

Git - rebase, merge

xoxowo 2022. 8. 10. 23:40

특정 브랜치에서 작업을 하다 다른 브랜치와 병합할 경우가 많은데, 이때 사용하는 명령어는 2가지가 있는데, 하나는 rebase이고 다른 하나는 merge 다. 

 

Rebase의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 Merge의 경우는 두 브랜치의 최종 결과만을 가지고 합친다. Rebase를 하든지, Merge를 하든지 최종 결과물은 같고 커밋 히스토리만 다르다는 것이 중요하다.

 

Merge

 C4와 C3로 나눠진 브랜치의 커밋 히스토리인데, 결국 메인(master) 브랜치와 작업 브랜치(experiment)가 C2로 병합되는데 가장 쉽게 사용하는 명령어가 merge 이다.

 

merge는 각 브랜치에서 작업할 때 사용했던 commit 들이모도 합쳐지는데 시간 순서대로 아래에서 위로 쌓이게 된다.

(최근 commit이 맨 위)

 

여러 명이 각 브랜치에서 작업했을 때 작성했던 commit들이 merge 되면 시간 순으로 정렬되기 때문에 어떤 작업을 해서 commit 한 건지 확인이 어려울 수 있다.

# git.log -> 각 branch에서 작업한 commit들이 merge 되면서 시간순으로 자동으로 정렬됨

commit 89489c561a5c2b3708f7659ded711c0c98db490c (HEAD -> main, origin/main, origin/HEAD)
Merge: 18a1467 37c7c1b
Author: Code Kim <73090474+codekim@users.noreply.github.com>
Date:   Thu Jul 28 17:51:27 2022 +0900

    Merge pull request #24 from c/hot-fix
    
    [김코드] 기타 수정사항 관련

commit 37c7c1b2c8a8efbd8ca4fd1ac9f9173ead1ef9cf
Author: ehdrb92 <kcj@gmail.com>
Date:   Thu Jul 28 17:50:04 2022 +0900

    Other changes reflected 2nd

commit 22b72ee1f1c6d1c11a86934473be33a8ca25aa3e
Merge: c3ad2a6 18a1467
Author: ehdrb92 <kcj@gmail.com>
Date:   Thu Jul 28 17:26:52 2022 +0900

    qMerge branch 'main' of https:// ... main

commit c3ad2a61f03714de8f7336f3ccc2c913a4b78e4d
Author: ehdrb92 <kcj@gmail.com>
Date:   Thu Jul 28 17:26:11 2022 +0900

    Other changes reflected

commit 18a1467181a74aa291d67790d0826817a28fbaa1
Merge: c0b7bd0 14f343a
Author: Code Kim <73090474+codekim@users.noreply.github.com>
Date:   Thu Jul 28 16:47:41 2022 +0900

    Merge pull request #23 from e/feature/order-push
    
    [김코드] 장바구니 코드 리팩토링

 

Rebase

rebase는 보통 리모트 브랜치에 커밋을 깔끔하게 적용하고 싶을 때 사용하기도 하고, 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치기도 한다.

 

만약, A 브랜치와 B브랜치와 merge 될 때 A브랜치의 commit과 B브랜치의 commit 이같이 병합되기 때문에 git log가 보기 어려울 수 있다. 그럴 때 기존에 작업했던 commit들을 같이 묶어 하나의 commit으로 만들 때 사용한다.

 

아래와 같이 commit을 3개 남기고 이 commit을 하나로 합칠 때 rebase 명령어를 사용한다.

commit 256855526a974d16f8ad2a750723dbb73f3c2cb9 (HEAD -> feature/order)
Author: xoxowo <xoxo@gmail.com>
Date:   Wed Aug 10 19:35:17 2022 +0900

    rebase 실험2

commit 2019886e653b15ab437676bd3030f208a971c102
Author: xoxowo <xoxo@gmail.com>
Date:   Wed Aug 10 19:31:44 2022 +0900

    rebase 실험1

commit a863c9bc28d906eacf50b1a64987e4e9be31f958
Author: xoxowo <xoxo@gmail.com>
Date:   Wed Aug 10 19:30:47 2022 +0900

    rebase 실험

작업 브랜치에서 rebase 명령어를 실행한다

$ git rebase -i main // main 브랜치와 rebase

rebase 명령어를 실행하면 아래와 같이 어떤 commit을 기준으로 합칠 건지 창이 뜨는데 여기서 선택하면 된다.

pick a863c9b rebase 실험	 # 기준이 될 commit을 pick으로 남기고
pick 2019886 rebase 실험1  # 합칠 commit을 pick이아닌 s 로 바꿔준다. -> s 2019886 rebase 실험1
pick 2568555 rebase 실험2  #				      -> s 2568555 rebase 실험2

# Rebase 2bdc058..2568555 onto 2bdc058 (3 commands)
#
# Commands:
#			이하 생략 ...

picks(squash)으로 커밋을 선택하면 작성했던 commit 메시지를 수정할 수 있는 vim문서가 뜨고 여기서 수정할 메세지를 재작성한다.

# This is a combination of 3 commits.
# This is the 1st commit message:

rebase 실험   # 여기서 남길 commit 메세지를 작성하면된다.
	     # 아래 commit들은 삭제해도 무방하다.
# This is the commit message #2:  

rebase 실험1

# This is the commit message #3:

rebase 실험2

수정하고 저장한 뒤 git log를 확인하면 'rebase 해보기!' commit 한 개만 남은 것을 확인할 수 있다.

commit 9233e63a6a93d9a1f10ea95a798ee4667e62426f (HEAD -> feature/order)
Author: xoxowo <xoxo@gmail.com>
Date:   Wed Aug 10 19:30:47 2022 +0900

    rebase 해보기!

commit 2bdc058eea8ff3051dd6b7c928cc943b39f708ac (origin/main, main)
Merge: 83fa92b 616eede
Author: xoxowo <94777292+xoxowo@users.noreply.github.com>
Date:   Thu Jul 21 13:22:06 2022 +0900

    Merge pull request #2 from xoxowo/feature/user
    
     Add : users app 추가

'study > Git' 카테고리의 다른 글

cherry-pick 🍒  (0) 2023.07.11
Git-remote, push, pull  (0) 2022.06.08
Git-branch  (0) 2022.06.06
Git- Staged  (0) 2022.06.05
Git - init, add, commit  (0) 2022.06.04
댓글