View
Learn Git Branching 2탄!
Learn Git Branching 풀이
✋ Git 커밋 한개만 가져오기: 새로운 작업을 하는데, 작업했던 브랜치에서 오류가 생겨버렸다. 그 오류를 해결하고 이제 새로 작업하는 브렌치에 합치면 된다. 하지만 이때 문제가 생기는데 간단하게 최신브렌치로 옮겨벌면 그 불필여한 디버그용 코드들도 함께 들어가버린다는 것이다. 이런 문제를 해결하는 방법에 추천하는 방법이 두가지가 있다. 앞에서 다뤘던 체리픽과 리베이스다. i옵션을 이용한 리베이스를 사용하여 어떤 커밋을 버릴지, 데려올지 선택할 수 있다. 아니면 체리픽으로 개별 커밋을 골라서 HEAD위에 떨어뜨릴 수 있다.
🖥 문제 : 이번 레벨을 통과하기 위해 어떤 방법을 쓰시든 자유입니다만, main브랜치가 bugFix 브랜치의 커밋을 일부 가져오게 해주세요.
> git checkout master
> git cherry-pick C4
🖥 문제 :
-
git rebase -i 명령으로 우리가 바꿀 커밋을 가장 최근 순서로 바꾸어 놓습니다
-
git commit --amend 명령으로 커밋 내용을 정정합니다
-
다시 git rebase -i 명령으로 이 전의 커밋 순서대로 되돌려 놓습니다
-
마지막으로, main을 지금 트리가 변경된 부분으로 이동합니다. (편하신 방법으로 하세요)
이 목표를 달성하기 위해서는 많은 방법이 있는데요(체리픽을 고민중이시죠?), 체리픽은 나중에 더 살펴보기로 하고, 우선은 위의 방법으로 해결해보세요. 최종적으로, 목표 결과를 눈여겨 보세요 -- 우리가 커밋을 두 번 옮겼기 때문에, 두 커밋 모두 따옴표 표시가 붙어있습니다. 정정한(amend) 커밋은 따옴표가 추가로 하나 더 붙어있습니다.
> git rebase -i caption~2
// 팝업 ui가 뜨면
-> C2와 C3의 위치를 변경한다.
> git commit --amend
> git rebase -i caption~2
// 팝업 ui가 뜨면
-> C2와 C3의 위치를 변경한다.
> git branch -f master caption
🖥 문제 : 그럼 이번 레벨에서는 아까와 마찬가지로 C2 커밋의 내용을 정정하되, rebase -i를 쓰지 말고 해보세요.
> git checkout master
> git cherry-pick C2
> git commit --amend
> git cherry-pick C3
✋ Git 태그: 작업할때, 중요한 커밋지점에서 영구적인 표시를 남기고 싶다면 태그기능을 사용할 수 있다. 릴리즈, 큰 브렌치 병합에서 사용하면 아주 유용한 기능이다. git 태그는 특정 커밋들을 브랜치로 참조하듯이 영구정인 milestone(이정표)로 표시한다. 중요한 점은, git 태그는 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다는 것이다.
🖥 문제 : 이번 레벨에서는 goal에 나타난것과 같이 태그를 만들고 v1을 체크아웃하면 됩니다. 분리된 HEAD 상태로 변하는것을 확인 해 보십시오 -- 이것은 v1 태그에 직접 커밋을 할 수 없기 때문입니다. 다음 레벨에서는 태그의 더 흥미로운 활용 방법을 확인해 볼 것입니다.
> git tag v0 C1
> git tag v1 C2
> git checkout C2
✋ Git Describe: 커밋트리에서 태그는 훌륭한 닻 역할을 하기 때문에, git에는 사용자가 가장 가까운 닻에 비해 상대적으로 어디 위치했는지 묘사(describe)해주는 명령어가 있다. 해당 명령어가 git describe이다. 이 명령어는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고나서 커밋 트리에서 방향감각을 되찾는데 도움을 준다. 문제되는 커밋을 찾는 명령어라고 생각하자.
// describe 형태
> git describe <ref>
위 형태에서 ref에는 커밋을 의미하는 그 어떤것도 쓸 수 있다. 만약 ref를 특정지어주지 않으면, git은 지금 체크아웃된곳을 사용한다. 명령어를 사용하면 나오는 출력 결과는 아래와 같다.
// describe 명령어 출력결과
<tag>_<numCommits>_g<hash>
가장 앞에 있는 tag는 가장 가까운 부모태그를 나타낸다. numCommits은 현재 위치에서 그 태그가 몇 커밋 멀리있는지 나타낸다. 마지막으로 hash는 묘사하고 있는 커밋의 해시를 나타낸다.
🖥 문제 :이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다. 준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P
// 하고싶은만큼 테스트하면서 기능을 사용한 후
> git commit
✋ Git 여러브랜치 리베이스(rebase)
🖥 문제 :음, 여기 꽤 여러개의 브랜치가 있습니다! 이 브랜치들의 모든 작업내역을 main 브랜치에 리베이스 해볼까요? 윗선에서 일을 복잡하게 만드네요 -- 그 분들이 이 모든 커밋들을 순서에 맞게 정렬하라고 합니다. 그럼 결국 우리의 최종 목표 트리는 제일 아래에 C7' 커밋, 그 위에 C6' 커밋, 또 그 위에 순서대로 보여합니다. 만일 작업중에 내용이 꼬인다면, reset이라고 쳐서 처음부터 다시 시작할 수 있습니다. 모범 답안을 확인해 보시고, 혹시 더 적은 수의 커맨드로 해결할 수 있는지 알아보세요!
> git rebase master bugFix
> git rebase bugFix side
> git rebase side another
> git rebase another master
✋ Git 부모를 선택하기: 틸드연산자(~) 수식처럼 캐럿연산자(^) 또한 뒤에 숫자를 추가할 수 있다. 틸드연산자처럼 몇개의 세대를 돌아갈지 정하는것 대신, 캐럿연산자는 병합이된 커밋에서 어떤 부모를 참조할지 선택할 수 있다. git은 보통 병합된 커밋에서 '첫' 부모를 따라간다. 하지만 캐럿연산자를 숫자와 함께 사용하면 앞의 디폴트 동작대로가 아닌 다른 결과가 나타난다.
🖥 문제 :이 레벨을 완료하기 위해서 정해진 목적지에 새 브랜치를 생성하세요. 물론 커밋을 직접 특정지어주면 아주 쉽겠지만(C6과 같이), 수식을 익혀볼겸 배운것을 사용해 도전해 봅시다!
> git branch bugWork master~^2~
🖥 문제 : 음, 이번에는 만만치 않습니다! 여기 main 브랜치의 몇 번 이전 커밋에 one, two,three 총 3개의 브랜치가 있습니다. 어떤 이유인지는 몰라도, main의 최근 커밋 몇 개를 나머지 세 개의 브랜치에 반영하려고 합니다. one 브랜치는 순서를 바꾸고 C5커밋을 삭제하고, two브랜치는 순서만 바꾸며, three브랜치는 하나의 커밋만 가져옵시다! 자유롭게 이 문제를 풀어보시고 나서 show solution명령어로 모범 답안을 확인해보세요.
> git checkout one
> git cherry-pick C4 C3 C2
> git checkout two
> git cherry-pick C5 C4 C3 C2
> git branch -f three C2
'Review' 카테고리의 다른 글
javascript로 S3 엑셀 파일 업로드, S3 엑셀 파일 읽기 (0) | 2021.04.27 |
---|---|
MAC에서 CORS policy 오류 해결하기 (0) | 2021.03.19 |
Learn Git Branching 정답 - 1편 (0) | 2021.03.03 |
Font Awesome(폰트어썸)의 기능 (0) | 2021.02.25 |
Flexbox Froggy 정답 (1) | 2021.02.24 |