My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


Git branching 파헤치기

깃 브랜치를 밑의 사이트를 통해서 배워보는 시간을 가졌습니다.

참고링크 : https://learngitbranching.js.org/

1) Git Branch - 기초

Branch : 하나의 커밋과, 그 부모 커밋들을 포함하는 작업 내역

  • 브랜치는 따로 무언가를 만드는게 아니라, 특정 커밋에 대한 참조일 뿐이다!

    => 때문에 작은 단위로 잘게 나누는게 좋다.

1-1. 새로운 branch 만들기

git branch newimage
  • newimage라는 브랜치를 만들기.
    • 만들어진 branch는 현재 커밋을 바라보고(참조) 있음

1-2. 새로운 commit 만들기

git commit
  1. 새로운 커밋 히스토리가 만들어짐.
  2. 현재 조종하고 있는 branch가 새로운 커밋 히스토리를 가리킴
  • !!주의점!!

    newImage라는 브랜치를 만든다 하여도, 현재 조종하고 있는 branch가 newImage로 바뀌는 것은 아니다!

1-3. branch 이동하기

git checkout [브랜치명]

현재 조종하고 있는 branch를 바꾸기 위해서는 checkout이라는 명령어를 사용합니다.

2) 브랜치들의 작업 공유

브랜치끼리의 작업을 접목하는 방법은 두 가지 (mergerebase)입니다.

2-1. git merge : 새로운 커밋 생성

  • 두 branch의 부모를 가리키는 특별한 커밋을 만들어냄.
  • 특별한 커밋 : 두 부모의 모든 작업내역 + 두 부모의 모든 부모들의 작업내용을 포함.

ex) bugFix 브랜치를 master 브랜치에 합치는 작업

1

git merge bugFix
  • !!주의!! : 합쳐질 브랜치가 아니라 합칠(master) 브랜치에서 merge를 입력해야합니다.
  1. 새로운 커밋이 생긴다.
  2. master branch는 새로운 커밋을 가리킨다.
  3. 그 새로운 커밋은 master와 bugFix의 기존 커밋를 가리킨다.

하지만, 아직 bugFix 브랜치에서는 새로운 커밋을 잘 모르기 때문에, bugFix 브랜치에서도 같은 작업을 해주어야 합니다.

git checkout bugFix;
git merge master;

2-2. 리베이스(rebase)

리베이스 : 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 작업.

=> 장점 : 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있음.

ex) bugFix 브랜치에서 리베이스

2

git rebase master
  • bugFix 브랜치에서의 작업을 master 브랜치 위로 직접 옮겨놓기.
  1. C3의 복사본 커밋 C3'이 master 의 자식으로 생성됨.
  2. C3' 은 master와 bugFix의 공동 부모 커밋인 C2를 가리키게됨.

어딘가에 남아있는 C3 커밋을 처리하기 위해서 추가 작업을 거쳐야 합니다.

git checkout master
git rebase bugFix

이미 이 상태에서는 master 자식 커밋이 C3'이므로 특별한 커밋이 더 생겨날 필요 없이 그냥 master만 C3' 으로 이동합니다.

3) Commit Tree 이동 명령어

깃의 커밋트리를 이동할 수 있는 여러가지 방법들

3-1. HEAD 분리

HEAD : 현재 체크아웃된(작업중인) 커밋

보통 HEAD를 branch에 붙이기도 하지만, branch가 아니라 특정 Commit에 붙일 수 있습니다.

git checkout C4

그런데 보통, 커밋은 해시값으로 이루어져 있기 때문에 저기 C4처럼 간단한 값이 아니라, 복잡한 해시값이 들어가게 됩니다.

따라서, git log를 입력해서 해시값을 검색해야하는 문제점이 생깁니다.

(물론 일부분 값만 입력해도 그것으로 특정할 수 있다면 상관없습니다.)

3-2. 상대 참조

그런 문제점을 상대참조로 해결할 수 있습니다.

ex) ^ 연산자

git checkout master^ // 현재 HEAD를 master의 부모로 옮김.

git checkout HEAD^ // 현재 HEAD를 HEAD의 부모로 옮김.

ex) ~ 연산자

git checkout HEAD~4 // HEAD의 4칸 부모를 의미함.

3-3. Branch 강제로 옮기기

일반적으로 상대참조는 branch를 옮길 때 사용한다고 합니다.

-f 옵션을 이용해서 branch를 특정 커밋에 재지정할 수 있습니다.

git branch -f master HEAD~3
  • master 브랜치의 위치를 HEAD의 3칸 부모로 지정한다.

4) Git에서 작업 되돌리기

git에서 작업내역을 되돌리는 방법은 git reset과 git revert를 쓰는 두 가지 방법이 있습니다.

!!주의!! git reset과 git revert의 문법은 약간 다른데, 두 명령어의 차이점을 이해해야합니다.

4-1. git reset

git reset : 우리 브랜치가 예전의 커밋을 가리도록 이동하는 방식.

git reset HEAD^ // HEAD -> HEAD^로 이동

브랜치가 이동만 할 뿐이므로 기존의 커밋은 남아있습니다. 하지만, 아무도 참조하지 않으니 없는 것과 마찬가지의 커밋이 될 수도 있습니다.

4-2. git revert

git revert : 변경 부분을 되돌리는 것과 같은 기능을 하는 새로운 커밋을 생성 후 이동

git revert HEAD
  1. HEAD 밑에 새로운 커밋이 생긴다
  2. 그 커밋은 기존 HEAD 자리의 커밋과 정반대의 내용임.
  3. HEAD가 새로운 커밋으로 이동한다.
comments powered by Disqus