git branch 공부하기
들어가며
https://learngitbranching.js.org/ 를 통해 깃허브 브랜치를 공부하고 개념들을 정리해본다.
Git commit 소개
- 커밋은
스냅샷
이다. - Git은 커밋을 가볍게 유지하고자 하기 때문에, 변경내역(delta)을 저장한다.
- 정답 코드:
git commit
git commit
Git 브랜치
- 브랜치는
커밋에 대한 참조
이다. 하나의 커밋과 그 부모 커밋들을 포함하는 작업내역이라고 생각하면 된다. - 브랜치는 많이 만들어도 메모리나 디스크 공간에 부담이 되지 않는다.
git branch
명령어는 현재 지점에 새로운 브랜치를 만들어 놓는다. 즉가장 최근 커밋을 참조하는 다른 브랜치를 생성한다.
- 생성만 할 뿐, 이동하지는 않는다. 이동 명령어는
git checkout 브랜치명
으로 할 수 있다. (check out = look at) checkout은 기본적으로 HEAD를 조작하는 명령어이다.
- 정답 코드:
git branch bugFix
git checkout bugFix
브랜치와 합치기
- 명령어에서 항상 지금 자신이 있는 브랜치는 언급할 필요가 없다.
- 브랜치는 커밋 위에 있는 포인터와 같고, 내가 움직여주지 않으면 움직이지 않는다.
- 자신의 브랜치에서 새로운 커밋이 생기면 브랜치는 마지막 커밋을 참조한다. 그런데 다른 브랜치는 움직이지 않는다.
- main에서 git merge bugFix를 하면,
main과 bugFix의 마지막 커밋을 참조하는 새로운 커밋이 생긴다.
- 그러면 다른 브랜치 bugFix는 아직 merge 전의 커밋을 가리키고 있기 때문에, checkout 후 merge를 해주어야 한다.
- 정답 코드
git branch bugFix
git checkout bugFix
git commit
git checkout main
git commit
git merge bugFix
Git Rebase
rebase
는 커밋들을 모아서 복사한 뒤 다른 곳에 떨궈 놓는 것이다.git rebase something
은 something을 내 브런치의 부모로 삼아라.. 정도로 이해하자. 정확히는 타겟지점과 공통지점까지 올라간다음 내 갈래를 타겟에 붙이는 것.- 브랜치 A에서 git rebase B를 한다는 것은 A의 베이스 브랜치를 B로 하겠다.. 라고 생각하면 된다.
- 커밋들의 흐름을 보기 좋게 만들 수 있다.
git rebase [브랜치이름]
을 하면 현재 브랜치의 작업내역이 복사되어브랜치이름
브랜치로 편입된다.- 만약 두 커밋이 이미 한 줄이라면 더 나중에 한 커밋 쪽으로 브랜치가 이동한다.
- 정답코드:
git branch bugFix
git checkout bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main
Git에서 여기저기 옮겨다니기
- HEAD는 커밋과 브랜치 모두 돌아다닐 수 있는 포인터이다.
- HEAD가 branch를 가리키고 있을 때는 브랜치 밑에 숨어있다.
- HEAD가 브랜치를 통해서가 아니라 커밋을 직접 가리킬 수 있다.
- 정답 코드:
git checkout C4
상대 참조
- 커밋 해시를 다 입력하지 않아도, 식별가능할 정도로만 입력해도 된다.
^
는 한 커밋 위로 움직일 수 있다.~<num>
은 여러 커밋 올라갈 수 있다.[해시]
또는[브랜치이름]
또는HEAD
모두 상대참조기호 앞에 올 수 있다.- 정답 코드:
git checkout C4^
브랜치 강제로 옮기기
- git branch는 기본적으로 브랜치를 만들 때 쓰인다. 그런데 이미 있는 이름으로
git branch -f [이미있는이름] [위치]
를 하면 해당 위치로 브랜치가 옮겨진다. 위치는 HEAD를 통해 상대참조할 수 있다.. - 정답코드
git branch -f bugFix bugFix~3
git checkout HEAD~1
git branch -f main C6
Git에서 작업 되돌리기
git reset [위치]
는 HEAD가 속한 브랜치를 위치 지점의 커밋으로 되돌린다. 애초에 커밋하지 않은 것처럼. 커밋이 모두 삭제된다.git revert [위치]
는 HEAD가 속한 브랜치가 가리키고 있는 작업내역의 역 작업내역을 커밋한다.- 두 기능 모두 HEAD가 속한 브랜치에 적용된다는 사실을 잊지말자!!
- 정답코드:
git reset HEAD~1
git checkout pushed
git revert pushed
작업을 여기저기로 옮기기(cherry-pick)
cherry-pick
: to take or buy only the best things from a group- 영영사전 말처럼,
다른 갈래의 커밋
중 필요한 커밋만 골라서 가져온다. - git cherry-pick은
HEAD
를 기준으로 적용된다. - 정답코드:
git cherry-pick C3 C4 C7
Git Interective Rebase
cheery-pick
은 원하는 커밋이 뭔지 알아야 하는데, 모를 때는 이 기능으로 검토할 수 있다.git rebase -i (위치)
위치 다음 커밋부터 배치를 조작해서 갈아끼울 수 있다.- 정답코드:
git rebase -i C1
딱 한 개의 커밋만 가져오기
git rebase -i C1
git checkout main
git rebase bugFix
커밋들 갖고 놀기
git commit --amend
를 이용하면 최신 커밋 내용을 정정할 수 있다.- 해당 미션에서는 rebase -i를 이용해 순서를 바꾸고, 최신커밋을 수정, 그리고 다시 순서를 바꾼 후 리베이스를 하는 것을 요구한다.
- 브랜치 째로 옮길 때는
git branch -f 위치
로 브랜치 포인터를 이동시키자. - 정답코드:
git rebase -i C1
git commit --amend
git rebase -i C1
git branch main -f C3''
커밋 갖고 놀기 #2
- 정답코드:
git checkout main
git cherry-pick C2
git commit --amend
git cherry-pick C3
Git 태그
- branch는 유동적인 것이다.
tag
는 닻 같은 역할을 한다. 태그를 체크아웃해도 그 태그에서 어떤 작업을 추가적으로 진행할 수는 없다.git tag (태그이름) (위치)
는 위치에 태그를 남긴다. 커밋 위치를 지정해주지 않으면 현재 HEAD에 태그를 붙이게 된다.- 정답 코드:
git tag v0 C1
git tag v1 C2
git checkout v1
Git Describe
- 태그를 기준으로 묘사를 해준다.
git describe <ref>
로 수행한다.- ref를 지정하지 않으면 HEAD를 기준으로 describe가 된다.
- 결과는 tag_numCommits_g+hash 순으로 나타난다.
- tag는 가장 가까운 조상커밋, numCommits는 그커밋과의 거리, hash는 묘사하고 있는 커밋의 해시이다.
- 즉 정리하자면, git describe something은 something이 가장 가까운 이정표(milestone, 곧 tag)로부터 얼마나 떨어져있고, something의 해시값은 무엇인지를 나타낸다.
- 만약 git describe 해시값을 주었을 때는 마지막에 나오는 해시값이 그대로 나오게 된다.
- milestone 자체를 descirbe 해달라고 하면 tag가 나온다.
- 정답코드:
자유롭게 연습 ...
git commit
9000번이 넘는 리베이스
git checkout bugFix
git rebase main
git checkout another
git rebase C6
git rebase bugFix
git branch -f main C7''
다수의 부모
^
연산자 뒤에 커밋을 붙이면 어떤 부모를 참조할 지 선택할 수 있다.- 기본적으로 이 연산자는 먼저 생성된 커밋을 따라간다.
^2
로 가면 두 번째 부모로 올라간다.git checkout HEAD~^2~2
를 하면 1칸 이동 + 두번쨰 부모로 이동 + 2번 이동으로 4칸을 올라가게 된다.- 정답코드:
git branch bugWork HEAD~1^2~1
브랜치 스파게티
git branch -f one C4
git checkout one
git rebase -i C1
git branch -f three C2
git checkout two
git branch -f two main
git rebase -i C1
Clone 소개
git clone
명령어로 원격에서 로컬로 복사해올 수 있다.- 정답코드:
git clone
Git 원격 브랜치
- Git clone의 결과물로는 로컬 저장소에 원격브랜치가 생긴다.
- origin/master에서 origin은 원격저장소 이름, master는 그 브랜치의 이름이다.
git checkout origin/main
으로 원격브랜치를 checkout하더라도, 그 상태에서 커밋으로 함께 움직일 수 없다. 커밋하면 분리된 HEAD만 움직인다. origin/main은 원격 저장소가 갱신될때만 갱신된다.- 정답코드:
git commit
git checkout o/main
git commit
Git Fetch
- Git Fetch는 원격 저장소에는 있지만 로컬에는 없는 커밋들을 다운로드 받고, 로컬저장소의 원격 브랜치를 업데이트한다. 즉,
로컬의 원격브랜치를 실제 원격 저장소의 상태와 동기화한다
- git fetch는 인터넷을 통해 접근한다.
로컬 저장소의 상태는 바뀌지 않는다! 다운로드로만 생각하자
- 원격 저장소에 브랜치가 여러 개 있으면 로컬에있는 원격 브랜치가 전부 업데이트된다.
- 정답코드:
git fetch
'Study Log' 카테고리의 다른 글
JS DeepDive 정리 1장 - 20장 (0) | 2022.08.11 |
---|---|
리액트 쿼리 공식문서 번역 및 요약 (0) | 2022.07.20 |
Redux Toolkit 알아보기 (0) | 2022.02.10 |
Redux 공부하기 (0) | 2022.01.01 |
브라우저 공부 (0) | 2021.11.20 |
댓글
이 글 공유하기
다른 글
-
JS DeepDive 정리 1장 - 20장
JS DeepDive 정리 1장 - 20장
2022.08.11 -
리액트 쿼리 공식문서 번역 및 요약
리액트 쿼리 공식문서 번역 및 요약
2022.07.20 -
Redux Toolkit 알아보기
Redux Toolkit 알아보기
2022.02.10 -
Redux 공부하기
Redux 공부하기
2022.01.01