Git 치트 시트 — 작업별 명령어 모음

마지막 커밋 취소, 브랜치 이름 변경, 원격 브랜치 삭제처럼 하려는 작업별로 정리한 Git 명령어. 최신 switch/restore와 기존 명령어, 위험 배지까지 함께 보여 줍니다.

마지막 확인: 2026-10-18, Git 2.56용 git-scm.com 레퍼런스와 GitHub CLI 매뉴얼 기준. 출처: Git reference (git-scm.com/docs), git restore, git switch, git reset, git config, GitHub CLI manual.

명령어 97개
자주 찾는 작업:

히스토리 재작성 아직 아무도 pull하지 않은 커밋에서만 안전 · ⚠ 작업 삭제 변경 사항이 영구 삭제될 수 있음. 복사 버튼은 # 주석을 빼고 복사합니다.

초기 설정 (컴퓨터마다 한 번)

--global을 쓰면 설정이 ~/.gitconfig에 저장됩니다. Git 2.46부터는 git config set / get / list가 문서화된 형식이며, 기존 형식도 계속 작동합니다.

이름과 이메일 설정#Git 2.46 이상
git config set --global user.name "Ana Lee"
git config set --global user.email "ana@example.com"

기존 방식: git config --global user.name "Ana Lee"

모든 커밋에 기록됩니다. Git 호스팅 서비스에 등록된 이메일을 써야 커밋이 계정과 연결됩니다.

새 저장소가 main 브랜치로 시작하게 하기#
git config set --global init.defaultBranch main

기존 방식: git config --global init.defaultBranch main

설정하지 않으면 git init은 여전히 첫 브랜치 이름을 master로 지정합니다(힌트도 출력함).

커밋 메시지 편집기 선택#
git config set --global core.editor "code --wait"

기존 방식: git config --global core.editor "code --wait"

파일을 닫을 때까지 대기하는 명령이라면 무엇이든 됩니다: "nano", "vim", "subl -n -w".

Windows / macOS 줄 끝 문자 처리#
git config set --global core.autocrlf true  # Windows
git config set --global core.autocrlf input  # macOS, Linux

기존 방식: git config --global core.autocrlf true

LF로 커밋하고 Windows에서는 CRLF로 체크아웃합니다. 팀 전체라면 사람마다 설정하는 것보다 "* text=auto"가 들어간 .gitattributes 파일이 더 확실합니다.

Git 버전 확인#
git --version

git switch와 git restore는 2.23 이상, git config 하위 명령은 2.46 이상이 필요합니다.

저장소 시작하기

폴더를 저장소로 만들기#
git init
git init -b main  # name the first branch

.git 디렉터리를 만듭니다. 빌드 결과물과 비밀 정보가 들어가지 않도록 첫 커밋 전에 .gitignore를 추가하세요.

기존 저장소 복제#
git clone https://github.com/owner/repo.git
git clone git@github.com:owner/repo.git my-folder

전체 히스토리를 내려받고 원격 "origin"을 설정합니다. 두 번째 형식은 SSH와 사용자 지정 폴더 이름을 사용합니다.

최신 버전만 복제 (더 빠름)#
git clone --depth 1 https://github.com/owner/repo.git

히스토리를 건너뛰므로 CI와 대형 저장소에 적합합니다. 나중에 git fetch --unshallow로 나머지를 받을 수 있습니다.

새 로컬 저장소 게시#
git remote add origin git@github.com:owner/repo.git
git push -u origin main

먼저 호스팅 서비스에 빈 저장소를 만드세요(또는 아래의 gh repo create 사용). -u는 origin/main을 업스트림으로 기억합니다.

스테이징과 커밋

변경 사항 확인#
git status
git status -s  # short form

스테이징된 파일, 스테이징되지 않은 파일, 추적되지 않는 파일을 나열하고 다음 명령을 제안합니다.

다음 커밋할 파일 스테이징#
git add file.txt
git add .  # everything in this folder and below

git add -A는 저장소 전체의 삭제도 스테이징합니다.

파일의 일부만 스테이징#
git add -p file.txt

변경 단위("hunk")를 하나씩 확인합니다. y는 스테이징, n은 건너뛰기, s는 분할, e는 편집입니다.

스테이징된 변경 사항 커밋#
git commit -m "Add login form"
git commit -am "Fix typo"  # stage tracked files and commit

-a는 추적 중인 파일의 수정과 삭제만 포함하며 새 파일은 포함하지 않습니다.

추적 중인 파일 이름 변경 또는 삭제#
git mv old.txt new.txt
git rm file.txt

둘 다 변경 사항을 자동으로 스테이징합니다. Git은 내용으로 이름 변경을 감지하므로 일반 mv 후 git add를 해도 됩니다.

파일은 디스크에 두고 추적만 중지#
git rm --cached .env
echo ".env" >> .gitignore

다음 커밋부터 저장소에서 제거됩니다. 이전 커밋에는 남아 있으므로, 비밀 정보가 들어 있었다면 해당 비밀 정보를 교체하세요.

브랜치

브랜치 목록 보기#
git branch
git branch -a  # include remote branches
git branch -vv  # show upstream and ahead/behind

현재 브랜치에는 *가 표시됩니다.

브랜치를 만들고 전환#Git 2.23 이상
git switch -c feature/login

기존 방식: git checkout -b feature/login

현재 커밋에서 시작합니다. 다른 곳에서 시작하려면 시작 지점을 추가하세요: git switch -c hotfix origin/main.

다른 브랜치로 전환#Git 2.23 이상
git switch main
git switch -  # back to the previous branch

기존 방식: git checkout main

origin/feature만 있으면 git switch feature가 로컬 추적 브랜치를 자동으로 만듭니다.

브랜치 이름 변경#
git branch -m new-name  # current branch
git branch -m old-name new-name

로컬에서만 이름이 바뀝니다. 원격에서도 바꾸려면 다음 항목을 참고하세요.

원격 브랜치 이름 변경#
git branch -m old-name new-name
git push -u origin new-name
git push origin --delete old-name

원격 이름 변경 명령은 없습니다. 새 이름을 푸시하고 옛 이름을 삭제하세요. 옛 이름으로 열린 풀 리퀘스트는 닫힐 수 있으며, GitHub 웹 UI의 이름 변경 버튼을 쓰면 대상 브랜치가 자동으로 바뀝니다.

로컬 브랜치 삭제#⚠ 작업 삭제
git branch -d feature/login
git branch -D feature/login  # even if unmerged

-d는 업스트림이나 HEAD에 병합되지 않은 커밋이 있으면 거부하고, -D는 그래도 삭제합니다.

복구: 병합되지 않은 커밋은 reflog에 남아 있습니다. git reflog로 끝 커밋을 찾은 다음 git branch feature/login <sha>를 실행하세요.

원격 브랜치 삭제#⚠ 작업 삭제
git push origin --delete feature/login

기존 방식: git push origin :feature/login

팀원은 git fetch --prune을 실행하기 전까지 계속 보게 됩니다.

복구: 브랜치를 로컬에 가진 사람(또는 git reflog를 통해 본인)이 다시 푸시할 수 있습니다.

업스트림 브랜치 설정 또는 변경#
git branch -u origin/main
git push -u origin HEAD  # push current branch and track it

기존 방식: git branch --set-upstream-to=origin/main

인수 없는 git pull과 git push가 사용하는 대상이 업스트림입니다.

이전 커밋 살펴보기 (detached HEAD)#Git 2.23 이상
git switch --detach a1b2c3d
git switch -c rescue  # keep work made there

기존 방식: git checkout a1b2c3d

detached 상태에서 만든 커밋은 어떤 브랜치에도 속하지 않습니다. 다른 곳으로 전환하기 전에 브랜치를 만들지 않으면 reflog로만 찾을 수 있습니다.

병합, 리베이스, 체리픽

브랜치를 현재 브랜치에 병합#
git switch main
git merge feature/login
git merge --no-ff feature/login  # always create a merge commit

가능하면 fast-forward로 병합합니다. --no-ff를 쓰면 히스토리에 브랜치가 남습니다.

브랜치를 커밋 하나로 합치기(squash)#
git merge --squash feature/login
git commit -m "Add login"

합쳐진 변경 사항을 병합 기록 없이 스테이징합니다. 이후 해당 브랜치는 병합된 것으로 표시되지 않습니다.

병합 충돌 해결#
git status  # list conflicted files
# edit the files, remove <<<<<<< ======= >>>>>>> markers
git add file.txt
git commit  # or: git rebase --continue

git restore --ours file.txt 또는 --theirs로 한쪽을 통째로 선택할 수 있습니다. 리베이스 중에는 "ours"가 리베이스 대상 브랜치를 가리켜 병합과 반대입니다.

진행 중인 병합 중단#⚠ 작업 삭제
git merge --abort

병합을 시작하기 전 상태로 돌아갑니다.

복구: 직접 해결한 충돌 내용은 사라집니다. 병합을 시작할 때 커밋하지 않은 변경 사항이 있었다면 --abort로 복원하지 못할 수 있으니, 병합 전에 커밋하거나 stash하세요.

브랜치를 main 위로 리베이스#히스토리 재작성
git switch feature/login
git rebase main

커밋을 main 위에 다시 적용해 히스토리를 일직선으로 만듭니다. 충돌을 해결하고 git add 후 git rebase --continue를 실행하며, --abort로 포기할 수 있습니다.

복구: 직후라면 git reset --hard ORIG_HEAD. 나중이라면 git reflog에서 이전 끝 커밋을 찾으세요.

최근 커밋 합치기, 순서 변경, 메시지 수정#히스토리 재작성
git rebase -i HEAD~3

목록이 열립니다. pick을 squash/fixup으로 바꾸면 합치고, reword는 메시지 수정, drop은 삭제이며, 줄 순서를 바꿔 커밋 순서를 바꿀 수 있습니다.

복구: git reflog에서 리베이스 전 커밋을 확인하고 git reset --hard <sha>로 복원합니다.

이전 커밋 수정#히스토리 재작성
git commit --fixup=a1b2c3d
git rebase -i --autosquash a1b2c3d~1

리베이스할 때 fixup 커밋이 a1b2c3d에 자동으로 합쳐집니다.

복구: 대화형 리베이스와 같습니다: git reflog.

병합 커밋 없이 pull#
git pull --rebase
git config set --global pull.rebase true  # make it the default

가져온 내용 위에 로컬 커밋을 리베이스합니다.

다른 브랜치의 커밋 복사#
git cherry-pick a1b2c3d
git cherry-pick -x a1b2c3d  # note the source in the message

같은 변경 사항으로 새 커밋을 만듭니다. 범위 지정: git cherry-pick A..B (A 제외).

원격: fetch, pull, push

원격 저장소 확인 및 변경#
git remote -v
git remote set-url origin git@github.com:owner/repo.git

set-url로 복제본의 연결을 HTTPS에서 SSH로(또는 이름이 바뀐 저장소로) 바꿉니다.

병합하지 않고 변경 사항 내려받기#
git fetch
git fetch --prune  # also drop deleted remote branches

origin/*만 업데이트하며 내 브랜치는 그대로입니다.

현재 브랜치 업데이트#
git pull

git fetch 후 병합합니다(pull.rebase가 설정되어 있으면 리베이스).

커밋 푸시#
git push
git push -u origin HEAD  # first push of a new branch
git config set --global push.autoSetupRemote true

push.autoSetupRemote(Git 2.37 이상)를 설정하면 새 브랜치에서 git push만 해도 업스트림이 자동으로 설정됩니다.

히스토리를 재작성한 뒤 안전하게 강제 푸시#히스토리 재작성
git push --force-with-lease

--force와 달리 아직 fetch하지 않은 커밋이 원격에 있으면 거부합니다. 백그라운드 fetch에 대비해 --force-if-includes(Git 2.30 이상)를 추가하면 더 안전합니다.

복구: 덮어쓴 원격 커밋은 그 커밋을 가진 사람의 reflog에 남아 있으며, GitHub에서도 한동안 SHA로 접근할 수 있습니다.

원본 저장소에서 포크 업데이트#
git remote add upstream https://github.com/original/repo.git
git fetch upstream
git switch main
git merge upstream/main

또는 GitHub CLI로: gh repo sync.

되돌리기

실수가 어디에 있는지에 따라 고르세요: 작업 트리, 스테이징 영역, 로컬 커밋, 이미 푸시한 커밋. 한 번이라도 커밋한 내용은 대개 git reflog로 다시 찾을 수 있지만, 커밋하지 않고 버린 수정은 찾을 수 없습니다.

마지막 커밋 취소 (변경 사항 유지)#히스토리 재작성
git reset --soft HEAD~1

커밋은 사라지고 변경 사항은 스테이징된 채 남아 다시 커밋할 수 있습니다. 스테이징하지 않은 상태로 두려면 git reset HEAD~1(--soft 없이)을 쓰세요.

복구: git reset ORIG_HEAD로 커밋을 되살립니다. 이미 푸시했다면 git revert를 쓰세요.

마지막 커밋과 변경 사항 모두 버리기#⚠ 작업 삭제
git reset --hard HEAD~1

브랜치를 커밋 하나 뒤로 옮기고 추적 중인 모든 파일을 그에 맞게 되돌립니다.

복구: 커밋은 git reflog에 있습니다(도달할 수 없는 항목은 기본적으로 30일 후 만료): git reset --hard HEAD@{1}. 추적 중인 파일의 커밋하지 않은 변경 사항은 영구히 사라집니다.

이미 푸시한 커밋 되돌리기#
git revert a1b2c3d
git revert HEAD  # the latest commit

이전 커밋을 반대로 적용하는 새 커밋을 추가하므로 다른 사람의 히스토리는 바뀌지 않습니다. 공유 브랜치에서 안전하게 되돌리는 방법입니다.

병합 커밋 되돌리기#
git revert -m 1 <merge-sha>

-m 1은 첫 번째 부모(보통 main)를 유지합니다. 나중에 브랜치를 다시 병합하려면 먼저 이 revert를 revert해야 합니다.

마지막 커밋 메시지 수정#히스토리 재작성
git commit --amend -m "Better message"

마지막 커밋을 새 커밋으로 바꿉니다. 푸시 전에는 괜찮지만, 푸시 후에는 --force-with-lease가 필요합니다.

복구: git reset --soft HEAD@{1}로 amend 전 커밋으로 돌아갑니다.

빠뜨린 파일을 마지막 커밋에 추가#히스토리 재작성
git add forgotten.txt
git commit --amend --no-edit

메시지는 유지하고 파일만 추가합니다.

복구: git reset --soft HEAD@{1}.

파일 스테이징 취소 (git add 되돌리기)#Git 2.23 이상
git restore --staged file.txt
git restore --staged .  # everything

기존 방식: git reset HEAD file.txt

변경 사항은 작업 트리에 남고 스테이징만 취소됩니다.

파일의 변경 사항 버리기#⚠ 작업 삭제Git 2.23 이상
git restore file.txt

기존 방식: git checkout -- file.txt

파일을 스테이징된 버전(스테이징된 것이 없으면 마지막 커밋)으로 되돌립니다.

복구: Git으로는 복구할 수 없습니다. 수정 내용이 커밋된 적이 없기 때문입니다. 편집기의 로컬 기록에는 남아 있을 수 있습니다.

모든 로컬 변경 사항 버리기#⚠ 작업 삭제Git 2.23 이상
git restore --staged --worktree .
git clean -fd  # also delete untracked files

기존 방식: git reset --hard git clean -fd

마지막 커밋 상태로 돌아갑니다. 먼저 git clean -n으로 삭제될 파일을 확인하세요.

복구: 복구할 수 없습니다. 커밋하지 않은 수정과 추적되지 않는 파일이 삭제됩니다. 되돌릴 수 있는 대안은 git stash -u입니다.

삭제된 파일 복원#Git 2.23 이상
git restore file.txt  # deletion not committed
git restore --source=a1b2c3d~1 file.txt  # deleted in commit a1b2c3d

기존 방식: git checkout a1b2c3d~1 -- file.txt

git log --diff-filter=D -- file.txt로 파일을 삭제한 커밋을 찾으세요.

다른 커밋이나 브랜치의 파일 가져오기#⚠ 작업 삭제Git 2.23 이상
git restore --source=main -- config.yml

기존 방식: git checkout main -- config.yml

작업 복사본만 덮어씁니다. 스테이징까지 하려면 --staged --worktree를 추가하세요. 내용만 보려면: git show main:config.yml.

복구: 해당 파일의 커밋하지 않은 수정 내용은 덮어써집니다.

잃어버린 커밋이나 삭제된 브랜치 찾기#
git reflog
git branch rescued a1b2c3d

reflog는 HEAD가 거쳐 간 모든 위치를 기록합니다. 실수하기 전의 SHA를 찾아 그 위에 브랜치를 만드세요.

푸시하지 않은 병합 취소#⚠ 작업 삭제
git reset --hard ORIG_HEAD

ORIG_HEAD는 merge, rebase, reset이 실행 전 위치로 설정합니다. 다음에 이런 명령을 실행하면 덮어써집니다.

복구: git reflog에는 병합 커밋이 여전히 남아 있습니다.

리베이스 취소#⚠ 작업 삭제
git reflog  # find "rebase (start)"; the entry below it is the old tip
git reset --hard HEAD@{5}

리베이스 직후라면 git reset --hard ORIG_HEAD도 같은 효과입니다.

복구: --hard는 커밋하지 않은 변경 사항을 버리므로 먼저 stash하세요.

git reset 취소#⚠ 작업 삭제
git reset --hard HEAD@{1}

HEAD@{1}은 마지막 이동 전 HEAD의 위치입니다. 커밋한 작업에만 통합니다.

커밋된 비밀 정보나 대용량 파일을 히스토리에서 제거#히스토리 재작성
git filter-repo --invert-paths --path secrets.env

git filter-repo는 별도 도구(pip install git-filter-repo)로, git-filter-branch 문서에서 권장합니다. 작업 후에는 모든 복제본을 다시 복제해야 합니다. 비밀 정보는 어쨌든 교체하세요. 푸시한 순간부터 공개된 것입니다.

복구: filter-repo는 새로 복제한 저장소에서 작업합니다. 확실해질 때까지 기존 복제본을 보관하세요.

Stash

작업을 잠시 치워 두기#
git stash
git stash push -m "half-done login"
git stash -u  # include untracked files

추적 중인 변경 사항을 저장하고 작업 트리를 깨끗하게 만들어 브랜치를 전환할 수 있게 합니다.

stash한 작업 되돌려 놓기#
git stash pop  # apply and drop
git stash apply stash@{1}  # apply, keep the stash

충돌이 생길 수 있습니다. pop을 쓸 때 적용에 실패하면 stash는 유지됩니다.

stash 목록 보기 및 살펴보기#
git stash list
git stash show -p stash@{0}

최신 항목이 먼저 나오며 stash@{0}이 가장 최근 것입니다.

일부 파일만 stash#
git stash push -- src/login.ts
git stash push --staged  # only what is staged (2.35+)

경로를 지정한 stash는 나머지를 그대로 둡니다.

stash를 브랜치로 만들기#
git stash branch feature/login stash@{0}

stash한 시점의 커밋에 브랜치를 만들고 stash를 적용한 뒤 삭제하므로 충돌을 피할 수 있습니다.

stash 삭제#⚠ 작업 삭제
git stash drop stash@{0}
git stash clear

clear는 모든 stash를 제거합니다.

복구: 삭제한 stash는 가비지 컬렉션 전까지 도달할 수 없는 커밋으로 남습니다: git fsck --unreachable | grep commit 후 git stash apply <sha>.

히스토리와 diff

히스토리를 그래프로 보기#
git log --oneline --graph --all

브랜치 구조와 함께 커밋당 한 줄로 표시합니다. 아주 오래된 Git에서는 --decorate를 추가해야 브랜치 이름이 보입니다.

파일 하나의 히스토리#
git log --follow -p -- path/file.txt

--follow는 이름 변경 이후까지 추적하고, -p는 각 변경 내용을 보여 줍니다.

작성자 또는 날짜별 커밋#
git log --author="Ana" --since="2 weeks ago" --oneline

--until, 메시지 검색용 --grep="fix", main에는 없고 feature에만 있는 커밋을 보는 main..feature도 있습니다.

커밋 하나 또는 파일의 이전 버전 보기#
git show a1b2c3d
git show a1b2c3d:path/file.txt

두 번째 형식은 내 작업 복사본을 건드리지 않고 해당 커밋 시점의 파일을 출력합니다.

아직 커밋하지 않은 변경 사항 보기#
git diff  # unstaged
git diff --staged  # staged, i.e. what will be committed

--stat은 파일별로 요약하고, --word-diff는 일반 글에 더 적합합니다.

두 브랜치 비교#
git diff main...feature  # changes on feature since it branched
git diff main feature  # the two tips directly

점 세 개는 병합 기준(merge base)과 비교하며, 풀 리퀘스트에 표시되는 것과 같습니다.

각 줄을 누가 수정했는지 보기#
git blame -L 10,20 path/file.txt

-w를 추가하면 공백을 무시하고, -C를 추가하면 다른 파일에서 옮겨 온 줄도 추적합니다.

버그를 만든 커밋 찾기#
git bisect start
git bisect bad  # current commit is broken
git bisect good v1.4.0  # this one worked
# test, then mark each step good or bad
git bisect reset

이진 탐색으로 약 log2(n)단계가 걸립니다. git bisect run ./test.sh로 자동화할 수 있습니다.

추적 중인 파일 검색#
git grep -n "TODO"

대형 저장소에서 grep보다 빠르고 무시된 파일은 건너뜁니다. 커밋을 지정하면 이전 버전을 검색합니다.

태그와 릴리스

릴리스에 태그 붙이기#
git tag -a v1.2.0 -m "Release 1.2.0"
git tag -a v1.1.1 a1b2c3d -m "Hotfix"  # tag an older commit

주석 태그(-a)는 작성자, 날짜, 메시지를 저장하므로 릴리스에는 이쪽을 권장합니다. git tag v1.2.0만 쓰면 경량 태그가 만들어집니다.

태그 푸시#
git push origin v1.2.0
git push --follow-tags  # annotated tags reachable from pushed commits

git push는 기본적으로 태그를 보내지 않습니다. git push --tags는 불필요한 로컬 태그까지 모든 태그를 보냅니다.

로컬과 원격에서 태그 삭제#⚠ 작업 삭제
git tag -d v1.2.0
git push origin --delete v1.2.0

삭제한 릴리스 태그 이름은 다시 쓰지 마세요. 다른 복제본에는 옛 태그가 남아 있습니다.

복구: 태그가 붙은 커밋은 그대로이므로 그 커밋에 태그를 다시 만드세요.

태그 목록 보기 및 현재 버전 확인#
git tag -l "v1.*"
git describe --tags

describe는 가장 가까운 태그와 그 이후 커밋 수를 출력합니다(예: v1.2.0-3-ga1b2c3d).

서브모듈과 워크트리

서브모듈 추가#
git submodule add https://github.com/owner/lib.git vendor/lib
git commit -m "Add lib submodule"

.gitmodules에 URL을 기록하고 다른 저장소의 특정 커밋을 고정합니다.

복제 후 서브모듈 가져오기#
git clone --recurse-submodules <url>
git submodule update --init --recursive  # already cloned

이 작업을 하지 않으면 서브모듈 폴더가 비어 있습니다.

서브모듈을 최신 커밋으로 이동#
git submodule update --remote
git commit -am "Bump submodules"

각 서브모듈의 추적 브랜치를 가져옵니다. 상위 저장소에서 새로 고정된 커밋을 커밋하세요.

두 브랜치에서 동시에 작업#
git worktree add ../repo-hotfix hotfix
git worktree add -b review ../repo-review origin/main

같은 저장소를 공유하는 두 번째 작업 폴더로, stash나 추가 복제가 필요 없습니다.

워크트리 목록 보기 및 제거#
git worktree list
git worktree remove ../repo-hotfix
git worktree prune  # forget folders deleted by hand

워크트리에 커밋하지 않은 변경 사항이 있으면 remove가 거부됩니다(--force로 무시 가능).

정리하기

삭제될 추적되지 않는 파일 미리 보기#
git clean -n -d

git clean -f 전에 항상 실행하세요.

추적되지 않는 파일 삭제#⚠ 작업 삭제
git clean -fd  # untracked files and folders
git clean -fdx  # also ignored files (build output, .env!)

-x는 .env 같은 로컬 설정을 포함해 무시된 파일까지 삭제합니다.

복구: 복구할 수 없습니다. 이 파일들은 Git에 들어간 적이 없습니다.

main에 이미 병합된 브랜치 삭제#
git branch --merged main
git branch -d branch-a branch-b

먼저 목록을 확인하세요. -d는 병합되지 않은 브랜치를 거부하므로 시도해도 안전합니다.

오래된 원격 추적 브랜치 제거#
git fetch --prune
git config set --global fetch.prune true

서버에서 삭제된 브랜치의 origin/* 참조를 정리합니다.

대형 저장소 속도 높이기#
git maintenance start
git gc

maintenance start는 백그라운드 prefetch, commit-graph, repack 작업을 예약하고, gc는 지금 바로 객체를 압축하고 도달할 수 없는 객체를 정리합니다.

설정과 별칭

모든 설정과 출처 보기#Git 2.46 이상
git config list --show-origin

기존 방식: git config --list --show-origin

시스템, 전역, 저장소 값을 각각 들어 있는 파일과 함께 보여 줍니다.

별칭 만들기#Git 2.46 이상
git config set --global alias.st "status -s"
git config set --global alias.lg "log --oneline --graph --all"

기존 방식: git config --global alias.st "status -s"

그러면 git st와 git lg를 쓸 수 있습니다. 앞에 !를 붙이면 셸 명령을 실행합니다: alias.root "!pwd".

설정해 두면 좋은 기본값#Git 2.46 이상
git config set --global pull.rebase true
git config set --global push.autoSetupRemote true
git config set --global rerere.enabled true
git config set --global merge.conflictStyle zdiff3
git config set --global diff.algorithm histogram

기존 방식: git config --global pull.rebase true

pull 시 리베이스, 첫 푸시 때 업스트림 자동 설정(2.37 이상), 충돌 해결 기억, 충돌 시 공통 조상 표시(2.35 이상), 더 명확한 diff.

모든 저장소에서 파일 무시#
git config set --global core.excludesFile ~/.gitignore_global

기존 방식: git config --global core.excludesFile ~/.gitignore_global

OS와 편집기가 만드는 파일(.DS_Store, .idea/)용입니다. 프로젝트별 규칙은 저장소의 .gitignore에 두세요.

GitHub CLI (gh) 기본

gh는 GitHub의 공식 명령줄 도구로, Git과 별도로 설치합니다.

GitHub에 로그인#
gh auth login
gh auth setup-git  # let git use gh for HTTPS credentials

브라우저를 열거나 토큰을 입력받으며, github.com과 GitHub Enterprise 모두 지원합니다.

로컬 폴더로 GitHub 저장소 만들기#
gh repo create my-app --private --source=. --push

저장소를 만들어 origin으로 추가하고 현재 브랜치를 푸시합니다.

소유자/이름으로 복제#
gh repo clone owner/repo

포크라면 상위 저장소도 upstream 원격으로 추가합니다.

풀 리퀘스트 열기#
gh pr create --fill
gh pr create --draft --title "WIP: login" --body "…"

--fill은 커밋 메시지를 제목과 본문으로 사용합니다.

다른 사람의 풀 리퀘스트 체크아웃#
gh pr checkout 123

PR 브랜치(포크 포함)를 가져와 전환합니다.

풀 리퀘스트 목록 보기, 확인, 병합#
gh pr list
gh pr view 123 --web
gh pr merge 123 --squash --delete-branch

gh pr status는 나와 관련된 PR을 보여 줍니다.

이슈 만들기 및 목록 보기#
gh issue create --title "Bug: …" --body "…"
gh issue list --assignee @me

gh issue view 42 --comments로 터미널에서 스레드를 읽을 수 있습니다.

GitHub Actions 실행 지켜보기#
gh run list
gh run watch

gh run view --log-failed는 실패한 단계만 출력합니다.

.gitignore를 처음부터 만들어야 하나요? .gitignore 생성기를 이용하세요. Git 밖에서 파일의 두 버전을 비교하려면 텍스트 비교 도구로 변경 사항을 나란히 볼 수 있습니다.

정적인 레퍼런스입니다. 검색은 브라우저에서 실행되며 입력한 내용은 어디에도 전송되지 않습니다. 모든 무료 도구 보기.

문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.

이 Git 치트 시트는 명령어가 아니라 작업별로 정리되어 있습니다. “git reset --soft”를 검색하는 사람은 없고, 모두 “마지막 커밋 취소”를 검색하기 때문입니다. 하려는 작업을 찾아 명령어를 복사하고, 무엇이 바뀌는지 한 줄 설명을 읽으세요. 검색은 작업을 우선으로 순위를 매기므로 “원격 브랜치 삭제”나 “브랜치 이름 변경”을 입력하면 바로 해당 항목으로 갑니다.

히스토리를 다시 쓰거나 작업을 버리는 명령어에는 표시가 붙어 있고, 무엇을 복구할 수 있는지 설명이 있습니다. 한 번이라도 커밋된 것은 거의 모두 git reflog로 다시 찾을 수 있지만, restore, reset --hard, clean으로 버린 커밋하지 않은 수정 내용은 사라집니다. Git에 더 명확한 명령어가 생긴 경우(2.23부터 git switch와 git restore, 2.46부터 git config set과 list)에는 그것을 먼저 보여 주고 기존 형태를 함께 표시하므로, 팀이 Git을 작년에 배웠든 2010년에 배웠든 쓸 수 있습니다. Git 2.56 기준 git-scm.com 레퍼런스와 대조해 확인했습니다.

사용 방법

  1. 검색창에 “마지막 커밋 취소”, “unstage”, “커밋 합치기(squash)”처럼 하려는 작업을 입력하거나, 자주 하는 작업 중 하나를 클릭하세요.
  2. 실행하기 전에 배지를 확인하세요. 주황색은 히스토리를 다시 쓰는 명령어, 빨간색은 작업을 버릴 수 있는 명령어입니다. 복구 참고에서 되돌리는 방법을 알려 줍니다.
  3. 명령어 복사를 클릭하세요. # 주석을 빼고 복사하므로 터미널에 깔끔하게 붙여 넣을 수 있습니다. a1b2c3d나 feature/login 같은 플레이스홀더는 자신의 값으로 바꾸세요.
  4. 각 작업 옆의 # 링크로 특정 답을 공유하거나, 전체 시트를 2단 PDF로 인쇄하세요.

자주 묻는 질문

Git에서 마지막 커밋을 취소하려면 어떻게 하나요?

아직 푸시하지 않았다면 git reset --soft HEAD~1은 커밋을 지우고 변경 사항을 스테이징된 상태로 남기며, git reset HEAD~1은 스테이징되지 않은 상태로 남깁니다. git reset --hard HEAD~1은 커밋과 변경 사항을 모두 지웁니다. 이미 공유 브랜치에 푸시한 커밋이라면 대신 git revert HEAD를 쓰세요. 다른 사람의 히스토리를 다시 쓰지 않고 그 커밋을 되돌리는 새 커밋을 추가합니다.

git reset, git restore, git revert의 차이는 무엇인가요?

git restore는 파일을 바꿉니다. 작업 트리의 수정 내용을 버리거나 스테이징을 취소하며, 브랜치를 움직이지 않습니다. git reset은 현재 브랜치를 다른 커밋으로 옮기고(--hard를 쓰면 파일도 덮어씀) 히스토리를 다시 씁니다. git revert는 이전 커밋의 반대 내용을 적용하는 새 커밋을 만듭니다. 히스토리가 늘어나기만 하므로 다른 사람이 쓰는 브랜치에서는 안전한 선택입니다.

로컬과 원격에서 Git 브랜치 이름은 어떻게 바꾸나요?

git branch -m new-name은 현재 브랜치의 이름을 바꿉니다(다른 브랜치는 git branch -m old new). 원격에는 이름 변경 작업이 없으므로 git push -u origin new-name으로 새 이름을 푸시하고 git push origin --delete old-name으로 이전 이름을 삭제하세요. GitHub 웹 인터페이스에서 브랜치 이름을 바꾸면 열려 있는 풀 리퀘스트의 대상도 함께 바뀝니다.

git switch와 git checkout 중 무엇을 써야 하나요?

둘 다 됩니다. git checkout은 브랜치 전환과 파일 복원이라는 서로 관련 없는 두 가지 일을 해서, Git 2.23에서 git switch와 git restore로 나뉘었습니다. 새 명령어가 더 명확하고 잘못 쓰기 어려우므로(git checkout -- file은 수정 내용을 조용히 버림) 이 시트에서는 이를 먼저 보여 줍니다. git checkout이 폐기된 것은 아니며, 여기 있는 모든 명령어에 기존 방식도 함께 적혀 있습니다.

git reset --hard 후에 커밋을 복구할 수 있나요?

대개는 가능합니다. git reflog를 실행해 reset 이전 줄을 찾고 git reset --hard HEAD@{n}을 실행하거나 그 SHA에 브랜치를 만드세요. 더 이상 아무것도 가리키지 않는 커밋도 기본적으로 30일 동안 reflog를 통해 접근할 수 있습니다. 복구할 수 없는 것은 커밋하지 않은 작업입니다. 커밋하거나 stash하지 않은 변경 사항은 완전히 덮어써집니다.

git push --force-with-lease는 무엇을 하나요?

원격 브랜치가 마지막으로 fetch했을 때와 같은 곳을 가리키고 있을 때만 원격 브랜치를 덮어씁니다. 그 사이에 누군가 푸시했다면 일반 --force처럼 그 사람의 커밋을 조용히 지우는 대신 푸시가 거부됩니다. 이미 푸시한 브랜치에서 rebase나 amend를 한 뒤에 사용하세요.

어떤 되돌리기 명령어를 써야 할까? 변경 사항의 위치로 판단하세요

• 파일을 수정했는데 수정 내용을 없애고 싶다: git restore file. 커밋된 적이 없으므로 복구할 수 없습니다.

• 실수로 스테이징했다: git restore --staged file. 잃는 것은 없으며 수정 내용은 파일에 남습니다.

• 커밋했지만 푸시하지 않았다: 커밋을 다시 하려면 git reset --soft HEAD~1, 그 자리에서 고치려면 git commit --amend.

• 커밋해서 공유 브랜치에 푸시했다: git revert <sha>. 다른 사람이 pull한 브랜치는 reset하지 마세요.

• 커밋, 브랜치, 잘못된 rebase 결과를 잃어버렸다: git reflog 후 git branch rescued <sha>.

기본 원칙: 커밋을 다시 쓰는 작업은 커밋이 나만의 것일 때는 괜찮지만, 공유된 순간부터 모두의 문제가 됩니다.

merge와 rebase 중 무엇을 쓸까?

둘 다 한 브랜치의 변경 사항을 다른 브랜치로 가져옵니다. merge는 두 히스토리가 합쳐졌다는 사실을 부모가 둘인 병합 커밋으로 기록합니다. 아무것도 다시 쓰지 않으므로 공유 브랜치에서도 언제나 안전합니다. rebase는 내 커밋을 다른 브랜치 위에 다시 적용해 최신 커밋에서 시작한 것처럼 일직선 히스토리를 만들지만, 새 커밋 ID가 생기므로 이전 커밋을 이미 가진 사람은 맞춰야 합니다.

흔한 팀 규칙: 자신의 기능 브랜치는 main 위로 rebase해서 최신 상태를 유지하고(git pull --rebase 또는 git rebase main), 완성된 브랜치는 풀 리퀘스트를 통해 main에 merge합니다. squash merge를 하면 main에 기능당 커밋 하나가 남고, 일반 merge는 모든 커밋과 브랜치 형태를 유지합니다. 저장소마다 하나를 정해 호스팅 서비스 설정에 지정해 두면 히스토리가 일관되게 유지됩니다.

기본값에서 바꿀 만한 Git 설정

• pull.rebase true: git pull이 동기화할 때마다 병합 커밋을 만드는 대신 rebase합니다.

• push.autoSetupRemote true (Git 2.37+): 새 브랜치를 처음 git push할 때 upstream이 설정되어 -u가 필요 없습니다.

• merge.conflictStyle zdiff3 (Git 2.35+): 충돌 표시에 공통 조상이 포함되어 대부분의 충돌을 쉽게 파악할 수 있습니다.

• rerere.enabled true: Git이 충돌을 어떻게 해결했는지 기억했다가 rebase 중 같은 충돌이 다시 나오면 다시 적용합니다.

• fetch.prune true: 서버에서 삭제된 원격 브랜치가 다음 fetch 때 로컬에서도 사라집니다.

• init.defaultBranch main: 새 저장소가 main 브랜치로 시작합니다.

관련 무료 도구

  • .gitignore 생성기 — 언어, 프레임워크, 편집기, 운영체제별 .gitignore 템플릿을 하나의 깔끔한 파일로 합치세요.
  • 텍스트 비교 (Diff) — 텍스트, 코드, JSON 파일의 두 버전을 비교해 정확히 어떤 줄, 단어, 문자가 바뀌었는지 확인하세요.
  • 마크다운 치트 시트 — 모든 마크다운 요소를 소스와 렌더링 결과로 보여 주고, 확장 문법(표, 작업 목록, 각주, 수식, Mermaid, 알림), 9개 플랫폼 호환성 표, 실시간 플레이그라운드까지 제공합니다.
  • 정규식 치트 시트 — 모든 정규 표현식 토큰을 실제로 작동하는 예제와 함께, JavaScript, PCRE/PHP, Python, Go, Java, .NET 지원 여부까지 정리했습니다. 사용해 보기 링크를 누르면 정규식 테스터가 미리 채워진 상태로 열립니다.