모도리는 공부중

[Git] Learngitbranching 사이트 문제 풀이 본문

내 지식 정리/날것 그 자체

[Git] Learngitbranching 사이트 문제 풀이

공부하는 모도리 2021. 6. 29. 18:11
728x90
반응형

2021.06.24 - [내 지식 정리/날것 그 자체] - [Git] 사용법 사이트 모음

 

[Git] 사용법 사이트 모음

git 공부용 사이트 약간 책 느낌 https://backlog.com/git-tutorial/kr/ 누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog 누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니

studying-modory.tistory.com

 


 

learngitbranching 사이트에서 내가 풀어가는 내용들.

 

연습모드에서 사용할 수 있는 git 명령어

  • commit
  • branch
  • checkout
  • cherry-pick
  • reset
  • revert
  • rebase
  • merge

 

- level intro3 : merge

 

 

이렇게 만들기 위해 내가 사용한 명령어는 6개이다.

git branch bugFix;
git checkout bugFix;
git commit;
git checkout main;
git commit;
git merge bugFix;

 그리고 원래 설명인 objective에서 시킨대로 하면 위의 그림과 달라진다.

 

그러나 모범답안은 5개라고 하니.. 대체 어떻게 해야 5개가 되는걸까? 나는 아직 답을 찾지 못했으니 답을 찾은 분은 댓글에 달아주시면 감사하겠다.

 

 

 

- level intro4 : rebase

 

브랜치끼리의 작업을 접목하는 방법 중 하나로, 커밋들을 모아서 복사한 뒤 다른 곳에 떨어뜨려 놓는다.

git rebase main 명령어 적용 전(1), git rebase main 적용 후(2), git rebase bugFix 적용 후(3)

rebase를 사용하면 C1 부모 아래에서 main과 별개로 커밋되어있던 작업인 bugFix가 C3'라는 작업내용으로 복사되어 main과 같은 줄로 이동된다. main 브랜치도 bugFix와 같은 위치를 가리키게 하고 싶다면 이 역시 rebase로 가능하다. 이 경우 main이 bugFix의 부모쪽에 있었으므로 단순히 그 브랜치를 bugFix쪽을 가리키게 이동하는 정도로 rebase의 역할이 그친다. (여기까지는 learngitbranching사이트 설명 그대로 기재. 내가 이해가 잘 안가서..)

 

왼 : 설명 목표 / 오른 : 실습 목표

입력한 명령어는 아래와 같이 7개이며, 모범답안은 6개이다.

git branch bugFix
git checkout bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main

 

 

- commit 이동하기 level rampup2, 3

 

 

git commit에서도 상대참조, 상대커밋이라는 기능이 존재한다. 이 상대기능을 이용하는 방법은 간단하게 2가지가 있다.

  • 한 번에 한 커밋 위로 움직이는 ^(캐럿)
    • 참조 이름에 하나씩 추가할 때마다 명시한 커밋의 부모를 찾는다.
    • main^ = main의 부모 / main^^ = main의 조부모
  • 한 번에 여러 커밋 위로 올라가는 ~<num>(틸드)
    • 한 번에 올라가고 싶은 부모의 개수(숫자)를 틸드 뒤에 추가한다.
    • HEAD~숫자 = 숫자만큼의 부모를 찾아 올라간다.

2개의 명령어로 통과. 모범 답안은 1개.

git checkout bugFix
git checkout HEAD^

 

-f 옵션을 이용하여 브랜치를 특정 커밋에 직접적으로 재지정할 수 있다.

왼 : 명령어 입력 전 / 오른 : 명령어 입력 후

git branch -f main HEAD~3

위와 같이 -f 옵션을 사용하면 HEAD를 움직이지 않고 main 브랜치를 바로 옮길 수 있다.

 

실습에 들어가보자.

 

지금부터 오답

더보기

오답1.

마치 merge를 먹인 것마냥 되었다.

 

오답2.

이번에도 merge 먹인 것 같네..

 

오답3. 그럼 이번엔 bugFix를 C6로 내려보자.

C6가 아니라 C7에 새로 커밋되어버렸네... 아오..

- 이미 있는 커밋으로 가는 것이 아닌 새로운 커밋을 생성한다는 것을 깨달음.

오답1.

git branch -f bugFix HEAD^

마치 merge를 먹인 것마냥 되었다.

 

오답2.

git checkout main
git branch -f bugFix

이번에도 merge 먹인 것 같네..

 

오답3. 그럼 이번엔 bugFix를 C6로 내려보자.

원하는대로 절대 안해줄거지롱.

C6가 아니라 C7에 새로 커밋되어버렸네... 아오..

git checkout bugFix
git commit

- 이미 있는 커밋으로 가는 것이 아닌 새로운 커밋을 생성한다는 것을 깨달음.

그리고 풀어낸 답

git checkout을 이용해서 먼저 C6로 이동 후 branch -f 브랜치명을 입력하면 현재 head위치로 브랜치가 강제 지정(이동)된다.

git checkout C6
git branch -f main
git checkout bugFix
git checkout HEAD^^
git branch -f bugFix C5~3

5개의 명령어를 사용하여 통과, 모범답안은 3개. 4개까지는 단축하였지만 3개는 아직 모르겠다.

git checkout C6
git branch -f main
git branch -f bugFix C5~3
git checkout HEAD^^^

 

 

- git에서의 작업 되돌리기 level rampup4

 

  1. 개별 파일이나 묶음을 스테이징하는 법 - 낮은 수준
  2. 실제 변경이 복구되는 방법 - 높은 수준
    • git reset
      • 각자 작업하는 로컬 브랜치의 경우 사용 가능. ex) git reset HEAD~1
      • 다른 사람이 작업하는 리모트 브랜치에 사용 불가.
    • git revert
      • 변경분을 되돌리고 다른 사람과 공유 가능. ex) git revert HEAD
      • 되돌리고자 하는 커밋 바로 아래에 새로운 커밋 생성. 다른 사람에게 변경내역 push 가능.

 

그럼 실습을 통해 학습해보자. 하나는 local, 하나는 리모트 환경이다. 두 개를 각각 진행해본다.

왼 : 실습 대상 / 오른 : 실습 목표

이번에는 목표답안대로 통과 완료!

git reset HEAD~1
git checkout pushed
git revert HEAD

 

 

- git cherry-pick level move1

 

  • 현재 HEAD 아래에 내가 선택한 커밋들의 복사본을 만드는 작업
  • 내가 원하는 커밋(각각의 해시값)이 무엇인지 알 때 유용하게 사용 가능
  • git cherry-pick <Commit1> <Commit2> <...>
  • rebase를 통해서도 할 수 있는 작업이지만 cherry-pick을 이용하면 기존 커밋을 가리지 않고 복사본만 head 밑에 생성

왼 : 실습 대상 / 오른 : 실습 목표

이것 역시 모범 답안대로 통과 완료.

git cherry-pick C3 C4 C7

 

 

- git Interactive Rebase level move2

 

  • 원하는 커밋을 모르는 상황에 사용. -i 옵션을 사용하여 리베이스할 일련의 커밋을 검토할 수 있음.
  • git rebase -i HEAD~<num>
  • 실제로는 vim과 같은 텍스트 편집기에서 사용하며 아래와 같은 환경이 아니다.
  • 원하지 않는 커밋(가릴 커밋)은 omit을 통해 숨길(제외할) 수 있으며, pick된 커밋만 복사가 가능하다.

 

왼 : 실습 대상 / 오른 : 실습 목표

목표대로 만들기 위해 입력한 명령어.

git rebase -i HEAD~4

아래는 인터렉티브 리베이스 대화창이다.

왼 : 변경 전 / 오른 : 변경 후

위와 같이 변경하면 문제가 요구하는 답을 풀어낼 수 있다.

 

 

- 딱 한 개의 커밋만 가져오기 level mixed1

 

왼 : 실습 대상 / 오른 : 실습 목표

문제를 해결하는 방법은 두 가지이다. rebase -i와 cherry-pick을 사용하는 방법. 각각의 방법에 따라 해결된 상태의 그림이 조금씩 다르다.

 

rebase -i를 사용하여 통과시 코드와 그림은 아래와 같다.

git rebase -i HEAD~3
git branch -f main bugFix

왼 : 인터렉티브 대화상자 / 오른 : 해결된 커밋들

 

cherry-pick을 사용하여 통과시 코드와 그림은 아래와 같다.

git checkout main
git cherry-pick bugFix

cherry-pick을 사용시 위의 그림처럼 C4[bugFix]가 음영처리되지 않고 그대로 남아있는 것이 아쉽지만 문제가 요구하는 바는 해결된 것으로 나온다.

 

 

728x90
반응형
Comments