홈 › Git › 03 / 8

되돌리기

섹션 7진행 0 / 8

3. 코드 예제

예제 1: restore 로 작업 트리·스테이징 되돌리기 — 01_undo.sh 발췌

bash
printf 'version=1.0\ndebug=false\ntimeout=30\nretry=BROKEN\n' > config.txt
git diff -- config.txt
git restore config.txt
git diff -- config.txt
echo "level=WARN" >> config.txt   # 예시로 별도 수정 후 add
git add config.txt
git status --short
git restore --staged config.txt
git status --short
text
diff --git a/config.txt b/config.txt
index 1e17be1..ffbec83 100644
--- a/config.txt
+++ b/config.txt
@@ -1,3 +1,4 @@
 version=1.0
 debug=false
 timeout=30
+retry=BROKEN
M  config.txt
 M config.txt

작업 트리만 고쳤을 때는 restore 한 줄로 diff 가 사라집니다. add 까지 했을 때는 --staged 로 스테이징만 먼저 풀고, 작업 트리의 수정은 그대로 남습니다(status 앞자리 공백에서 M 으로 이동).

예제 2: reset --soft / --mixed / --hard 비교 — 01_undo.sh 발췌

bash
for mode in soft mixed hard; do
  echo "--- reset --$mode ---"
  git reset --$mode HEAD~1
  git log --oneline
  git status --short
  cat config.txt
done
text
--- reset --soft ---
88807da C2: debug 옵션 추가
2985167 C1: config.txt 추가
M  config.txt
version=1.0
debug=false
timeout=30
--- reset --mixed ---
88807da C2: debug 옵션 추가
2985167 C1: config.txt 추가
 M config.txt
version=1.0
debug=false
timeout=30
--- reset --hard ---
88807da C2: debug 옵션 추가
2985167 C1: config.txt 추가
version=1.0
debug=false

세 모드 모두 HEAD 와 로그는 C2 로 이동합니다. status 의 M 위치(스테이징 M 또는 작업 트리 M)와 config.txt 내용(timeout=30 이 남는지 사라지는지)으로 세 모드의 차이가 그대로 드러납니다.

예제 3: amend·revert(단일·병합 커밋) — 01_undo.sh 발췌

bash
echo "extra=1" >> config.txt
git add config.txt
git commit -q --amend -m "C4: retries 옵션 추가 (설명 보강)"
git log --oneline -1

git revert --no-edit HEAD
git log --oneline -1

git merge --no-ff -m "Merge feature/notify" feature/notify
git revert --no-edit -m 1 HEAD
text
e3a817b C4: retries 옵션 추가 (설명 보강)
cdde8de Revert "C4: retries 옵션 추가 (설명 보강)"
Merge made by the 'ort' strategy.
[main 00dcaa6] Revert "Merge feature/notify"
 1 file changed, 1 deletion(-)

amend 는 커밋 개수를 늘리지 않고 마지막 커밋만 바꿉니다. revert 는 반대로 새 커밋을 쌓아 취소하고, 병합 커밋을 되돌릴 때는 -m 1 로 main 쪽을 기준 부모로 지정합니다.

예제 4: stash·reflog — 01_undo.sh 발췌

bash
git stash push -q -m "wip1: debug 임시 켜기"
git stash push -q -u -m "wip2: timeout 조정 + 새 파일"
git stash list
git stash apply -q stash@{1}
git stash drop -q stash@{1}
git stash pop -q

git reset --hard HEAD~1
git log --oneline -1
git reflog -3
git reset --hard HEAD@{1}
git log --oneline -1
text
stash@{0}: On main: wip2: timeout 조정 + 새 파일
stash@{1}: On main: wip1: debug 임시 켜기
00dcaa6 Revert "Merge feature/notify"
45d95af Merge feature/notify
45d95af HEAD@{0}: reset: moving to HEAD~1
6177f63 HEAD@{1}: commit: C5: 실수로 만든 임시 커밋
00dcaa6 HEAD@{2}: reset: moving to HEAD
6177f63 C5: 실수로 만든 임시 커밋

reset --hard 로 C5 가 로그에서 사라진 뒤, reflog 의 HEAD@{1} 이 사라지기 직전 위치를 가리킵니다. 그 지점으로 다시 reset --hard 하면 C5 가 그대로 돌아옵니다.