Tool/Git

왜? Git (3) - Branch

Geisha 2024. 10. 5. 22:34

Branch

 

 

 

Git의 브랜치는 여러 기능이나 변경 사항을 메인 코드베이스에

영향을 주지 않고 동시에 작업할 수 있는 별도의 개발 라인

을 의미한다.

브랜치를 사용하면 다양한 작업에 대한

격리된 환경을 만들고, 다른 사람과 협업을 쉽게 할 수 있게하며,

복잡한 Work flow 를 관리할 수 있다.

 

 

 

위의 그림을 보면 git branch가 있어 2번째 릴리즈에서 Feature 1 기능이
3번째 릴리즈에서 Feature 2 기능이 포함될 수 있다.

가만보면 1번째에서 2개의 브랜치로 나뉘어 작업되는 것을 볼 수 있다.

 

git branch 명령어

 

 

1. 브랜치 목록 조회

git branch 명령어는 현재 존재하는 브랜치 목록을 보여준다. 현재 체크아웃된 브랜치는 *로 표시되며, 여러 워크트리에 체크아웃된 브랜치는 +로 표시된다.

  • -r: 원격 브랜치 목록을 보여준다.
  • -a: 로컬과 원격 브랜치를 모두 보여준다.
  • --contains <commit>: 특정 커밋을 포함하는 브랜치만 보여준다.
  • --no-contains <commit>: 특정 커밋을 포함하지 않는 브랜치만 보여준다.

2. 브랜치 생성

git branch <branchname>로 새로운 브랜치를 생성한다. 기본적으로 현재 HEAD를 기준으로 브랜치가 만들어지며, 다른 기준점이 필요하면 <start-point>를 지정할 수 있다.

  • 브랜치 생성 후 자동으로 전환되지 않으므로 git switch <branchname>을 사용해 새 브랜치로 전환해야 한다.
  • <start-point> 없이 두 개의 커밋 사이에 새로운 브랜치를 만들 때는 A...B를 사용할 수 있다. 이 경우 두 커밋의 공통 조상이 기준이 된다.

3. 브랜치 이름 변경 및 복사

  • -m <oldbranch> <newbranch>: 브랜치 이름을 변경한다.
  • -M <oldbranch> <newbranch>: 같은 이름의 브랜치가 이미 있을 경우 강제로 덮어쓴다.
  • -c <oldbranch> <newbranch>: 브랜치를 복사한다.
  • -C <oldbranch> <newbranch>: 이미 있는 브랜치 이름으로 강제로 복사한다.

4. 브랜치 삭제

git branch -d <branchname>로 브랜치를 삭제할 수 있다. 이 명령어는 해당 브랜치가 병합된 경우에만 동작한다. 병합되지 않은 브랜치를 삭제하려면 -D 옵션을 사용해 강제로 삭제할 수 있다.

5. 원격 브랜치 및 추적 설정

  • --track: 새로운 브랜치를 원격 브랜치에서 시작할 때 사용한다. 이 옵션을 사용하면 원격 브랜치를 추적하도록 설정된다. git pull을 할 때 자동으로 원격 브랜치와 동기화한다.
  • --no-track: 원격 브랜치 추적을 하지 않도록 설정한다.

6. 기타 옵션

  • --show-current: 현재 체크아웃된 브랜치 이름을 출력한다.
  • --sort=<key>: 브랜치 목록을 정렬할 때 사용한다.
  • -v, --verbose: 브랜치와 관련된 커밋 정보 및 원격 추적 상태를 함께 출력한다.
  • -f, --force: 강제로 브랜치를 생성하거나 덮어쓴다.

 

 

 

git checkout

 

git checkout은 Git에서 특정 브랜치나 커밋으로

워킹 트리를 업데이트하거나 전환할 때 사용하는 명령어다.

이때 git checkout과 관련된 중요한 개념들이 있는데, 하나씩 설명하겠다.

 

 
 

1. 워킹 트리(Working Tree)

  • 워킹 트리란 실제 작업 중인 파일들이 있는 현재 상태를 의미한다고 한다. 컴퓨터에서 파일들을 수정하거나 추가하는 모든 작업이 워킹 트리에서 이루어진다.
  • Git에서는 세 가지 주요 공간이 있다고 한다:
    1. 워킹 트리(Working Directory): 사용자가 보고 수정하는 실제 파일들이 있는 곳이다.
    2. 인덱스(Index): 변경된 파일들을 커밋하기 전에 저장하는 공간이라고 한다. 흔히 "스테이징 영역"이라고도 부른다.
    3. HEAD: 현재 작업 중인 브랜치나 커밋을 가리키는 포인터라고 한다.

2. HEAD

  • HEAD는 현재 어떤 브랜치에서 작업 중인지 또는 특정 커밋을 가리키는 포인터라고 한다.
  • 예를 들어, **git checkout main**을 실행하면, HEAD가 main 브랜치를 가리키게 된다고 한다. 이는 사용자가 main 브랜치에서 작업하게 된다는 뜻이다.
  • 만약 git checkout <commit>처럼 특정 커밋을 체크아웃하면, HEAD가 브랜치가 아닌 특정 커밋을 가리키게 된다. 이 상태를 Detached HEAD라고 한다.

3. 인덱스(Index)

  • 인덱스는 Git에서 스테이징 영역이라고 불린다고 한다. git add 명령을 사용하면, 변경된 파일들이 인덱스에 추가된다고 한다. 이는 곧 커밋할 준비가 된 파일들을 의미한다.
  • 인덱스는 아직 커밋되지 않은 변경 사항들을 추적하는 공간이라고 한다. git commit을 실행하면 인덱스에 있는 내용이 실제로 커밋된다고 한다.

4. 지정된 트리의 버전(Specified Tree or Tree-ish)

  • **트리(Tree)**는 Git에서 특정 시점의 파일들의 상태를 나타내는 구조라고 한다. 쉽게 말해, 특정 커밋이나 브랜치의 파일 상태를 의미한다고 한다. git checkout <commit>이나 git checkout <branch> 명령어는 해당 트리 상태로 워킹 트리의 파일을 업데이트한다고 한다.

5. Pathspec

  • Pathspec이란 Git 명령어에서 특정 파일이나 디렉토리를 지정할 때 사용하는 경로라고 한다.
  • 예를 들어, git checkout main -- file.txt에서 **file.txt**가 pathspec이라고 한다. 이는 특정 파일만을 체크아웃하려는 경로를 나타낸다고 한다.

 

 

 

git checkout 기본 사용법

1. 브랜치 전환:

  • git checkout <branch>: 이 명령어로 브랜치를 전환하고 워킹 트리(작업 중인 파일들)를 그 브랜치의 상태로 갱신한다. 로컬에서 수정한 파일들은 그대로 유지된다.
    • 만약 <branch>라는 브랜치가 없지만 원격 브랜치에 같은 이름의 브랜치가 있다면, 자동으로 그 브랜치를 생성하고 전환한다.

2. 브랜치 생성 및 전환:

  • git checkout -b <new-branch>: 새로운 브랜치를 만들고 바로 그 브랜치로 전환한다.
    • -B 옵션을 사용하면, 브랜치가 이미 존재할 경우 그 브랜치를 리셋하고 새로 만든다.

3. Detached HEAD:

  • git checkout --detach [<branch> | <commit>]: HEAD를 특정 커밋으로 분리해서 체크아웃한다. 이 상태에서는 브랜치가 아닌 특정 커밋에서 작업할 수 있다.

4. 특정 파일 체크아웃:

  • git checkout <tree-ish> -- <pathspec>: 특정 파일을 인덱스나 커밋에서 현재 워킹 트리로 가져온다.

5. 충돌 해결:

  • git checkout --ours / --theirs: 충돌이 났을 때 "ours" 버전이나 "theirs" 버전을 선택해 체크아웃한다.
  • -m: 로컬 변경 사항을 유지한 채로 브랜치를 전환하고, 충돌이 나면 머지한다.

6. Patch 모드:

  • git checkout -p [<tree-ish>]: 상호작용 모드로 디프를 확인하고 필요한 부분만 선택해서 체크아웃한다.

주요 옵션

  • -q, --quiet: 피드백 메시지를 숨긴다.
  • -f, --force: 인덱스나 워킹 트리가 HEAD와 달라도 강제로 전환한다.
  • -b, --orphan: 고립된 새로운 브랜치를 생성한다.
  • -m, --merge: 충돌이 나도 머지하고 브랜치를 전환한다.
  • --conflict=<style>: 충돌 스타일을 설정한다. 기본값은 "merge"다.
  • --patch, -p: 상호작용 모드로 선택해서 변경 사항을 체크아웃한다.

예시

1. 브랜치 전환 및 파일 복구:

git checkout master 
# 브랜치 전환
 git checkout master~2 Makefile 
# 2 커밋 전의 Makefile을 복구
 git checkout hello.c 
# 삭제된 hello.c 파일 복구
 

2. 브랜치 전환 중 머지 충돌 해결:

git checkout -m mytopic 
# 충돌 발생 시 머지하고 브랜치 전환
 edit frotz 
# 충돌 해결 후 파일 수정
 git add frotz 
# 수정된 파일 스테이징
 

3. Detached HEAD 상태에서 커밋 작업:

git checkout v2.0 
# 커밋 v2.0으로 체크아웃 (Detached HEAD 상태)
 

설정

  • checkout.defaultRemote: 원격 브랜치를 기본으로 설정할 원격 이름을 지정한다.
  • checkout.guess: 추측 옵션의 기본값을 설정한다.
  • checkout.workers: 파일 업데이트 시 병렬 작업을 수행할 워커 수를 설정한다.