Git 이론 (3)

김태규·2024년 6월 22일
0

Git 공식문서 학습

목록 보기
5/9
post-thumbnail

자주 사용하는 명령어

이번 챕터에서는 자주 사용하는 깃 명령어에 대해서 공부한다.

요약

  1. 설치와 설정: config, help
  2. 프로젝트 가져오기, 생성하기: init, clone
  3. 스냅샷 다루기: add, status, diff, difftool, commit, reset, rm, mv, clean
  4. 브랜치와 머지: branch, checkout, merge, mergetool, log, status, tag
  5. 공유, 업데이트하기: fetch, pull, push, remote, archive, submodule
  6. 보기와 비교: show, shortlog, describe
  7. 디버깅: bisect, blame, grep
  8. Patch 하기: cherry-pick, rebase, revert
  9. 이메일 작업: apply, am, format-patch, imap-send, send-email, request-pull
  10. 다른 VCS 지원: svn, fast-import
  11. 관리: gc, fsck, reflog, filter-branch
  12. Plumbing: ls-remote, ls-files, rev-parse

설치와 설정

config

  1. 이름, 이메일 주소, 편집기를 설정할 수 있다.
  2. 단축 명령어를 만들 수 있다.
  3. pull 명령어에 자동으로 rebase 하도록 할 수 있다.
  4. 외부 프로그램을 내장하고 있어 http 암호를 저장할 수 있다.
  5. Smudge 와 Clean 필터를 설정할 수 있다.
  6. 이외에 다양한 설정을 할 수 있다.

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

init

  1. 로컬 저장소를 만들 수 있다.
  2. master 에서 다른 브랜치로 변경할 수 있다.
  3. 서버에 Bare 저장소를 만들 수 있다.
  4. 내부로직은 Plumbing 명령, Porcelain 명령으로 이루어져 있다.

clone

  1. init, origin, remote add, fetch, checkout 등의 명령어 조합으로 이루어진다.
  2. 기존 저장소를 복제할 수 있다.
  3. --bare 옵션으로 워킹 디랙토리 없는 서버 Git 저장소를 복사할 수 있다.
  4. Bundle 파일로 된 Git 저장소를 다시 풀 수 있다.
  5. --recursive 옵션으로 Clone 할 때 서브모듈까지 Clone할 수 있다.

스냅샷 다루기

add

  1. 워킹 디렉토리에서 Staging Area 로 컨텐트를 추가한다.
  2. 새로운 파일을 추적할 때 사용할 수 있다.
  3. 충돌이 일어났을 때에도 사용된다.
  4. -i, --interactive 옵션과 함께 대화형 모드로 Stage 할 수 있다.
  5. 내부 동작 원리는 Tree와 Blob 객체를 이용한다.

status

  1. 워킹 디렉토리와 Staging Area의 상태를 보여준다. Modified, Unstaged, Staged 등의 상태가 있다.

diff

  1. 두 트리 개체의 차이를 보고싶을 때 사용한다. 단순한 변경 사실 뿐 아니라 어떤 내용이 변경됐는지도 알 수 있다.
  2. git diff 명령어로 워킹 디렉토리와 Staging Area를 비교할 수 있다.
  3. --staged 옵션으로 Staging Area와 마지막 커밋을 비교할 수 있다.
  4. git diff <branch1> <branch2> 명령어로 두 브랜치를 비교할 수있다.
  5. --check 옵션으로 공백 문자가 커밋 가이드라인에 맞는지 확인할 수 있다.
  6. -b 옵션으로 공백을 무시하고 비교할 수 있다.
  7. --theirs, --ours, --base 옵션으로 충돌난 파일의 상태를 비교할 수 있다.
  8. --submodule 옵션으로 서브모듈의 변경 내용을 비교할 수 있다.

commit

  1. Staging Area에 넣은 모든 파일을 커밋한다. 데이터베이스에는 하나의 스냅샷으로 기록된다. 또한 현 브랜치가 새 커밋을 가리키게 한다.
  2. -a 플래그로 git add를 건너뛸 수 있다.
  3. -m 으로 메세지를 파라미터로 남길 수 있다.
  4. --amend 옵션으로 가장 최근 커밋과 커밋 메세지를 수정할 수 있다.
  5. 커밋은 현 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메세지 같은 메타 데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 개체를 저장하는 것이다.
  6. 커밋은 루트 디렉토리와 각 하위 디렉토리의 트리 개체를 체크섬과 함꼐 저장소에 저장한다.
  7. -S 플래그로 커밋에 서명할 수 있다.
  8. git commit 명령어는 커밋 개체를 commit-tree 명령으로 만든다. 이는 개체에 대한 설명과 Tree 개체의 SHA-1 값을 넘긴다.

reset

  1. 명령을 되돌리는 명령이다.
  2. HEAD 포인터를 옮기는 것과 관련되어있다.
  3. Staging Area를 되돌릴 수 있다.
  4. --hard 옵션을 주면 워킹 디렉토리도 되돌릴 수 있다. 작업물을 잃어버릴 수 있으므로 주의해야 한다.
  5. 주로 add 로 추가한 파일을 Unstage 하는데 사용한다.
  6. --hard 옵션은 주로 머지 충돌 시 취소에 사용한다. 유사한 명령어로 git merge --abort 가 있다. 이는 reset 명령어의 Wrapper이다.
  7. HEAD 이동, Index 업데이트(--mixed), 워킹 디렉토리 업데이트(hard) 등의 동작을 할 수 있다.
  8. 자세히

clean

  1. 워킹 디렉토리에서 필요없는 파일을 삭제하는 명령이다.
  2. 주로 충돌로 생긴 파일이나 빌드 아티팩트 파일을 삭제할 때 이용한다.

브랜치와 머지

branch

  1. git branch 명령은 브랜치를 관리하는 도구다. 이 명령은 브랜치를 모두 보여주고 브랜치를 새로 만들고 브랜치를 삭제하고 브랜치 이름을 변경한다.
  2. git branch <branch>로 브랜치를 만들 수 있다.
  3. 브랜치 이동은 checkout 명령어로 할 수 있다.
  4. git branch 만 입력하면 브랜치의 목록을 볼 수 있다.
  5. -v 옵션과 함께 쓰면 브랜치마다 마지막 커밋 메세지도 함께 보여준다.
  6. --merged--no-merged 옵션으로 머지된 브랜치인지 아닌지 필터링 할 수 있다.
    • 기호가 붙지 않은 브랜치는 이미 다른 브랜치에 Merge 했다는 표시이며,-d 옵션으로 삭제할 수 있는 브랜치이다.
  7. 머지하지 않은 브랜치를 강제로 삭제할 경우 -D를 사용한다.
  8. -u 옵션으로 트래킹 브랜치를 만들 수 있다. 트래킹 브랜치에서 git pull 명령을 내리면 리모트 저장소로부터 데이터를 내려받아 연결된 리모트 브랜치와 자동으로 Merge 한다.
  9. 내부 로직
  10. 자세히

checkout

  1. git checkout 명령은 브랜치를 변경하고 해당 파일을 워킹 디렉토리로 복사한다.
  2. git checkout -b <branch> <remote>/<branch> 로 간단히 트래킹 브랜치를 만들 수 있다.
  3. --track 옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성할 수 있다.
  4. --conflict=diff3 옵션을 주면 충돌 표시된 파일을 재현할 수 있다. 이 명령은 파일을 다시 Checkout 받아서 충돌 표시된 부분을 교체한다.
  5. git reset과도 연관되어 있다.
  6. 내부 로직

merge

  1. git merge 는 다른 브랜치를 현재 Checkout된 브랜치에 Merge 하는 명령이다. Merge 하고 나서 현재 브랜치가 Merge 된 결과를 가리키도록 옮긴다.
  2. git merge <branch> 명령을 실행하면 해당 브랜치가 Merge 된다.
  3. --squash 옵션은 현재 브랜치에 Merge 할 때 해당 브랜치의 커밋을 모두 커밋 하나로 합쳐서 Merge 한다. 이 때 Merge 커밋은 만들지 않는다. Merge 하는 브랜치의 히스토리는 무시하고 새 커밋을 하나 만들어 Merge 하는 방법이다.
  4. Merge 할 때 무수한 공백 때문에 문제가 생기면 그냥 Merge를 취소한 다음 -Xignore-all-space-Xignore-space-change 옵션을 주어 다시 Merge 한다.
  5. git merge --abort 명령은 Merge 하기 전으로 되돌린다. 완전히 뒤로 되돌리지 못하는 유일한 경우는 Merge 전에 워킹 디렉토리에서 Stash 하지 않았거나 커밋하지 않은 파일이 존재하고 있었을 때뿐이다.
  6. 1.8.3 버전 이후의 Git에서는 git merge 와 git pull 에서 GPG 서명 정보를 이용해 Merge를 허용하지 않을 수 있다. --verify-signatures 옵션으로 이 기능을 사용할 수 있다.
  7. Subtree를 Merge 하는 방법은 따로 있다.

log

  1. git log 명령은 프로젝트 히스토리를 시간의 역순으로 보여준다.
  2. 넘겨준 Ref를 따라 히스토리를 보여준다. Ref는 여러 개 넘길 수도 있다. Ref를 넘겨 주지 않으면 HEAD가 가리키는 브랜치의 히스토리를 보여준다. 또 이 명령으로 여러 브랜치들 사이의 차이를 커밋 단위로 볼 수 있다.
  3. -p--stat 옵션을 주면 각 커밋 사이에 생긴 변화를 확인할 수 있다.
  4. --pretty--oneline 옵션을 주면 히스토리를 좀 더 깔끔하게 볼 수 있다. 이 옵션은 Author나 날짜를 중심으로 히스토리를 보여준다.
  5. --decorate 옵션을 주고 히스토리에 브랜치 포인터가 함께 보이도록 하는 방법이 있다.
  6. --graph 옵션을 추가하면 히스토리가 어떻게 진행됐는지도 볼 수 있다.
  7. branchA..branchB 문법을 이용하면 branchB 에만 있고 branchA 에는 없는 커밋만 걸러서 볼 수 있다. 이 문법은 다양하게 조합할 수 있다.
  8. branchA...branchB 문법은 둘 중 한쪽에 속한 커밋만 보여준다. --left-right 옵션을 주면 각각 어느 쪽에 속한 것인지도 보여준다.
  9. --merge 옵션은 충돌을 해결할 때 유용하다.
  10. --cc 옵션을 사용하면 충돌을 히스토리에 보여준다.
  11. -g 옵션을 사용하면 브랜치를 오간 기록인 Reflog도 함께 보여준다.
  12. -S-L 옵션을 사용하면 특정 코드에 대한 히스토리만 찾아볼 수 있다. 특정 함수의 히스토리를 보고 싶을 때 사용하면 유용하다.
  13. --show-signature 옵션을 사용하면 커밋의 서명 정보까지도 보여준다.

공유, 업데이트하기

fetch

  1. git fetch 명령은 로컬 데이터베이스에 있는 것을 뺀 리모트 저장소의 모든 것을 가져온다.
  2. Ref를 한 개만 가져오는 방법도 있다.
  3. 번들에서 가져오는 방법도 있다.
  4. Fetch 하는 기본 Refspec도 원하는 대로 수정할 수 있다.

pull

  1. git pull 명령은 git fetch 와 git merge 명령을 순서대로 실행하는 것뿐이다. 그래서 해당 리모트에서 Fetch 하고 즉시 현 브랜치로 Merge를 시도한다.
  2. git remote show <리모트 저장소 이름> 명령으로 git pull 명령을 실행할 때 master 브랜치와 Merge 할 브랜치가 무엇인지 보여 준다.
  3. Rebase 와도 연관이 있다.
  4. 리모트 저장소로 등록하지 않고 저장소 URL로 직접 Merge 할 수 있다. URL을 이용해서한 번만 Pull 해 오는 것이다.
  5. --verify-signatures 옵션을 주면 Pull 할 때 커밋의 PGP 서명을 검증한다.

push

  1. git push 명령은 리모트에는 없지만, 로컬에는 있는 커밋을 계산하고 나서 그 차이만큼만 Push 한다. Push를 하려면 원격 저장소에 대한 쓰기 권한이 필요하고 인증돼야 한다.
  2. git push <리모트 저장소 이름> <브랜치 이름> 명령어로 Upstream 저장소에 Push 할 수 있다.
  3. 트래킹 브랜치를 설정하면 자동으로 Push 하도록 할 수 있다.
  4. git push --delete <branch> 명령으로 원격 서버의 브랜치를 삭제할 수 있다.
  5. 리모트를 여러 개 사용해서 브랜치에 작업한 내용을 공유할 수 있다.
  6. 한 번에 태그를 여러 개 Push 하고 싶으면 --tags 옵션을 주고 태그를 Push 할 수 있다.
  7. 서브모듈의 코드를 수정했을 때는 --recurse-submodules 옵션을 사용하는 것이 좋다. 프로젝트를 Push 할 때 서브모듈에 Push 할 게 있으면 서브모듈부터 Push 하므로 매우 편리하다.
  8. pre-push 훅에 Push 해도 되는지 검증하는 스크립트를 설정하면 규칙에 따르도록 Push를 검증할 수 있다.
  9. 일반적인 이름 규칙에 따라서 Push 하는 것이 아니라 Refspec을 사용해서 원하는 이름으로 Push 하는 것도 가능하다.

remote

  1. git remote 명령은 원격 저장소 설정인 리모트의 관리 도구다. 보통 URL대신 짧은 리모트 이름을 사용한다.
  2. git remote 명령으로 이 리모트를 여러 개 만들어 관리할 수 있다.
  3. -v 옵션을 주어 단축이름과 URL을 함께 볼 수 있다.
  4. git remote add <name> <url>로 추가할 수 있다.
  5. git remote show <리모트 저장소 이름> 명령으로 리모트 저장소의 구체적인 정보를 확인할 수 있다.
  6. git remote rename 명령으로 리모트 저장소의 이름을 변경할 수 있다.
  7. 리모트 저장소를 삭제해야 한다면 git remote removegit remote rm 명령을 사용한다.

Patch 하기

cherry-pick

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

rebase

  1. git rebase 명령은 check-pick 을 여러 번 실행해 주는 것과 같다. 연결된 커밋을 그 순서대로 한방에 Cherry-pick 해온다.
  2. replace 명령어의 --onto 옵션으로 히스토리를 두 저장소로 분리할 수 있다.
  3. Rebase 발생한 충돌은 Rerere 기능에서 해결할 수 있다.
  4. -i 옵션을 주고 이 명령을 실행하면 대화형으로 실행할 수 있다.
  5. 자세히

revert

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

관리

reflog

  1. git reflog 명령은 HEAD가 가리켰던 커밋의 로그를 보여준다. 히스토리를 재작성해서 잃어버린 커밋을 찾을 때 유용하다.
  2. git log 명령에 -g 옵션을 주면 git log 명령의 결과처럼 Reflog를 출력한다.
  3. 잃어버린 브랜치를 복구하는 법과 연관있다.
profile
Frontend, Mobile Developer

0개의 댓글