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가 발생하는지 확인할 수 있다.
- Two steps of merging
- 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 |
댓글