git learn branch 정리 1

2023-12-25


개요

Git이 작동하는 방식을 알아보자

https://learngitbranching.js.org/?locale=ko

얘를 하면서 나온 내용 정리해보기

커밋 단위

  • 커밋은 DAG에서 노드라고 생각하면 편함
  • git commit을 할 때 마다 이전 커밋과의 diff만 저장하고 새로운 커밋이 생김
  • 트리에서 보면 새 노드가 생기고 부모로 이전 커밋을 가리키게 됨

브랜칭

  • 브랜치는 특정 커밋의 참조일 뿐
  • checkout 명령어는 수행하는 일이 너무 많아서 switch와 restore로 나뉘었음
  • switch : 브랜치 혹은 커밋으로 이동만 담당, HEAD를 옮기는 작업임
  • restore : 커밋되지 않은 작업사항을 되돌림

merge

  • merge는 서로 다른 두 개의 브랜치를 합치는 명령어
  • merge 명령어는 두 개의 부모를 가리키는 특별한 커밋을 만들어냄(이 커밋을 머지 커밋이라고 함)

rebase

  • merge 말고 두 브랜치끼리 작업을 접목하는 방법
  • rebase를 하면 원래 있던 커밋은 다른 곳에 가고 rebase 대상 커밋이 부모가 되는 커밋을 만듦
  • 커밋들을 모아서 복사한 뒤 다른 곳에 떨궈 놓는 것임
  • 커밋들의 흐름을 보기 좋게 한 줄로 만들기 위해 사용
  • -i 옵션 사용 시 cherry-pick과 유사하지만 UI로 복사할 커밋과 순서 선택가

HEAD

  • HEAD는 현재 체크아웃된 커밋(현재 작업중인 커밋)을 가리키는 포인터
  • 일반적으로 브랜치의 이름을 가리킴
  • switch 명령어로 HEAD를 브랜치가 아닌 커밋을 가리키게 할 수도 있음

상대 참조

  • 각 커밋들은 해시값을 가지고 있음
  • 하지만 해시값은 매우 길어서 일일이 git log로 확인하기 불편함
  • 특정 지점(브랜치 혹은 HEAD)에서 상대 위치로 움직일 수 있는 방법이 있음
  • {특정 지점}^{num}: 커밋 트리의 부모로 이동, 부모가 여러 개일 때는 num이 있으면 num번째 부모로 이
  • {특정 지점}~{num}: num번째 위에 있는 부모로 이동

변경사항 되돌리기

  • reset랑 revert가 있음
  • reset는 브랜치가 예전 커밋을 가리키게 하는것
  • 애초에 커밋하지 않은 것 처럼 보이게됨
  • revert는 현재 커밋을 되돌리는 것 처럼 동작하는 새 커밋을 만듦
  • 로컬에서는 reset을 사용할 수 있지만 다른 사람과 협업하려면 revert을 사용해야함(history를 날려버리지 않기 하기 위해)

cherry-pick

git cherry-pick <commit1> <commit2> <…>

  • HEAD 아래에 있는 일련의 커밋에 대한 복사본을 만들겠다는 것
  • 인자로 주어진 커밋을 복사해 자식으로 만듦

tag

  • 브랜치는 커밋의 참조이지만 임시적인 것임
  • const 참조가 필요할 때(릴리즈 버전, 큰 merge) 등 사용하는 것이 tag
  • describe <ref> 명령어로 가장 가까운 부모 태그를 알아낼 수 있음