📌 연습 중인 git branching 사이트
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
종합선물세트
Level 1. 9천번이 넘는 리베이스
🗒️문제🗒️
음, 여기 꽤 여러개의 브랜치가 있습니다! 이 브랜치들의 모든 작업내역을 main 브랜치에 리베이스 해볼까요?
윗선에서 일을 복잡하게 만드네요 -- 그 분들이 이 모든 커밋들을 순서에 맞게 정렬하라고 합니다. 그럼 결국 우리의 최종 목표 트리는 제일 아래에 C7' 커밋, 그 위에 C6' 커밋, 또 그 위에 순서대로 보여합니다.
만일 작업중에 내용이 꼬인다면, reset이라고 쳐서 처음부터 다시 시작할 수 있습니다. 모범 답안을 확인해 보시고, 혹시 더 적은 수의 커맨드로 해결할 수 있는지 알아보세요!
commit들의 흐름을 보기 좋게 한 줄로 만들기 위해서는 rebase를 사용해야 한다!
1) git rebase main bugFix
: main 브랜치에 bugFix 브랜치를 rebase한다.
2) git rebase bugFix side
: bugFix 브랜치에 side 브랜치를 rebase 한다.
3) git rebase side another
: side 브랜치에 another 브랜치를 rebase한다.
4) git rebase another main
: another 브랜치에 main 브랜치를 rebase 한다. (👉 fast-forward : another가 main 브랜치 이후의 commit을 가리키고 있었는데, main을 another 브랜치로 rebase 시켜서 같은 commit을 가르키도록 이동시키기만 함)
Level 2. 다수의 부모
~
처럼 ^
도 뒤에 숫자를 추가할 수 있다.
~이 몇 개의 세대를 돌아갈지 정하는 것 대신, ^은 병합이 된 commit에서 어떤 부모를 참조할지 선택할 수 있다.
병합된 commit들은 다수의 부모를 가지고 있는데, git은 보통 병합된 commit에서 "첫" 부모를 따라간다.
하지만 ^
을 숫자와 함께 사용하면 앞의 디폴트 동작대로가 아닌 다른 결과가 나타난다.
첫번째가 처음 상태이고, 차례로 git checkout main^
/ git checkout main^2
결과
여러 단계를 한 번에 합쳐서 사용할 수도 있다. git checkout HEAD~^2~2
🗒️문제🗒️
이 레벨을 완료하기 위해서 정해진 목적지에 새 브랜치를 생성하세요.
물론 커밋을 직접 특정지어주면 아주 쉽겠지만(C6과 같이), 수식을 익혀볼겸 배운것을 사용해 도전해 봅시다!
git branch bugWork HEAD~^2~
: bugWork 브랜치를 만드는데, HEAD~^2~가 가리키는 곳을 따라간 목적지인 C2 commit을 참조해서 생성한다.
Level 3. 브랜치 스파게티
🗒️문제🗒️
음, 이번에는 만만치 않습니다!
여기 main 브랜치의 몇 번 이전 커밋에 one, two,three 총 3개의 브랜치가 있습니다. 어떤 이유인지는 몰라도, main의 최근 커밋 몇 개를 나머지 세 개의 브랜치에 반영하려고 합니다.
one 브랜치는 순서를 바꾸고 C5커밋을 삭제하고, two브랜치는 순서만 바꾸며, three브랜치는 하나의 커밋만 가져옵시다!
자유롭게 이 문제를 풀어보시고 나서 show solution명령어로 모범 답안을 확인해보세요.
1) git checkout one
: one 브랜치로 이동
2) git cherry-pick C4 C3 C2
: 현재 HEAD가 있는 위치 아래에 C4, C3, C2 commit을 차례대로 복사해서 가져오기
3) git checkout two
: two 브랜치로 이동
4) git cherry-pick C5 C4 C3 C2
: 현재 HEAD가 있는 위치 아래에 C5, C4, C3, C2 commit을 차례대로 복사해서 가져오기
5) git branch -f three C2
: (강제로) three 브랜치를 C2 commit으로 옮기기