이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

git branch 공부하기

  • 2022.02.26 11:15
  • Study Log

들어가며

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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 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
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 리액트
  • ㅣ
  • 공식문서읽기

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바