Skip to content

Latest commit

 

History

History
1160 lines (920 loc) · 71.8 KB

C-git-commands.asc

File metadata and controls

1160 lines (920 loc) · 71.8 KB

Appendix A: Git 명령어

이 책에서 Git 명령어를 많이 설명하지만, Git을 설명하기 위해서 중간마다 설명하는 것뿐이다. 설명을 방해할 수 있기 때문에 명령어 중심으로 살펴보지 않는다. 이 장에서는 여기저기 흩어져 있는 명령어 사용법을 한눈에 볼 수 있도록 정리한다.

책 전체에서 언급했던 Git 명령어를 전부 살펴보는데 명령어를 용도에 따라 그룹으로 묶어 놓았다. 해당 명령어를 어디에 쓰는지 설명하고 어디에서 찾아볼 수 있는지도 표기한다.

설치와 설정

정말 많이 사용하는 명령어가 두 개 있다. 바로 confighelp 명령이다. 이 명령은 매일 사용한다.

git config

Git에는 설정할 수 있는 값이 수백 가지에 달한다. 사용자의 취향에 따라 다르게 동작하도록 설정할 수 있다. 이 명령으로 사용자이름이나 터미널 색깔, 편집기 등을 설정한다. 저장소마다 다르게 혹은 글로벌하게 설정할 수 있는데 각각 설정파일이 다르다.

git config 명령은 이 책의 모든 장에서 사용한다.

Git을 처음 사용할 때 이름, 이메일 주소, 편집기는 어떻게 설정하는지는 ch01-getting-started.asc에서 설명한다.

어떻게 단축 명령어를 만드는지는 ch02-git-basics-chapter.asc에 있다. 매번 긴 옵션을 줄줄 입력하지 않아도 된다.

git pull 명령을 실행할 때 --rebase 옵션으로 동작하게 하는 방법은 ch03-git-branching.asc에 있다.

HTTP 암호를 저장하는 방법은 ch07-git-tools.asc를 보면 된다.

Git에 데이터를 넣고 꺼낼 때 사용하는 Smudge와 Clean 필터를 설정하는 방법은 ch08-customizing-git.asc에 있다.

마지막으로 git config 명령 자체에 대한 설명은 ch08-customizing-git.asc에 있다.

git help

git help 명령은 Git에 포함된 문서를 보여준다. 이 장에서는 많이 사용하는 것만 간단히 설명한다. git help <command> 라고 실행하면 해당 명령어에 어떤 옵션이 있고 어떻게 사용하는지 알려준다.

git help 명령은 ch01-getting-started.asc에 소개한다. git shell 을 서버에 설정하는 방법은 ch04-git-on-the-server.asc에서 보여준다.

프로젝트 가져오기와 생성하기

Git 저장소는 두 가지 방법으로 만든다. 네트워크 어딘가에 있는 저장소를 복사해오거나 기존 프로젝트 디렉토리에서 저장소를 새로 생성할 수 있다.

git init

프로젝트 디렉토리로 가서 git init 이라고 실행한다. 디렉토리에 Git 저장소가 새로 만들어지고 프로젝트를 버전 관리할 수 있다.

ch02-git-basics-chapter.asc에서 로컬에 저장소를 만드는 방법을 설명한다.

“master” 에서 다른 브랜치로 변경하는 방법은 ch03-git-branching.asc에 소개한다.

ch04-git-on-the-server.asc를 보면 Bare 저장소를 만드는 방법이 나와 있다.

마지막으로 git init 명령을 실행하면 내부에서 어떤 일이 일어나는 지 ch10-git-internals.asc에서 설명한다.

git clone

git clone 은 사실 다른 명령어를 몇 개 실행한다. 디렉토리를 만들고 디렉토리로 들어가고 나서 git init 명령으로 빈 Git 저장소를 만든다. 그다음 입력한 URL을 origin 이라는(기본값) 이름의 리모트로 추가하고(git remote add) git fetch 명령으로 리모트 저장소에서 데이터를 가져온다. 마지막으로 최종 커밋을 워킹 디렉토리에 Checkout 한다(git checkout).

git clone 명령은 이 책 어디에서나 볼 수 있는 명령이지만 가장 설명이 잘된 몇 곳을 소개한다.

이 명령은 ch02-git-basics-chapter.asc에서 설명했고 바로 따라 할 수 있는 예제도 보여준다.

--bare 옵션을 주고 워킹 디렉토리 없는 Git 저장소를 복사하는 방법을 ch04-git-on-the-server.asc에서 다룬다.

Bundle 파일로 된 Git 저장소를 다시 풀 수도 있는데 ch07-git-tools.asc에서 소개한다.

마지막으로 --recursive 옵션으로 Clone 할 때 서브모듈까지 Clone 하는 방법은 ch07-git-tools.asc에서 설명한다.

이 명령은 여기에 정리한 부분 이외에서도 많은 곳에서 사용했지만, 차근차근 잘 설명한 곳으로 정리했다.

스냅샷 다루기

Stage 하고 커밋하는 정도의 아주 기본적인 워크플로는 명령어 몇 개만 알면 된다.

git add

git add 명령은 워킹 디렉토리에서 Staging Area(“index”)로 컨텐트를 추가하는 명령어다. git commit 명령은 오로지 Staging Area만 바라보기 때문에 git add 명령으로 커밋할 스냅샷을 잘 다듬어야 한다.

이 명령은 매우 중요한 명령어라서 이 책에서 수십 번도 더 언급한다. 여기서 어떻게 사용하는지 잘 설명한 곳을 찾아보자.

git addch02-git-basics-chapter.asc에서 자세히 설명한다.

이 명령는 충돌 시에도 필요하다. ch03-git-branching.asc에서 어떻게 사용하는지 설명한다.

ch07-git-tools.asc에서 수정한 파일 일부분을 대화형으로 Stage 하는 방법을 보여준다.

마지막으로 이 명령이 내부적으로 어떻게 동작하는지 이해할 수 있도록 ch10-git-internals.asc에서 저수준 명령어로 따라 하는 예를 보여준다.

git status

git status 명령은 워킹 디렉토리와 Staging Aread의 상태를 보여준다. Modified 상태이거나 Unstaged 상태인 파일이 무엇인지 Staged 상태이지만 아직 커밋하지 않은 파일은 무엇인지 보여준다. Staging Area에 파일을 넣고 꺼내는 방법에 대한 힌트도 보여준다.

git status 명령은 ch02-git-basics-chapter.asc에서 간결하게 설명한다. 이 명령은 이 책에서 아주 많이 사용했지만 여기 설명을 벗어나지 않는다.

git diff

git diff 명령은 두 트리 개체의 차이를 보고 싶을 때 사용한다. 워킹 디렉토리와 Staging Area를 비교할 수 있고(git diff) Staing Area와 마지막 커밋을 비교할 수 있다(git diff --staged). 그리고 두 커밋을 비교할 수 있다(git diff master branchB).

git diffch02-git-basics-chapter.asc에서 처음 설명한다. Staged 상태인 내용이 무엇이고 반대 상태인 내용은 무엇인지 비교하는 법을 설명한다.

ch05-distributed-git.asc에서 --check 옵션으로 공백문자가 잘못 입력되지 않았는지 확인하는 방법을 소개한다.

ch05-distributed-git.asc에서 두 브랜치를 효율적으로 비교할 수 있는 git diff A…​B 문법을 설명한다.

ch07-git-tools.asc을 보면 -b 옵션으로 공백문자는 무시하고 비교하는 것과 --theirs, --ours, --base 옵션으로 충돌 난 파일의 상태를 비교하는 방법이 나와 있다.

마지막으로 ch07-git-tools.asc에서 서브모듈의 변경 내용을 비교하는 --submodule 옵션도 설명한다.

git difftool

git difftool 명령은 단순히 외부 diff 도구를 실행해준다. git diff 는 Git에 들어 있는 기능을 사용하는 것이고 외부 diff 도구로 두 트리를 비교하고 싶을 때 사용한다.

이 명령은 ch02-git-basics-chapter.asc에서 설명한다.

git commit

git commit 명령은 git add 로 Staging Area에 넣은 모든 파일을 커밋한다. 데이터베이스에는 하나의 스냅샷으로 기록된다. 그리고 현 브랜치가 새 커밋을 가리키게 한다.

커밋에 대한 기본적인 내용은 ch02-git-basics-chapter.asc에서 다룬다. -a 플래그를 주고 git add 를 건너뛰고 바로 커밋하는 것과 -m 으로 커밋 메시지를 파라미터로 넘기는 방법도 보여준다.

가장 최근 커밋을 수정하는 --amend 옵션은 ch02-git-basics-chapter.asc에서 설명한다.

ch03-git-branching.asc을 보면 git commit 이 무엇을 하는지 왜 그렇게 하는지 설명한다.

-S 플래그로 커밋에 서명하는 방법은 ch07-git-tools.asc에서 설명한다.

마지막으로 ch10-git-internals.asc에서 git commit 명령이 내부적으로 하는 일이 무엇이고 실제로 어떻게 구현돼 있는지 설명한다.

git reset

git reset 명령은 되돌리는(Undo) 명령이다. 단어가 의미하는 그대로라고 생각하면 된다. HEAD 포인터를 옮기는 것과 관련돼 있고 Staging Area(index)를 되돌릴 수 있고 --hard 옵션을 주면 워킹 디렉토리도 되돌린다. --hard 옵션을 잘못 사용하면 작업물을 잃어버릴 수도 있기 때문에 이 명령을 잘 이해하고 있어야 한다.

git reset 은 무엇보다도 git add 로 추가한 파일을 Unstage 하는데 사용한다. ch02-git-basics-chapter.asc에서 설명한다.

ch07-git-tools.asc에서 이 명령을 전체적으로 자세히 설명한다.

git reset --hard 명령으로 충돌 시 Merge를 취소할 수 있다. git merge --abort 로도 같은 일을 할 수 있는데 이 명령은 git reset 명령어의 Wrapper다. 이 내용은 ch07-git-tools.asc에서 설명한다.

git rm

git rm 명령은 Staging Area나 워킹 디렉토리에 있는 파일을 삭제하는 데 사용한다. git add 명령과 비슷하게 파일의 삭제를 Stage 하는 기능이다.

ch02-git-basics-chapter.asc에서 git rm 명령을 자세히 설명한다. Staging Area와 워킹 디렉토리 모두에서 파일을 삭제하는 방법과 --cached 옵션을 주고 Staging Area에 있는 파일만 지우고 워킹 디렉토리의 파일은 남겨두는 방법도 설명한다.

대부분은 ch10-git-internals.asc에서 설명한 대로 쓰지만, 이 책에서는 다르게 사용한 예도 있다. git filter-branch 명령을 실행할 때 git rm 명령에 --ignore-unmatch 옵션을 주고 사용한다. 이 옵션은 삭제하려는 파일이 없을 때 에러가 나지 않게 해준다. 스크립트를 작성할 때는 유용하다.

git mv

git mv 명령은 파일을 옮기고(이름을 변경하고) 나서 새 파일에 git add 명령을 실행하고 이전 파일에는 git rm 을 실행시켜주는 명령이다.

이 명령은 ch02-git-basics-chapter.asc에서 다룬다.

git clean

git clean 명령은 워킹 디렉토리에서 필요없는 파일을 삭제하는 명령이다. 이 명령으로 충돌로 생긴 파일이나 빌드 아티팩트 파일을 삭제할 때 편리하다.

이 명령을 사용하는 상황과 필요한 옵션은 ch07-git-tools.asc에서 다룬다.

Branch와 Merge

여기서 소개하는 명령어만 알면 Branch를 사용하고 Merge 하는 일은 능히 할 수 있다.

git branch

git branch 명령은 브랜치를 관리하는 도구다. 이 명령은 브랜치를 모두 보여주고 브랜치를 새로 만들고 브랜치를 삭제하고 브랜치 이름을 변경한다.

ch03-git-branching.asc에서 branch 명령을 설명하는데 이 명령을 한 장에 걸쳐서 설명한다. 브랜치를 만드는 것은 ch03-git-branching.asc에서 설명하고 브랜치를 보여주거나 삭제하는 기능은 ch03-git-branching.asc에서 설명한다.

git branch -u 명령으로 트래킹 브랜치를 만드는 것을 ch03-git-branching.asc에서 보여준다.

내부적으로 어떤 일이 벌어지는지는 ch10-git-internals.asc에서 설명한다.

git checkout

git checkout 명령은 브랜치를 변경하고 해당 파일을 워킹 디렉토리로 복사한다.

ch03-git-branching.asc에서 git branch 명령을 설명하면서 이 명령도 설명한다.

ch03-git-branching.asc에서 --track 옵션을 주고 트래킹 브랜치를 만드는 방법을 설명한다.

ch07-git-tools.asc를 통해 이 명령에 --conflict=diff3 을 주면 충돌 표시된 파일을 재현할 수 있다.

git reset 명령과 관련된 내용은 ch07-git-tools.asc에서 설명한다.

마지막으로 git checkout 이 어떻게 구현됐는지는 ch10-git-internals.asc를 참고한다.

git merge

git merge 는 다른 브랜치를 현재 Checkout된 브랜치에 Merge 하는 명령이다. Merge 하고 나서 현재 브랜치가 Merge 된 결과를 가리키도록 옮긴다.

git merge 명령은 ch03-git-branching.asc에서 설명한다. 이 책의 여러 곳에서 merge 명령을 사용하지만 ch03-git-branching.asc에서 설명한 것에서 크게 벗어나지 않는다. git merge <branch> 명령을 실행하면 해당 브랜치가 Merge 된다.

ch05-distributed-git.asc의 끝 부분에서 Squash 해서 Merge 하는 방법도 설명한다. Merge 하는 브랜치의 히스토리는 무시하고 새 커밋을 하나 만들어 Merge 하는 방법이다.

ch07-git-tools.asc에서는 -Xignore-space-change 옵션을 사용하는 방법이나 --abort 플래그로 Merge를 중단하는 방법 등을 설명한다.

Merge 하기 전에 서명을 검사하는 방법도 설명한다. GPG 서명은 ch07-git-tools.asc에서 설명한다.

마지막으로 Subtree를 Merge 하는 것은 ch07-git-tools.asc에서 배운다.

git mergetool

git mergetool 명령은 외부 Merge Helper를 실행해 준다. Merge 하다가 문제가 생겼을 때 사용한다.

ch03-git-branching.asc에서 살짝 맛을 보여주고 ch08-customizing-git.asc에서 자신의 외부 Merge 도구를 설정하는 방법을 설명한다.

git log

git log 명령은 프로젝트 히스토리를 시간의 역순으로 보여준다. 넘겨준 Ref를 따라 히스토리를 보여주는데 Ref를 한 개가 아니라 여러 개 넘길 수도 있다. Ref를 넘겨 주지 않으면 HEAD가 가리키는 브랜치의 히스토리를 보여준다. 또 이 명령으로 여러 브랜치들 사이의 차이를 커밋 단위로 볼 수 있다.

이 책에서 프로젝트 히스트리를 보여줄 때마다 이 명령을 사용한다고 봐도 된다.

ch02-git-basics-chapter.asc에서 이 명령을 깊게 다뤘다. -p--stat 옵션을 주면 각 커밋 사이에 생긴 변화를 확인할 수 있다. --pretty--oneline 옵션을 주면 히스토리를 좀 더 깔끔하게 볼 수 있다. 이 옵션은 Author나 날짜를 중심으로 히스토리를 보여준다.

ch03-git-branching.asc을 보면 --decorate 옵션을 주고 히스토리에 브랜치 포인터가 함께 보이도록 하는 방법이 나온다. --graph 옵션을 추가하면 히스토리가 어떻게 진행됐는지도 볼 수 있다.

ch05-distributed-git.ascch07-git-tools.asc에서 branchA..branchB 문법을 사용하는 방법을 설명한다. branchB 에만 있고 branchA 에는 없는 커밋만 걸러서 볼 수 있다. ch07-git-tools.asc에서 이 문법을 다양하게 조합하는 방법을 설명한다.

In ch07-git-tools.ascch07-git-tools.asc에서 branchA…​branchB 포맷을 사용하는 방법을 설명한다. 이 문법은 둘 중 한쪽에 속한 커밋만 보여준다. --left-right 옵션을 주면 각각 어느 쪽에 속한 것인지도 보여준다. ch07-git-tools.asc에서는 충돌을 해결할 때 유용한 --merge 옵션도 설명한다. --cc 옵션을 사용하면 충돌을 히스토리에 보여준다.

-g 옵션을 사용하면 브랜치를 오간 기록인 Reflog도 함께 보여준다. 이것은 ch07-git-tools.asc에서 설명한다.

ch07-git-tools.asc에서는 -S-L 옵션을 소개한다. 이 옵션을 사용하면 특정 코드에 대한 히스토리만 찾아볼 수 있다. 특정 함수의 히스토리를 보고 싶을 때 사용하면 유용하다.

ch07-git-tools.asc에서 --show-signature 옵션을 사용하는 방법을 설명한다. git log 명령에 이 옵션을 사용하면 커밋의 서명 정보까지도 보여준다.

git stash

git stash 명령은 아직 커밋하지 않은 일을 저장하는 데 사용된다. 작업 중인 워킹 디렉토리를 저장한다.

ch07-git-tools.asc에서 설명한다.

git tag

git tag 명령은 히스토리에서 특정부분을 북마크하는 기능이다. 일반적으로 배포할 때 사용한다.

이 명령은 ch02-git-basics-chapter.asc에서 자세히 설명하고 ch05-distributed-git.asc에 보면 구체적인 사례도 보여준다.

태그에 GPG 서명을 하려면 -s 플래그를 주면 되고 -v 플래그를 주면 서명을 검증할 수 있다. ch07-git-tools.asc에서 다룬다.

공유하고 업데이트하기

Git에는 네트워크가 필요한 명령어가 많지 않다. 거의 로컬 데이터베이스만으로 동작한다. 코드를 공유하거나 가져올 때 필요한 명령어가 몇 개 있다. 이런 명령어는 모두 리모트 저장소를 다루는 명령어다.

git fetch

git fetch 명령은 로컬 데이터베이스에 있는 것을 뺀 리모트 저장소의 모든 것을 가져온다.

ch02-git-basics-chapter.asc에서 이 명령을 설명하고 ch03-git-branching.asc에 보면 참고할 수 있는 예제가 더 있다.

ch05-distributed-git.asc에도 좋은 예제가 많다.

Ref를 한 개만 가져오는 방법은 ch06-github.asc에서 설명하고 번들에서 가져오는 방법은 ch07-git-tools.asc에서 설명한다.

Fetch 하는 기본 Refspec을 수정하는 방법은in ch10-git-internals.asc에서 설명한다. 원하는 대로 수정할 수 있다.

git pull

git pull 명령은 git fetchgit merge 명령을 순서대로 실행하는 것뿐이다. 그래서 해당 리모트에서 Fetch 하고 즉시 현 브랜치로 Merge를 시도한다.

ch02-git-basics-chapter.asc에서 이 명령을 사용하는 방법을 다뤘고 정확히 무엇을 Merge 하는 지는 ch02-git-basics-chapter.asc에서 설명한다.

ch03-git-branching.asc에서 그 어렵다는 Rebase를 다루는 방법을 설명한다.

저장소 URL을 주고 한 번만 Pull 해 올 수 있다는 것을 ch05-distributed-git.asc에서 설명한다.

--verify-signatures 옵션을 주면 Pull 할 때 커밋의 PGP 서명을 검증한다. PGP 서명은 ch07-git-tools.asc에서 설명한다.

git push

git push 명령은 리모트에는 없지만, 로컬에는 있는 커밋을 계산하고 나서 그 차이만큼만 Push 한다. Push를 하려면 원격 저장소에 대한 쓰기 권한이 필요하고 인증돼야 한다.

ch02-git-basics-chapter.asc에서 git push 명령으로 브랜치를 원격 저장소에 Push 하는 방법을 설명한다. 조금 깊게 브랜치를 하나씩 골라서 Push 하는 방법은 ch03-git-branching.asc에서 설명한다. 자동으로 Push 하도록 트래킹 브랜치를 설정하는 방법은 ch03-git-branching.asc에서 설명한다. git push --delete 명령으로 원격 서버의 브랜치를 삭제하는 방법은 ch03-git-branching.asc에서 설명한다.

ch05-distributed-git.asc에서는 git push 를 주구장창 사용한다. 리모트를 여러 개 사용해서 브랜치에 작업한 내용을 공유하는 것을 보여준다.

--tags 옵션을 주고 태그를 Push 하는 방법은 ch02-git-basics-chapter.asc에서 설명한다.

서브모듈의 코드를 수정했을 때는 --recurse-submodules 옵션이 좋다. 프로젝트를 Push 할 때 서브모듈에 Push 할 게 있으면 서브모듈부터 Push 하므로 매우 편리하다. 이 옵션은 ch07-git-tools.asc에서 설명한다.

ch08-customizing-git.asc에서 pre-push 훅에 대해서 설명했다. 이 훅에 Push 해도 되는지 검증하는 스크립트를 설정하면 규칙에 따르도록 Push를 검증할 수 있다.

일반적인 이름 규칙에 따라서 Push 하는 것이 아니라 Refspec을 사용해서 원하는 이름으로 Push 하는 것도 가능하다. 이것은 ch10-git-internals.asc에서 설명한다.

git remote

git remote 명령은 원격 저장소 설정인 리모트의 관리 도구다. 긴 URL 대신 “origin” 처럼 이름을 짧게 지을 수 있다. 그리고 URL대신 짧은 리모트 이름을 사용한다. git remote 명령으로 이 리모트를 여러 개 만들어 관리할 수 있다.

이 리모트를 조회하고 추가하고 삭제하고 수정하는 방법은 ch02-git-basics-chapter.asc에서 잘 설명한다.

이 명령은 git remote add <name> <url> 형식으로 사용하고 이 책에서 자주 사용된다.

git archive

git archive 명령은 프로젝트 스냅샷을 아카이브 파일로 만들어 준다.

ch05-distributed-git.asc에서 설명하는데 프로젝트를 Tarball로 만들어 공유할 때 사용한다.

git submodule

git submodule 명령은 저장소 안에서 다른 저장소를 관리하는 데 사용한다. 라이브러리나 특정 형식의 리소스 파일을 서브모듈로 사용할 수 있다. submodule 명령에 있는 add, update, sync 등의 하위 명령어로 서브모듈을 관리할 수 있다.

이 명령은 ch07-git-tools.asc에서 설명한다.

보기와 비교

git show

git show 명령은 Git 개체를 사람이 읽을 수 있도록 요약해서 보여준다. 태그나 커밋 정보를 보고 싶을 때 이 명령을 사용한다.

ch02-git-basics-chapter.asc을 보면 Annotated 태그의 정보를 보여주는 예제가 나온다.

ch07-git-tools.asc에서 이 명령을 사용하는 것을 보여준다.

Merge 하다가 충돌이 났을 때 특정 버전의 파일 내용을 git show 로 꺼내 볼 수 있다. ch07-git-tools.asc에서 이 점을 설명한다.

git shortlog

git shortlog 명령은 git log 명령의 결과를 요약해서 보여 준다고 생각하면 된다. 옵션도 git log 명령의 것과 매우 비슷하다. 이 명령은 Author 별로 커밋을 묶어서 보여준다.

이 명령은 Changelog 파일을 만들 때 유용한 데 ch05-distributed-git.asc에서 보여준다.

git describe

git describe 명령은 커밋과 관련된 정보를 잘 조합해서 사람이 읽을 수 있는 스트링을 만들어 준다. 커밋 SHA-1처럼 식별 가능하고 사람이 이해할 수 있는 정보가 필요할 때 사용한다.

ch05-distributed-git.ascch05-distributed-git.asc에서 git describe 명령을 설명한다. 이 명령으로 배포 파일의 이름을 짓는다.

Debugging

Git에는 디버깅용 명령어도 있다. 누가 버그를 만들었는지 언제 어디서 생겼는지 찾아내는 데 도움이 된다.

git bisect

git bisect 는 굉장히 유용하다. 이진 탐색 알고리즘을 사용해서 버그나 문제가 생긴 커밋을 쉽게 찾을 수 있다.

이 명령은 ch07-git-tools.asc에서 잘 설명한다.

git blame

git blame 은 파일의 각 라인을 누가 마지막으로 수정했는지 보여준다. 그래서 특정 코드에 대해 궁금한 게 있을 때 누구에게 물어야 할지 바로 알 수 있다.

이 명령은 ch07-git-tools.asc에서 다룬다.

git grep

소스 코드에서 스트링이나 정규표현식을 찾을 수 있다. git grep 명령을 사용하면 예전 소스 코드까지 찾는다.

ch07-git-tools.asc에서 이 명령을 설명한다.

Patch 하기

커밋 묶음을 Patch 묶음처럼 다루는 것이 편할 때가 있다. 이럴 때를 위해서 Git에는 커밋 몇 개만 추출하고 적용하고 관리하는 명령어가 있다. 이 명령어는 브랜치를 관리할 때 좋다.

git cherry-pick

git cherry-pick 명령은 커밋 하나만 가져올 때 사용한다. 현 브랜치의 새 커밋으로 적용된다. 이 명령은 브랜치를 통째로 Merge 하기 보다 커밋 한두 개 정도만 Merge 하고 싶을 때 좋다.

이 명령으로 커밋을 고르는 것은 ch05-distributed-git.asc에서 설명한다.

git rebase

git rebase 명령은 check-pick 을 여러 번 실행해 주는 것과 같다. 연결된 커밋을 그 순서대로 한방에 Cherry-pick 해온다.

Rebase는 ch03-git-branching.asc에서 설명한다. 이미 공개한 브랜치를 Rebase 할 때 생기는 문제도 다룬다.

ch07-git-tools.asc에서는 히스토리를 두 저장소로 분리하는 것을 보여주는데 여기서 --onto 옵션을 사용한다.

ch07-git-tools.asc에서 Rebase 하면서 발생한 충돌을 어떻게 해결하는지 보여준다.

-i 옵션을 주고 이 명령을 실행하면 대화형으로 실행할 수 있다. ch07-git-tools.asc에서 설명한다.

git revert

git revert 명령은 git cherry-pick 명령의 반대로 볼 수 있다. 해당 커밋을 되돌리는 커밋을 새로 생성한다.

ch07-git-tools.asc에서 Merge 커밋을 되돌리는 것을 보여준다.

Email

메일링 리스트로 관리하는 프로젝트가 많이 있다. Git 프로젝트 자체도 그렇다. Git에는 이메일로 작업하기 쉽게 만들어 주는 도구가 들어 있다. Patch를 생성해서 이메일을 보내고 메일 박스에서 Patch를 적용하는 과정을 도와준다.

git apply

git apply 명령은 git diff 명령으로 생성한 Patch를 적용하는 명령이다. GNU diff 명령으로 생성한 Patch도 가능하다. 약간의 차이는 있지만 patch 명령어랑 비슷하다.

이 명령을 사용하는 상황과 어떻게 사용하는지 ch05-distributed-git.asc에서 설명한다.

git am

git am 명령으로 이메일 인박스에 든 mbox 포맷의 Patch를 적용할 수 있다. 이메일로 패치를 주고받을 때 유용하다.

git am 을 언제 어떻게 사용하는지는 ch05-distributed-git.asc에서 다룬다. --resolved, -i, -3 옵션 사용법을 설명한다.

git am 명령을 사용할 때 설정할 수 있는 훅은 ch08-customizing-git.asc에서 다룬다.

이 명령으로 GitHub Pull Request의 Patch도 적용할 수 있는데 ch06-github.asc에서 설명한다.

git format-patch

git format-patch 명령은 Patch를 mbox 포맷으로 생성하는 데 사용한다. 생성 한 패치를 쉽게 메일링 리스트로 보낼 수 있다.

git format-patch 로 프로젝트에 기여하는 예제를 ch05-distributed-git.asc에서 보여준다.

git imap-send

git imap-send 명령은 git format-patch 로 생성한 메일을 IMAP drafts 폴더에 넣어준다.

git imap-send 명령으로 예제는 ch05-distributed-git.asc에서 살펴본다. 패치를 보내서 프로젝트에 기여해보는 예제다.

git send-email

git send-email 명령은 git format-patch 명령으로 생성한 Patch를 이메일로 보내는 데 사용한다.

ch05-distributed-git.asc에서 git send-email 명령으로 패치를 보내서 다른 프로젝트에 기여하는 것을 보여준다.

git request-pull

git request-pull 명령은 메일 바디를 생성해주는 명령이다. 그래서 쉽게 다른 사람에게 메일을 보낼 수 있다. 브랜치에 커밋하고 Push 해 놓은 상태를 누군가에게 알릴 때 유용하다. Patch 자체는 이메일로 보내지 않고 정보만 요약해 보낼 수 있다. 이 명령의 결과를 메일로 보내면 된다.

ch05-distributed-git.asc에서 git request-pull 명령을 사용하는 것을 보여준다.

다른 버전 관리 시스템

Git에는 다른 버전 관리 시스템을 지원하는 명령어도 있다.

git svn

git svn 명령은 Git을 Subversion의 클라이언트로 사용하는 명령이다. 그래서 Git으로 Subversion 서버에 있는 커밋을 Checkout 할 수 있다.

ch09-git-and-other-systems.asc에서 자세히 설명한다.

git fast-import

버전 관리 시스템을 가리지 않고 데이터를 Git으로 가져올 수 있는 다목적 명령어도 있다. 버전 관리 시스템뿐만 아니라 다른 형식으로 관리하던 데이터도 가져올 수 있다. git fast-import 명령은 다른 포맷의 데이터를 쉽게 매핑할 수 있게 해준다.

ch09-git-and-other-systems.asc에서 이 명령을 설명한다.

관리

관리자는 Git 저장소에 문제가 생기면 해결해야 한다. Git은 이때 필요한 명령어도 제공한다.

git gc

git gc 는 저장소에 필요없는 파일을 삭제하고 남은 파일을 압축하는 “Garbage Collection” 명령이다.

직접 실행시켜도 되지만 Git이 자동으로 실행해준다. 자세한 설명은 ch10-git-internals.asc에서 한다.

git fsck

git fsck 는 Git 데이터베이스에 문제가 없는지 검사해준다.

ch10-git-internals.asc에서 Dangling 개체를 찾는 법을 설명한다.

git reflog

git reflog 명령은 HEAD가 가리켰던 커밋의 로그를 보여준다. 히스토리를 재작성해서 잃어버린 커밋을 찾을 때 유용하다.

ch07-git-tools.asc에서 이 명령을 설명한다. git log 명령에 -g 옵션을 주면 git log 명령의 결과처럼 Reflog를 출력한다.

잃어버린 브랜치를 복구하는 법은 ch10-git-internals.asc에서도 설명한다.

git filter-branch

git filter-branch 명령은 커밋 뭉치를 수정하는 데 사용한다. 전체 히스토리에서 파일을 삭제하거나 디렉토리 구조를 변경하는 데 사용한다.

ch07-git-tools.asc에서 --commit-filter, --subdirectory-filter, --tree-filter 같은 옵션 사용법을 설명한다.

ch09-git-and-other-systems.asc, ch09-git-and-other-systems.asc에서는 다른 버전 관리 시스템에서 가져온 데이터베이스를 바로 잡는 데 사용한다.

Plumbing 명령어

이 책에서는 저수준 Plumbing 명령어도 많이 소개한다.

ch06-github.asc에서는 서버에 있는 저수준 Ref를 조회하는 ls-remote 명령을 소개한다.

ch07-git-tools.ascch07-git-tools.asc, ch07-git-tools.asc에서 사용하는 ls-files 는 Staging Area의 저수준 모습을 보여준다.

rev-parse 명령은 가리키는 개체의 SHA-1 값을 보여준다. ch07-git-tools.asc에서 다룬다.

저수준 명령인 Plumbing 명령은 거의 ch10-git-internals.asc에서 설명한다. Plumbing 명령에는 이 장에서만 설명하려고 했다. 다른 장에서는 최대한 Plumbing 명령어는 사용하지 않으려고 노력했다.