GitNotes.12-2.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 12.2: Rebase 시 "ours" 와 "theirs", 로컬과 원격 개념 이해하기

rebase 수행시에는 "ours" 와 "theirs" 의 의미가 뒤바뀌게 된다:

git checkout topic git rebase master # topic 브랜치의 내용을 master 브랜치 위에 rebase 시킨다

어떤 것이던 HEAD 가 가리키고 있는 것이 "ours" 이다

위 예제의 rebase 명령이 첫번째로 수행하는 작업은 HEAD 를 master 로 재설정 하는 것이다; 이후 예전 브랜치인 topic 으로부터 커밋들을 새로운 브랜치에 cherry-pick 하게 된다 (이전 topic 브랜치의 모든 커밋들은 새로이 작성되어 원래 커밋과는 다른 hash 값을 갖게 될 것이다.)

merge 도구에서 나타내어지는 용어 측면에서 나타내면 (로컬 ref 혹은 원격 ref 의 용어와 혼동을 방지하기 위해)

=> 로컬은 master ("ours"), => 원격은 topic ("theirs")

이는 merge/diff 도구들이 upstream 브랜치를 로컬로 (master: rebase 의 기반이 되는 브랜치), 작업중인 브랜치는 원격으로 (topic: rebase 를 하려는 브랜치) 나타낼 것임을 의미한다

LOCAL:master BASE REMOTE:topic
MERGED

도식화된 설명

merge 수행 시:

c--c--x--x--x(*) <- 현재 브랜치 : topic ('*'=HEAD) \ \ \--y--y--y <- merge 수행하려는 다른 브랜치

이 경우에는 현재 브랜치가 topic 에서 변경되지 않으므로, 작업 수행 이후에도 작업 시작 전 위치에 그대로 있게 된다 (물론 다른 브랜치로부터 merge 는 완료된 상태일 것이다)

c--c--x--x--x---------o(*) MERGE (커밋), 여전히 topic 브랜치에 위치한다 \ ^ / \ ours / \ / \---y--y--y---/ ^ theirs

rebase 수행 시:

그러나 rebase 시에는 ours / theirs 가 바뀌게 되는데, 이는 rebase 가 수행하는 첫번째 작업이 현재 커밋들을 재적용 (replay) 하기 위하여 upstream 브랜치를 checkout 하는 것이기 때문이다.

c--c--x--x--x(*) <- 현재 브랜치 : topic ('*'=HEAD) \ \ \--y--y--y <- upstream 브랜치

git rebase upstream 명령 수행시 먼저 HEAD 를 upstream 브랜치로 설정하므로, 기존의 "현재" 브랜치에서의 'ours' 및 'theirs' 와 비교시 그 의미가 바뀌게 된다.

c--c--x--x--x <- 이전의 "현재" 브랜치, 이제 새로운 "theirs" 가 된다 \ \ \--y--y--y(*) <- 커밋 x 들을 재적용 (replay) 하기 위해 HEAD 를 이 커밋으로 설정한다 ^ 이것이 새로운 "ours" 가 될 것이다 | upstream 브랜치

rebase 는 이제 'their' 에 있는 커밋들을 새로운 'our' 토픽 브랜치에 재적용 (replay) 할 것이다:

c--c..x..x..x <- 이전 "theirs" 커밋들이나 이제는 "유령(ghosts)" 이 되어 "reflog" 을 통해서만 접근이 가능하다 \ \ \--y--y--y--x'--x'--x'(*) <- 모든 x 들이 재적용 완료된 다음, ^ topic 브랜치는 이 커밋을 가리키게 된다 | upstream 브랜치

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts