์ผ๋ฐ˜

Git Reflog

ํŒŒ๊ดด์ ์ธ ์ž‘์—…์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Git ์ผ์ง€

  • #git
  • #workflow
  • #log

Git reflog๋Š” ์ปค๋ฐ‹ ์‚ญ์ œ๋‚˜ ๊ฐ•์ œ ๋ฆฌ์…‹ ๊ฐ™์€ ํŒŒ๊ดด์ ์ธ ์ž‘์—…์„ ํฌํ•จํ•˜์—ฌ ์ €์žฅ์†Œ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋กํ•˜๋Š” Git์˜ ์ผ์ง€/๊ฐ์‚ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

ํ•œ๊ตญ์–ด ์‹ค๋ ฅ์ด ๋ถ€์ ํ•˜์—ฌ ์ด ๊ธ€์ด ๊ตฌ๊ธ€ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ •ํ™•ํ•œ ๋ฌธ๋ฒ•๊ณผ ์–ดํœ˜๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฌ๋ฉฐ, ์ถ”ํ›„์— ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ญ์ œ๋œ ์ปค๋ฐ‹ ๋ณต๊ตฌํ•˜๊ธฐ

์ด ์„น์…˜์€ Git ๋กœ๊ทธ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ญ์ œ๋œ ์ปค๋ฐ‹์„ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

git log --oneline

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋กœ๊ทธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

30b387b (HEAD -> master) feat: Add paths
b786463 feat: Write source code
44927b6 feat: Add increment age
9c98d0a docs: Include README
cf456d2 feat: Use variables
cb4ca4b initial

๊ทธ ๋‹ค์Œ ์ปค๋ฐ‹๋“ค์ด ๋” ์ด์ƒ ๊ด€๋ จ์„ฑ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ 44927b6 feat: Add increment age๋กœ ๋ฆฌ์…‹ํ•ฉ๋‹ˆ๋‹ค.

git reset --hard 44927b6

์ด์ œ ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

44927b6 (HEAD -> master) feat: Add increment age
9c98d0a docs: Include README
cf456d2 feat: Use variables
cb4ca4b initial

๊ทธ๋Ÿฐ๋ฐ ๋‚˜์ค‘์— ์ด ์ปค๋ฐ‹๋“ค์ด ์‹ค์ œ๋กœ๋Š” ์ค‘์š”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๋ณต๊ตฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๋•Œ git reflog๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

git reflog

์ด๊ฒƒ์ด reflog ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €์žฅ์†Œ์—์„œ ์ผ์–ด๋‚œ ๋ชจ๋“  ์ž‘์—…์˜ ์™„์ „ํ•œ ๊ฐ์‚ฌ ์ถ”์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

44927b6 (HEAD -> master) HEAD@{0}: reset: moving to 44927b6
30b387b HEAD@{1}: commit: feat: Add paths
b786463 HEAD@{2}: commit: feat: Write source code
44927b6 (HEAD -> master) HEAD@{3}: rebase (finish): returning to refs/heads/master
44927b6 (HEAD -> master) HEAD@{4}: rebase (pick): feat: Add increment age
9c98d0a HEAD@{5}: rebase (reword): docs: Include README
c669e31 HEAD@{6}: rebase: fast-forward
cf456d2 HEAD@{7}: rebase (start): checkout HEAD~2
9b38d32 HEAD@{8}: commit: feat: Add increment age
c669e31 HEAD@{9}: commit: readme
cf456d2 HEAD@{10}: rebase (finish): returning to refs/heads/master
cf456d2 HEAD@{11}: rebase (start): checkout HEAD~1
cf456d2 HEAD@{12}: rebase (finish): returning to refs/heads/master
cf456d2 HEAD@{13}: rebase (start): checkout HEAD~1
cf456d2 HEAD@{14}: commit: feat: Use variables
cb4ca4b HEAD@{15}: commit (initial): initial

์ด ๊ฒฝ์šฐ ๋ณต๊ตฌํ•˜๋ ค๋Š” ์ปค๋ฐ‹์˜ ํ•ด์‹œ 30b387b๋ฅผ ์–ป์—ˆ๊ณ  ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ์ปค๋ฐ‹๋“ค์„ ํฌํ•จํ•œ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

git branch chore/restore-commits 30b387b

๊ทธ๋Ÿฌ๋ฉด ์ปค๋ฐ‹๋“ค์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

30b387b (HEAD -> chore/restore-commits) feat: Add paths
b786463 feat: Write source code
44927b6 (master) feat: Add increment age
9c98d0a docs: Include README
cf456d2 feat: Use variables
cb4ca4b initial

์‚ญ์ œ๋œ ๋ธŒ๋žœ์น˜ ๋ณต๊ตฌํ•˜๊ธฐ

์œ„์—์„œ ๋งŒ๋“  ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค.

7f6fe3e (HEAD -> chore/restore-commits) feat: Add filename to path for source
30b387b feat: Add paths
b786463 feat: Write source code
44927b6 (master) feat: Add increment age
9c98d0a docs: Include README
cf456d2 feat: Use variables
cb4ca4b initial

master ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒํ•œ ํ›„ ์‹ค์ˆ˜๋กœ ์ƒˆ ์ปค๋ฐ‹๋“ค์ด ์žˆ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

git branch -D chore/restore-commits

์ด์ œ reflog๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

44927b6 (HEAD -> master) HEAD@{0}: checkout: moving from chore/restore-commits to master
7f6fe3e HEAD@{1}: commit: feat: Add filename to path for source
30b387b HEAD@{2}: checkout: moving from master to chore/restore-commits
44927b6 (HEAD -> master) HEAD@{3}: reset: moving to 44927b6
30b387b HEAD@{4}: commit: feat: Add paths
b786463 HEAD@{5}: commit: feat: Write source code
44927b6 (HEAD -> master) HEAD@{6}: rebase (finish): returning to refs/heads/master
44927b6 (HEAD -> master) HEAD@{7}: rebase (pick): feat: Add increment age
9c98d0a HEAD@{8}: rebase (reword): docs: Include README
c669e31 HEAD@{9}: rebase: fast-forward
cf456d2 HEAD@{10}: rebase (start): checkout HEAD~2
9b38d32 HEAD@{11}: commit: feat: Add increment age
c669e31 HEAD@{12}: commit: readme
cf456d2 HEAD@{13}: rebase (finish): returning to refs/heads/master
cf456d2 HEAD@{14}: rebase (start): checkout HEAD~1
cf456d2 HEAD@{15}: rebase (finish): returning to refs/heads/master
cf456d2 HEAD@{16}: rebase (start): checkout HEAD~1
cf456d2 HEAD@{17}: commit: feat: Use variables
cb4ca4b HEAD@{18}: commit (initial): initial

๋‘ ๋ฒˆ์งธ ์ค„์— ๋ธŒ๋žœ์น˜๊ฐ€ ์‚ญ์ œ๋˜์–ด ์†์‹ค๋œ ์ปค๋ฐ‹์ด ์žˆ์Œ์„ ์ฃผ๋ชฉํ•˜์„ธ์š”. ์ด ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ธŒ๋žœ์น˜๋„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

git branch chore/restored-branch 7f6fe3e
git checkout chore/restored-branch

๋‹คํ–‰ํžˆ ์†์‹ค๋œ ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7f6fe3e (HEAD -> chore/restored-branch) feat: Add filename to path for source
30b387b feat: Add paths
b786463 feat: Write source code
44927b6 (master) feat: Add increment age
9c98d0a docs: Include README
cf456d2 feat: Use variables
cb4ca4b initial

์ฐธ๊ณ 

git-reflog.https://git-scm.com/docs/git-reflog
Macy, N. Git Reflog To The Rescue.https://www.neilmacy.co.uk/blog/git-reflog/