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에서는 세 가지 주요 공간이 있다고 한다:
- 워킹 트리(Working Directory): 사용자가 보고 수정하는 실제 파일들이 있는 곳이다.
- 인덱스(Index): 변경된 파일들을 커밋하기 전에 저장하는 공간이라고 한다. 흔히 "스테이징 영역"이라고도 부른다.
- 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: 파일 업데이트 시 병렬 작업을 수행할 워커 수를 설정한다.