너무 일찍 커밋했거나, 메시지를 잘못 썼거나, 엉뚱한 브랜치에 커밋했을 때
"취소"를 검색하거나 "되돌리기와 취소" 그룹을 열어 "아직 푸시 안 함"(reset / --amend)과 "이미 푸시함"(revert)을 먼저 가른 뒤 명령어를 고릅니다. "자주 쓰는 조합"에는 "main에 커밋했는데 새 브랜치로 옮기고 싶다" 같은 완성된 레시피가 있습니다.
Guide
Git 명령어 치트시트는 바로 써먹을 수 있는 표입니다. 149개 명령어를 "초기화와 설정, 일상 커밋, 브랜치, 병합과 리베이스, 되돌리기와 취소, 원격 협업, stash, 태그, 서브모듈과 워크트리, 기록 조회와 문제 해결, 무시와 속성" 열한 가지 상황으로 묶고, 각 항목에 한 줄 설명과 그대로 붙여넣을 수 있는 예시, 그리고 "주의 / 위험" 두 단계 위험 표시를 달았습니다. 커밋하지 않은 변경을 날리거나 이미 공유된 기록을 다시 쓰는 명령어는 한눈에 알아볼 수 있습니다.
2026-09-09 업데이트4 sources7 min read
Git 명령어 치트시트는 바로 써먹을 수 있는 표입니다. 149개 명령어를 "초기화와 설정, 일상 커밋, 브랜치, 병합과 리베이스, 되돌리기와 취소, 원격 협업, stash, 태그, 서브모듈과 워크트리, 기록 조회와 문제 해결, 무시와 속성" 열한 가지 상황으로 묶고, 각 항목에 한 줄 설명과 그대로 붙여넣을 수 있는 예시, 그리고 "주의 / 위험" 두 단계 위험 표시를 달았습니다. 커밋하지 않은 변경을 날리거나 이미 공유된 기록을 다시 쓰는 명령어는 한눈에 알아볼 수 있습니다.
세 가지 순간을 겨냥합니다. 무엇을 해야 하는지는 기억나는데 명령어 철자가 생각나지 않을 때("커밋 취소", "원격 브랜치 삭제"를 검색), 명령어는 알지만 뭔가 잃을지 확신이 서지 않을 때(위험 등급과 비고를 확인), 그리고 Git을 처음 접해 add, commit, push 사이에서 무엇이 옮겨 다니는지 알고 싶을 때(맨 위의 네 영역 그림과 아래 조작 도식을 보면 됩니다)입니다.
페이지 아래에는 순수 메모리로 돌아가는 Git 시뮬레이션 터미널이 있습니다. 30여 개의 주요 하위 명령어를 지원하고 오른쪽 커밋 그래프가 명령어마다 실시간으로 바뀌며, "첫 커밋"부터 "병합 충돌 해결"까지 10개의 연습 단계가 붙어 있습니다. 진짜 Git이 아니고 여러분의 컴퓨터나 네트워크에 접근하지도 않지만, 의미 체계는 공식 매뉴얼대로 구현했으니 연습한 내용을 실제 장비로 그대로 옮길 수 있습니다.
검색창에 "커밋 취소"를 넣으면 "되돌리기와 취소" 그룹에서 이런 항목이 나옵니다(발췌):
시뮬레이션 터미널에서 4번 단계 "최근 커밋을 취소하되 변경은 유지"를 푸는 과정:
git reset --soft HEAD~1 최근 커밋을 취소하고 변경은 스테이징에 유지 주의
git reset HEAD~1 최근 커밋을 취소하고 변경은 워킹 트리로(미스테이징)
git reset --hard <commit> 브랜치 포인터·인덱스·워킹 트리를 모두 commit으로 위험
git revert <commit> 변경을 상쇄하는 커밋을 새로 만들어 기록은 그대로, 푸시해도 안전user@toolun-lab:~/project (main)$ git log --oneline
7f3a1c2 (HEAD -> main) wip: 엉망인 커밋
2b9e0d4 init: add README
user@toolun-lab:~/project (main)$ git reset --soft HEAD~1
HEAD is now at 2b9e0d4 init: add README
--soft: 브랜치 포인터만 이동하고 인덱스와 워킹 트리는 유지(취소된 커밋 내용은 스테이징 상태)
팁: 버려진 커밋 7f3a1c2는 git reflog로 여전히 되찾을 수 있습니다
user@toolun-lab:~/project (main)$ git status -s
A app.js
A secret.env
✔ 통과: 최근 커밋을 취소하되 변경은 유지.거의 모든 Git 명령어는 "내용을 한 영역에서 다른 영역으로 옮긴다"로 읽을 수 있습니다. 워킹 트리는 눈에 보이고 편집할 수 있는 파일이고, 스테이징 영역(인덱스)은 "다음 커밋이 어떤 모습일지" 적어 둔 목록이며, 로컬 저장소(.git)는 모든 커밋을 보관하고, 원격 저장소는 다른 기계에 있는 같은 한 벌입니다.
이 그림을 이해하면 "어떻게 되돌리지"라는 질문 상당수가 하나의 답으로 정리됩니다. 잘못 고쳤는데 아직 add하지 않았다면 git restore <file>로 스테이징 영역에서 되가져오고, add했지만 커밋하고 싶지 않다면 git restore --staged, 커밋까지 했다면 git reset, 이미 푸시했다면 git revert로 반대 커밋을 덧붙이는 방법밖에 없습니다.
커밋 객체는 디렉터리 트리 전체의 스냅숏(차이가 아님), 부모 커밋의 id, 작성자와 시각, 설명을 기록합니다. 이 내용을 SHA-1(새 저장소는 SHA-256 선택 가능)로 해시해 커밋 id를 만들기 때문에, 설명 한 글자만 바뀌어도 완전히 새로운 id가 나옵니다. --amend, rebase, cherry-pick이 모두 "기록을 다시 쓰는" 이유가 여기 있습니다. 새 커밋을 만들 뿐이고 옛 커밋은 더 이상 참조되지 않을 뿐입니다.
브랜치는 .git/refs/heads/<name>에 있는 40자짜리 파일이고 내용은 어떤 커밋의 id입니다. HEAD는 보통 브랜치 이름을 가리킵니다. 그래서 브랜치를 만드는 일은 순식간이고(작은 파일 하나 쓰기), 브랜치를 바꾸는 일은 HEAD를 다른 이름으로 돌리고 워킹 트리를 그 커밋의 스냅숏으로 갱신하는 것이며, 브랜치 삭제는 포인터 하나를 지우는 일이라 커밋 자체가 곧바로 사라지지는 않습니다.
merge는 있었던 일을 충실히 남깁니다. 두 줄기가 병합 커밋에서 만나고, 이 기능이 병행 개발됐다는 걸 누구나 알 수 있습니다. rebase는 기록이 처음부터 직선이었던 것처럼 보이게 합니다. git log는 읽기 쉬워지고 git bisect는 쓰기 편해지지만, 대가로 커밋 id가 전부 바뀝니다. 경험칙은 이렇습니다. 푸시하지 않은 내 브랜치는 마음껏 rebase하고, 남이 기반으로 삼을 수 있는 브랜치는 merge만 하세요. git pull --rebase는 이 규칙을 매일 적용하는 방법으로, 로컬의 푸시되지 않은 커밋 몇 개를 원격 최신 위로 옮겨 "Merge branch 'main' of …" 커밋이 쌓이는 걸 막습니다.
--soft는 "커밋 쪼개기 / 합치기"에 어울립니다. 포인터만 돌아가고 내용은 스테이징에 남습니다. --mixed(기본값)는 "무엇을 커밋할지 다시 고르기"에 맞습니다. --hard는 진짜 버리기입니다. 워킹 트리에서 커밋한 적 없는 변경은 어떤 방법으로도 되찾을 수 없는 반면, 취소된 커밋은 객체 저장소에 그대로 남아 있습니다. git reflog가 HEAD의 이동을 모두 보여 주고, git reset --hard HEAD@{1}로 reset 직전으로 돌아갈 수 있습니다. 기본적으로 reflog는 90일(도달 불가 항목은 30일)을 보관하니, 이것이 Git이 주는 후회 창구입니다.
"위험"은 두 부류에 붙습니다. 워킹 트리의 커밋되지 않은 내용을 버리는 명령어(restore, reset --hard, clean, stash drop, checkout -- <file>)와, 남이 이미 받았을 수 있는 기록을 다시 쓰는 명령어(push --force, 병합되지 않은 브랜치의 branch -D)입니다. "주의"는 상태를 바꾸지만 되돌릴 수 있거나 영향 범위를 먼저 확인해야 하는 명령어(commit --amend, rebase, merge --squash, push --delete)에 붙습니다. 읽기 전용 명령어(log, diff, status, show, blame)에는 표시가 없습니다.
git switch / git restore는 2.23 이상이 필요하며 예전 표기인 checkout도 함께 실었습니다.hash-object, cat-file, update-ref 등)와 플랫폼 전용 작업(GitHub PR, GitLab MR의 웹 조작)은 넣지 않았습니다.reset 세 모드, 선형 rebase, stash, 원격 푸시·풀)를 구현했고 대화형 rebase, bisect, 서브모듈, 훅과 설정 파일의 모든 옵션은 지원하지 않습니다. 충돌이 난 rebase는 직접 해결하도록 멈추는 대신 자동으로 포기합니다..git을 읽지 않으며, 그래픽 충돌 해결기도 제공하지 않습니다."취소"를 검색하거나 "되돌리기와 취소" 그룹을 열어 "아직 푸시 안 함"(reset / --amend)과 "이미 푸시함"(revert)을 먼저 가른 뒤 명령어를 고릅니다. "자주 쓰는 조합"에는 "main에 커밋했는데 새 브랜치로 옮기고 싶다" 같은 완성된 레시피가 있습니다.
git rebase -i HEAD~N에 squash / fixup / reword를 조합합니다. 도식의 rebase 카드에서 기록이 갈래에서 직선으로 바뀌는 모습과 옛 커밋이 왜 회색이 되는지 볼 수 있습니다.
"원격 협업" 그룹은 remote add부터 push -u, --force-with-lease까지 이어집니다. 연습 터미널 8번(푸시)과 9번(푸시한 커밋 취소) 단계가 가장 흔한 두 번의 "푸시가 안 되는" 순간을 다룹니다.
git reflog, git fsck --lost-found, git stash list가 "되돌리기와 취소"에서 나란히 있고, "실수로 지운 브랜치 되찾기" 레시피는 두 단계면 끝납니다.
커밋이 푸시됐는지 보면 됩니다. 푸시 전이라면 reset으로 포인터를 곧바로 되돌려 기록을 깔끔하게 유지합니다. 이미 푸시했다면 revert로 반대 커밋을 덧붙여 남이 이미 받은 기록을 건드리지 않습니다. 그러지 않으면 다음에 다른 사람이 pull할 때 갈래가 생깁니다.
푸시하지 않은 로컬 커밋이 있고 원격에도 새 커밋이 있어서, 기본 pull이 merge로 양쪽을 합치기 때문입니다. 피하려면 git pull --rebase를 쓰거나 git config --global pull.rebase true를 한 번 설정해 두세요.
--force는 원격 브랜치를 무조건 덮어씁니다. --force-with-lease는 원격 브랜치가 마지막 fetch 때 본 그 커밋인지 먼저 확인하고, 그사이 누가 푸시했다면 거부합니다. "동료 커밋을 덮어썼다" 같은 사고를 문 앞에서 막아 줍니다. 기록을 다시 쓴 뒤의 푸시는 항상 후자를 쓰세요.
진짜 Git의 id는 내용과 작성자, 타임스탬프를 함께 해시해 만듭니다. 시뮬레이터는 실제 시간 대신 논리 시계를 쓰고 결정적 해시를 사용하므로 같은 순서로 조작하면 같은 id가 나오고, 정답과 대조하기가 쉬워집니다. 이 id가 진짜 Git이 계산하는 값과 다른 것은 의도된 것입니다.
명령어 자체는 플랫폼을 가리지 않습니다. 차이는 셸에 있습니다. PowerShell에서 &&는 7.x 버전이 필요하고, 경로는 따옴표로 감싸는 편이 안전하며, 줄바꿈은 "초기화와 설정"의 core.autocrlf 항목에 맞춰 설정하는 게 좋습니다.
이 페이지의 모든 데이터(명령어 표, 도식, 시뮬레이션 터미널)는 페이지와 함께 내려받는 정적 콘텐츠로 브라우저에서 로컬로 돌아갑니다. 검색, 복사, 즐겨찾기, 연습은 서버로 아무 요청도 보내지 않습니다. 즐겨찾기는 이 기기의 localStorage에 저장되고 사이트가 읽을 수 없습니다. 페이지의 외부 링크는 Git 공식 문서를 가리키며, 클릭하면 해당 사이트가 처리합니다.
2026-09-09 업데이트
Git 명령 149개를 상황별로 분류, 각 항목에 설명·예시·위험도를 제공. 검색, 원클릭 복사, 즐겨찾기 지원, 동작 다이어그램과 연습용 시뮬 터미널 포함
이 도구는 아직 완전히 번역되지 않아 일부 내용이 원문 또는 대체 언어로 표시됩니다.
git init git init -b main # 초기 브랜치 이름을 지정합니다.
git clone https://github.com/git/git.git git clone git@github.com:user/repo.git my-dir
git clone --depth 1 --branch v2.0 https://github.com/user/repo.git
git clone -b develop https://github.com/user/repo.git
git config --global user.name "Zhang San" git config --global user.email "zs@example.com"
git config user.email "me@company.com"
git config --list --show-origin git config --get user.name
git config --global core.autocrlf input
git config --global alias.lg "log --oneline --graph --all" git lg
Windows에는 일반적으로 관리자가 함께 제공됩니다. macOS는 보안 강화를 위해 osxkeychain을 사용합니다.
git help rebase git Reset -h # 짧은 사용법
git status git status -s # 짧은 형식: M 수정 A 추가 D 삭제 ?? 추적되지 않음
git add src/app.js git add src/ # 전체 디렉토리 git add "*.md" # 와일드카드
git add -A git add -u # 새 파일을 제외하고 추적된 파일의 임시 변경 및 삭제만 저장됩니다.
git add -p src/app.js # y 이 조각을 임시로 저장합니다. n 건너뛰기 s 더 작은 조각으로 분할 q 종료
git commit -m "fix: 올바른 로그인 시간 초과 판단"
git commit -am "docs: update readme"
커밋하고 싶지 않은 변경 사항을 가져오는 것은 쉽습니다. 커밋하기 전에 git status를 실행하세요.
git add forgotten.js git commit --amend --no-edit #파일을 추가하지만 설명은 변경하지 않음 git commit --amend -m "새 설명"
새로운 커밋 ID를 생성합니다. 이미 푸시된 커밋은 수정하지 마십시오. 그렇지 않으면 푸시해야 합니다.
git diff git diff src/app.js # 하나의 파일만 보기
git diff --staged
git diff main feature git diff HEAD~3 HEAD -- src/ git diff main...feature # 분기점에 따른 기능 변경
git diff --stat HEAD~1
git diff --word-diff=color README.md
git log git log -5 # 마지막 5개 항목 git log --oneline # 한 줄에 한 줄씩
git log --oneline --graph --all --decorate
git show HEAD git show a1b2c3d --stat git show HEAD:src/app.js # 특정 버전의 파일 내용 보기
git rm old.txt git rm -r legacy/
git rm --cached .env echo ".env" >> .gitignore
git mv utils.js helpers.js
git branch git Branch -a # 원격 브랜치를 포함합니다. git Branch -vv # 최신 커밋 및 추적 관계 포함
git branch feature/login git Branch hotfix a1b2c3d # 지정된 커밋에서 생성
git switch main git 스위치 - # 이전 분기로 돌아갑니다.
git switch -c feature/search git switch -c hotfix Origin/main # 원격 분기 기반
git checkout -b release/1.2
git branch -m master main git push -u origin main && git push origin --delete master
git branch -d feature/login
git branch -D experiment
브랜치의 고유 커밋은 고아가 되며 단기적으로 reflog를 사용하여 검색할 수 있습니다.
git branch --merged main git Branch --no-merged # 반대로
git branch -u origin/feature/login
git branch -a --contains a1b2c3d
git checkout v1.0 git switch -c fix-from-v1 # 변경 사항을 유지하려면 여기에 분기를 만드세요.
이 상태의 커밋은 어떤 지점에도 속하지 않으며 잘린 후 쉽게 손실됩니다.
git branch --sort=-committerdate | head
git fetch -p git remote prune origin
git switch main git merge feature/login
git merge --no-ff feature/login
git merge --squash feature/login git commit -m "feat: login"
git merge --abort
git add src/app.js git commit #기본 설명 브랜치 병합...
git checkout --theirs package-lock.json git add package-lock.json
리베이스하면 우리/그들의 의미가 반전됩니다. 즉, 우리의 것이 리베이스되는 브랜치입니다.
git switch feature git rebase main
이동된 모든 커밋 ID가 변경됩니다. 푸시된 브랜치와 누군가 작업 중인 브랜치를 리베이스해서는 안 됩니다.
git rebase -i HEAD~3 # 선택 유지 단어 변경 설명 스쿼시 이전 항목으로 병합 수정 병합 및 설명 손실 drop 삭제
git add . git rebase --continue
git rebase --abort
git rebase --onto main server client
"지점이 엉뚱한 곳에 개설된" 상황에 적합합니다.
git commit --fixup a1b2c3d git rebase -i --autosquash a1b2c3d~1
git cherry-pick a1b2c3d git Cherry-pick a1b2c3d..e5f6g7h # A 범위(a1b2c3d 제외)
git cherry-pick -n a1b2c3d
git config --global merge.tool vscode git config --global mergetool.vscode.cmd "code --wait $MERGED" git mergetool
git restore src/app.js 자식 복원 . # 전체 디렉토리
스테이지되지 않은 변경 사항은 직접 손실되며 Git을 사용하여 검색할 수 없습니다.
git restore --staged src/app.js git Reset HEAD src/app.js #오래된 작성 방식
git restore --source HEAD~2 config.yml git restore --source v1.0 -- src/
git reset --soft HEAD~1 git commit -m "더 적절한 설명"
git reset HEAD~1
git Reset --hard HEAD~1 # 마지막 커밋을 버림 git Reset --hard Origin/main # 정확히 원격과 동일
작업공간 변경은 되돌릴 수 없습니다. 커밋된 항목은 git reflog를 사용하여 검색할 수 있습니다.
git reset package-lock.json
git revert HEAD git revert a1b2c3d --no-edit
git revert --no-commit HEAD~3..HEAD git commit -m "revert last 3 commits"
git revert -m 1 f00ba12
병합을 실행 취소한 후 동일한 분기에 병합하기 전에 이 되돌리기를 되돌려야 합니다.
git reflog
git Reset --hard HEAD@{2} # 2단계 이전 상태로 돌아갑니다.
git Branch Rescue a1b2c3d # 고아 커밋을 위한 브랜치를 생성합니다git clean -n # 삭제될 내용 미리보기 git clean -fd # 실행 git clean -fdx # .gitignore에서 무시된 항목(예: node_modules)도 삭제합니다.
git checkout -- src/app.js
git fsck --lost-found git show <dangling-commit-id>
git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk
git remote -v
git remote add origin git@github.com:user/repo.git
git remote set-url origin git@github.com:user/repo.git
git remote rename origin upstream
git remote remove upstream
git fetch git fetch origin main git fetch --all --prune
git pull git pull origin main
git pull --rebase origin main
git push git push origin main
git push -u origin feature/login
git push origin --delete feature/old git push Origin --delete v0.1 # 원격 태그도 삭제할 수 있습니다.
git push --force-with-lease origin feature/login
--force보다 우선적으로 이것을 사용하십시오.
git push -f origin feature/login
다른 사람이 푸시한 커밋은 삭제됩니다. 공유 지점은 금지됩니다.
git push --all origin
git ls-remote --heads origin git ls-remote --tags https://github.com/git/git.git
git remote add upstream https://github.com/original/repo.git git fetch upstream git switch main && git merge upstream/main
git pull --ff-only
git stash git stash push -m "로그인 페이지가 반쯤 완성되었습니다"
git stash -u git stash -a # 무시된 파일도 수집
git stash list
git stash pop
git stash pop stash@{2}git stash apply stash@{1}git stash show -p stash@{0}git stash drop stash@{0}
git stashclear # 모두 삭제git stash branch fix-from-stash stash@{0}git stash push -m "스타일만 접기" -- src/styles/
git tag git tag -l "v1.*" # 패턴으로 필터링
git tag -a v1.2.0 -m "Release 1.2.0"
git tag build-2026-09-09
git tag -a v1.1.1 a1b2c3d -m "메이크업"
git show v1.2.0
git tag -d v1.2.0
git push origin --delete v1.2.0
git describe --tags --always
git submodule add https://github.com/user/lib.git vendor/lib
git submodule update --init --recursive
git clone --recurse-submodules https://github.com/user/repo.git
git submodule update --remote vendor/lib git add vendor/lib && git commit -m "bump lib"
git submodule status
git submodule deinit -f vendor/lib git rm -f vendor/lib rm -rf .git/modules/vendor/lib
git worktree add ../repo-hotfix hotfix/1.2.1 git worktree add -b review ../repo-review origin/pr-42
git worktree list
git worktree remove ../repo-hotfix git worktree prune # 수동으로 삭제된 디렉토리 등록 정리
git clone --filter=blob:none --sparse <url> cd repo && git sparse-checkout set apps/web packages/ui
git log -p -- src/app.js git log --follow -- src/app.js # 상호 이름 변경 추적
git log --grep="로그인" -i --oneline
git log -S"validateToken" --oneline git log -G"regex" --oneline # 일반 버전
git log main..feature --oneline git log Origin/main..HEAD # 아직 푸시되지 않은 커밋
git log --pretty=format:"%h %ad %an %s" --date=short -10
git log --since="2026-09-01" --until="2026-09-09" --oneline
git shortlog -sn --all --no-merges
git blame -L 40,60 src/app.js git 비난 -w -C src/app.js # 공백을 무시하고 이동을 추적합니다.
git bisect start git bisect bad # 현재 불량 git bisect good v1.1.0 # 이 버전은 좋음 # 반복적으로 테스트하고 git bisect good/bad를 실행합니다. git bisect reset
git bisect run npm test
git grep -n "TODO" -- "*.ts" git grep "foo" v1.0 # 특정 버전에서 검색
git show HEAD~5:src/config.js > old-config.js
git diff --name-only HEAD~3 HEAD git diff --name-status main # M/A/D 상태
git count-objects -vH
git gc --aggressive --prune=now
prune은 실제로 연결할 수 없는 개체를 삭제하고 reflog의 후회약도 함께 사라집니다.
git rev-parse --short HEAD git rev-parse --abbrev-ref HEAD git rev-parse --show-toplevel # 저장소 루트 디렉터리
git archive -o release.zip v1.2.0 git archive HEAD src/ | tar -x -C /tmp/out
# .gitignore node_modules/ dist/ *.log .env* !.env.example
git check-ignore -v dist/app.js
git rm -r --cached . git add . git commit -m "chore: apply .gitignore"
echo ".DS_Store" >> ~/.gitignore_global git config --global core.excludesFile ~/.gitignore_global
git update-index --skip-worktree config/local.php git update-index --no-skip-worktree config/local.php # 취소
* text=auto *.sh text eol=lf *.png binary *.psd filter=lfs diff=lfs merge=lfs -text
git lfs install git lfs track "*.psd" git add .gitattributes
여러 명령을 '이걸 하고 싶다'는 레시피로 묶은 것입니다. 펼치면 통째로 복사할 수 있습니다.
커밋이 너무 빨랐습니다 / 설명이 잘못 작성되었습니다 / 커밋을 2개로 분할하고 싶습니다(아직 푸시되지 않았습니다)
git reset --soft HEAD~1커밋 및 철회, 변경사항은 아직 준비 영역에 있습니다.git status파일이 모두 "커밋할 변경 사항"에 있는지 확인하세요.git commit -m "새 설명"다른 사람들이 이미 그것을 가져갔을 수도 있고, 역사는 다시 쓸 수 없습니다.
git revert <commit>역방향 커밋 생성git push로컬 실험이 엉망이 되어 특정 커밋으로 완전히 돌아가고 싶습니다.
git log --oneline대상 커밋 ID 찾기git stash -u(선택사항) 먼저 유지하려는 변경사항을 접습니다.git reset --hard <commit>지점 개설하는 것을 잊어버리고 N번 커밋했습니다.
git branch feature/x현재 위치에 브랜치를 생성합니다(이 커밋을 "저장").git reset --hard origin/main메인이 원격 상태로 복귀git switch feature/xPR 오픈 전 히스토리 정리 (다른 사람이 사용하지 않는 브랜치)
git rebase -i HEAD~4다음 줄의 선택을 스쿼시 또는 수정으로 변경하세요.git push --force-with-lease분기가 푸시된 경우에만 필요합니다.main에는 새로운 커밋이 있고 그 위에 기능 분기가 계속되어야 합니다.
git fetch origingit switch feature/xgit rebase origin/main또는 git merge Origin/main (병합 커밋 유지)기본 지점 이름 통합
git branch -m master maingit push -u origin maingit push origin --delete master먼저, 호스팅 플랫폼에서 기본 분기를 기본 분기로 잘라냅니다.git Branch -D 이후에 유용하다고 생각했습니다.
git reflog브랜치의 마지막 커밋 ID를 찾습니다(예: "commit: xxx")git branch <name> <commit-id>.env 또는 수백 MB 파일이 기록에 입력됨
git rm --cached .env && echo ".env" >> .gitignore최신 커밋만 이루어진 경우: git commit --amendgit filter-repo --path .env --invert-paths이미 깊은 역사: git-filter-repo로 모든 기록을 다시 작성합니다(별도 설치 필요)git push --force-with-lease --all모든 협력자는 다시 복제되어야 합니다. 유출된 키는 무효화하고 재발행해야 합니다.메인에서 수정된 버그도 release/1.2로 이동됩니다.
git switch release/1.2git cherry-pick <commit>git pushgit 병합/풀 보고서 충돌
git status어떤 문서가 "양 당사자에 의해 수정"되었는지 확인하세요.code <file>올바른 콘텐츠를 유지하면서 편집기에서 <<<<<<< ======= >>>>>>> 태그를 처리합니다.git add <file>각 항목을 수정한 후 하나씩 추가하세요.git commit리베이스할 때 git rebase --continue먼저 로컬에서 코드를 작성한 다음 GitHub에 웨어하우스를 구축했습니다.
git init -b main && git add -A && git commit -m "init"git remote add origin git@github.com:user/repo.gitgit push -u origin main원은 커밋, 화살표는 부모 커밋을 가리킵니다. 초록색 라벨은 브랜치, 보라색은 HEAD가 있는 브랜치입니다. 회색 원은 어떤 브랜치에서도 참조되지 않는 커밋(reflog로 복구 가능)이고, 채워진 원은 이번 작업으로 새로 생성된 커밋입니다.
git add . && git commit -m "…"각 커밋은 자신의 부모 커밋을 기억합니다. 브랜치는 커밋을 가리키는 이동 가능한 포인터일 뿐이며, 커밋하면 main과 HEAD가 함께 이동합니다.
git switch -c feature새 브랜치와 main은 같은 커밋을 가리키므로 브랜치 생성은 즉시 끝납니다. 이후 feature에서 커밋하면 feature만 앞으로 나아갑니다.
git switch main && git merge feature새 커밋이 생기지 않고 기록은 일직선으로 유지됩니다. 여기에 브랜치가 있었다는 흔적을 남기려면 --no-ff를 사용하세요.
git merge featureGit은 공통 조상 b2를 찾아 b2 기준 양쪽의 변경 사항을 합치고, 부모 커밋이 두 개인 m6를 만듭니다. 같은 부분을 다르게 변경한 경우에만 충돌이 발생합니다.
git switch feature && git rebase main기록은 일직선이 되지만 c3와 d4는 새 커밋 c3′와 d4′로 대체됩니다 (id가 바뀝니다). 이미 push한 브랜치는 rebase하지 마세요. 그렇지 않으면 다른 사람의 기록과 충돌합니다.
git reset --hard HEAD~1--soft는 포인터만 이동합니다. --mixed는 스테이징 영역도 비웁니다. --hard는 작업 트리까지 되돌립니다. 고아가 된 커밋 c3는 reflog에서 복구할 수 있습니다 (기본적으로 30일 이상 보관).
git revert HEADc3는 기록에 남고, 새 커밋 r4의 내용은 c3의 변경을 반대로 되돌린 것입니다. 이미 push한 커밋을 취소할 때는 reset 대신 revert를 사용하세요.
git cherry-pick x7x7이 부모 커밋 대비 도입한 변경을 main 위에 다시 적용해 내용은 같고 id는 다른 x7′를 만듭니다. 특정 수정 사항만 릴리스 브랜치로 가져갈 때 적합합니다.
순수하게 메모리에서만 동작하는 Git 시뮬레이터입니다 (실제 Git이 아니며 네트워크에도 연결되지 않습니다): init / add / commit / branch / switch / merge / rebase / reset / revert / stash / tag / remote / push / pull 등 자주 쓰는 서브커맨드를 지원하고, 오른쪽 커밋 그래프가 실시간으로 갱신됩니다. 10개 레벨은 “첫 커밋”부터 “병합 충돌 해결”까지입니다. Linux 명령어 연습은Linux 명령어 모음.