Published on

git - reflog

๐Ÿ”„ Git reflog

Git์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์‹ค์ˆ˜๋กœ ์ปค๋ฐ‹์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, reset --hard, rebase ๋“ฑ์˜ ๋ช…๋ น์–ด๋กœ ์ธํ•ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ž‘์—… ์ด๋ ฅ์„ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๋ช…๋ น์–ด๊ฐ€ ๋ฐ”๋กœ git reflog.


๐Ÿ“Œ git reflog๋ž€?

git reflog๋Š” ๋‚ด ๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ HEAD๊ฐ€ ์ด๋™ํ•œ ๋ชจ๋“  ๊ธฐ๋ก์„ ์ถ”์ ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

  • git log๋Š” ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ์ด๋ ฅ๋งŒ ๋ณด์—ฌ์ฃผ์ง€๋งŒ
  • git reflog๋Š” ๋ธŒ๋žœ์น˜ ์ด๋™, ์ปค๋ฐ‹, reset, merge, rebase ๋“ฑ HEAD๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ํ”์ ์„ ๋ณด์—ฌ์ค€๋‹ค

๐Ÿ‘‰ ์ฆ‰, Git ๋‚ด๋ถ€ ์ž‘์—… ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋„๊ตฌ๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿง  ์™œ ํ•„์š”ํ•œ๊ฐ€?

์ƒํ™ฉํ•ด๊ฒฐ
reset ํ›„ ์ปค๋ฐ‹ ๋‚ ๋ฆผ์ด์ „ ์ปค๋ฐ‹ ์œ„์น˜ ํ™•์ธ ํ›„ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
rebase ์‹คํŒจrebase ์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
์ปค๋ฐ‹ ๋ฎ์–ด์“ฐ๊ธฐ (--amend)๋ฎ๊ธฐ ์ „ ์ปค๋ฐ‹ ๋˜์‚ด๋ฆฌ๊ธฐ
์ž˜๋ชป๋œ ๋ธŒ๋žœ์น˜ ์ž‘์—…์–ด๋””์„œ๋ถ€ํ„ฐ ์ž‘์—…ํ–ˆ๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅ

๐Ÿ’ป ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

git reflog

or

# ํŠน์ • ๋ธŒ๋žœ์น˜์˜ reflog ๋ณด๊ธฐ
git reflog show {branch-name}

์˜ˆ์‹œ ์ถœ๋ ฅ:

c2f8a7f (HEAD -> main) HEAD@{0}: commit: Fix typo
a7f56d1 HEAD@{1}: reset: moving to HEAD~1
b1c9d9e HEAD@{2}: checkout: moving from feature to main
  • HEAD@{0}: ๊ฐ€์žฅ ์ตœ๊ทผ HEAD ์ƒํƒœ
  • HEAD@{1}: ๊ทธ ์ด์ „ ์ƒํƒœ
  • ์˜ค๋ฅธ์ชฝ ์„ค๋ช…: ์–ด๋–ค ๋™์ž‘์ด ์žˆ์—ˆ๋Š”์ง€ ๋ณด์—ฌ์คŒ

๐Ÿ’ก ์ปค๋ฐ‹ ๋˜์‚ด๋ฆฌ๊ธฐ ์˜ˆ์‹œ

git reset --hard HEAD~1  # ์‹ค์ˆ˜๋กœ ์ปค๋ฐ‹ ์‚ญ์ œ

git reflog  # ์ด์ „ ์ปค๋ฐ‹ SHA ํ™•์ธ
git reset --hard a7f56d1  # ๋˜์‚ด๋ฆฌ๊ธฐ!

๐ŸŽ›๏ธ ์ถœ๋ ฅ ํฌ๋งท ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

๋” ๋งŽ์€ ์ •๋ณด(๋‚ ์งœ, ๋ฉ”์‹œ์ง€ ๋“ฑ)๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด --pretty ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ… ๋‚ ์งœ ํฌํ•จํ•ด์„œ ๋ณด๊ธฐ

git reflog --pretty="%h | %ad | %gs" --date=iso

์ถœ๋ ฅ ์˜ˆ์‹œ:

c2f8a7f | 2024-03-19 20:22:55 +0900 | commit: Fix typo
a7f56d1 | 2024-03-19 20:15:11 +0900 | reset: moving to HEAD~1
ํฌ๋งท ์ฝ”๋“œ์˜๋ฏธ
%h์งง์€ ์ปค๋ฐ‹ ํ•ด์‹œ
%ad์ž‘์„ฑ ๋‚ ์งœ
%gsreflog ์„ค๋ช… (subject)

๐Ÿงช ์œ ์šฉํ•œ alias ๋“ฑ๋ก

git config --global alias.reflogf "reflog --pretty='%h | %ad | %gs' --date=iso"

์ด์ œ git reflogf๋กœ ์ž์ฃผ ์“ฐ๋Š” ํ˜•ํƒœ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


๐Ÿ›‘ ์ฃผ์˜์‚ฌํ•ญ

  • reflog๋Š” ๋กœ์ปฌ ์ €์žฅ์†Œ์—๋งŒ ์กด์žฌ
  • ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์ง€๋‚˜๊ฑฐ๋‚˜ git gc(garbage collection) ์ดํ›„ ์ผ๋ถ€ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ

โœ… ์ •๋ฆฌ

ํ•ญ๋ชฉ๋‚ด์šฉ
์—ญํ• HEAD ์ด๋™ ๊ธฐ๋ก ์ถ”์ 
ํ™œ์šฉ์ปค๋ฐ‹ ๋ณต๊ตฌ, ๋ธŒ๋žœ์น˜ ์ถ”์ , reset/rebase ์‚ฌ๊ณ  ๋ณต๊ตฌ
์ปค์Šคํ„ฐ๋งˆ์ด์ง•--pretty์™€ --date ์˜ต์…˜์œผ๋กœ ์ถœ๋ ฅ ํ˜•์‹ ์กฐ์ • ๊ฐ€๋Šฅ
์‹ค๋ฌด ํŒalias ๋“ฑ๋กํ•ด์„œ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿ’ก git reflog๋Š” "๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ–ˆ์ง€?" ์‹ถ์„ ๋•Œ ์ •๋ง ์œ ์šฉํ•œ ๋ช…๋ น์–ด. ๋˜์‚ด๋ฆด ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ์ปค๋ฐ‹๋„, reflog ๋•๋ถ„์— ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค!