본문 바로가기
인턴/준비

Git #4 Branching

by 사향낭 2022. 12. 31.
 

Git Theory - 4 - Branching

This part of Git series covers branching concepts using checkout, merge, rebase and handling conflict scenarios

bobbydreamer.com

 

  • git branch
    • 같은 파일에 대해 여러가지 버전을 독립적으로 만들고자 할 때 사용한다.
    • 2020년의 BlackLivesMatter (BLM) 운동으로 default branch가 master에서 main으로 수정되었다고 한다.
    • HEAD는 언제나 branch의 끝을 가리킨다.
    • branch는 언제나 가장 최근의 commit을 가리킨다.
    • HEAD를 다른 commit point로 옮기는 경우 HEAD의 상태를 'detached HEAD'라 부른다.
    • git checkout <sha1> \ git checkout <tag_name> : branch가 특정 commit을 가리키도록 한다.
    • git checkout master : master branch로 되돌린다.
    • git branch : 현재 branch HEAD가 가리키고 있는 branch를 말해준다.
    • git checkout -b feature : 새로운 feature branch를 생성하고 branch를 옮긴다.
    • git checkout -b feature master : master branch를 기반으로 feature branch를 만든다.

  • git merge
    • Two steps of merging
      1. merge를 원하는 branch로 branch를 옮긴다.
      2. 원하는 branch를 merge한다.
    • 두 branch가 linear한 관계에 있다면 앞에 위치한 commit으로 fast-forward를 한다.
    • 3-way merge (recursive strategy)
      병합하려는 두 branch와 공통 조상 commit 세 commit을 가지고 병합을 한다.
      공통 조상 commit과의 비교를 통해 어떤 branch에서 변화가 있었는지, conflict가 발생하는지 확인할 수 있다.

https://wonyong-jang.github.io/git/2021/02/05/Github-Merge.html

 

  • delete branch
    • git branch --merged : 병합된 모든 branch를 확인한다.
    • git branch -d feature : (이름이 feature인) branch를 삭제한다.
    • git branch -D feature : git은 병합되지 않은 branch 삭제를 막고있기 때문에 -D flag를 통해 강제로 branch를 삭제할 수 있다.
    • git branch --track <new-branch> <remote-branch> : remote-branch에 기반한 새로운 branch를 만든다.
    • git branch -m name : 현재 branch 이름을 name으로 바꾼다.

 

  • git reflog
    • reference log의 줄임말이다.
    • branch에 변경사항이 있을 때 이를 기록한다.
    • git reset --hard로 HEAD와 staging area, working directory 모두를 변경하였을 때 이를 되돌리기 위해 reflog를 통해 이전 commit의 hash를 확인할 수 있고 다시 복구할 수 있다.
    • git checkout, git reset, git merge가 일어났을 때 git reflog가 이들을 기록한다.
    • HEAD가 변경되었을 때만을 기록하기 때문에 git checkout -- <filename>과 같이 file의 변경은 기록하지 않는다.
      (이러한 경우에는 회복할 수 없다.)
    • git reflog는 default로 90일 동안 HEAD의 변경을 저장해둔다.

 

  • git rebase
    • local에 위치한 unpublished commits들에 대해 적용하는 것이 권장된다.
    • 두 branch를 합치지만 git merge와는 다르게 수행된다.
    • git checkout feature | git rebase master
    • feature branch의 commit 이력을 master branch가 가리키는 tip에 붙인다.
    • git checkout master | git merge feature 로 master branch를 feature branch가 가리키는 곳을 바꿔줄 수 있다.
      (git checkout 원하는 commit hash로 바꿔줄 수도 있다.)
    • branch가 다양하게 뻗어 있는 경우 branch history를 깔끔하게 만들어줄 수 있다.
    • git rebase -i HEAD~2 : HEAD가 가리키고 있는 commit의 parent를 없앨 수 있다.
      (엄밀히 말해 HEAD의 parent의 parent에 HEAD를 붙인다.)
      (실행될 때 vim editor가 열리는데 어떻게 작동할 것인지를 명시하여야 한다.)

 

 

  • Handling conflicts
    • reverting changes, merging branches, rebasing 때 conflict가 발생한다.
    • 변화를 reverting 할 때 conflict의 발생은 되돌리려는 타겟인 특정 commit, 특정 commit의 parent, 그리고 현재 HEAD의 내용의 차이에 따라 발생한다.
    • branch를 merge할 때 conflict의 발생은 두 branch의 내용, 그리고 두 branch의 공통 조상의 내용이 모두 다를 때 발생한다.
      (어떤 내용으로 merge 해야하는지 모르기 때문)
    • rebasing때 conflict의 발생은 붙이려는 commit 가장 앞의 변경사항과 commit을 붙이려고 하는 HEAD 부분이 다를 때 발생한다.

 

  • git switch
    • git checkout과 비슷한 종류이다.

'인턴 > 준비' 카테고리의 다른 글

What is a REST API  (0) 2023.01.07
Go Language #2  (0) 2023.01.06
Git #3 Revert, reset and restore  (0) 2022.12.30
Git #2 Basics  (1) 2022.12.29
Git #1 Origins story and terms  (0) 2022.12.27

댓글