[Git] git revert, git reset ์ฐจ์ด์ ๋ฐ HEAD ๋ถ๋ฆฌ
TL;DR
- reset : ํ์ฌ ๋ธ๋์น๋ฅผ ์ง์ ํ ์ปค๋ฐ์ผ๋ก ์ด๋. ๊ทธ ์ดํ์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ ์ญ์
- revert : ์ปค๋ฐ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ๋ ์๋ก์ด ์ปค๋ฐ ์์ฑ. ๊ธฐ์กด ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ ์ ์ง
HEAD ๋ฐฐ๊ฒฝ์ง์
Git Branch ํ์ต/์ฐ์ตํ๊ธฐ ์ข์ ์ฌ์ดํธ โผ
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
learngitbranching.js.org
HEAD๋ ํ์ฌ ๋ธ๋์น ์์ ํธ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ์ปค๋ฐ์ ๊ฐ๋ฆฌํจ๋ค(ํ์ฌ ์์ ์ค์ธ ์ปค๋ฐ).HEAD๋ฅผ ๋ธ๋์น ๋์ ์ปค๋ฐ์ ๋ถ์ด๋ ๊ฒ์HEAD ๋ถ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.^(์บ๋ฟ) ์ฐ์ฐ์๋ ์๋์ฐธ์กฐ ๊ธฐ๋ฅ์ผ๋ก, ํ ๋จ๊ณ ์(๋ถ๋ชจ) ์ปค๋ฐ์ผ๋ก ์ด๋ํ ๋ ์ฌ์ฉํ๋ค.
git checkout bugFix^ # bugFix ์ปค๋ฐ์ ๋ถ๋ชจ๋ก ์ด๋(HEAD ๋ถ๋ฆฌ)
git checkout HEAD^ # ํ์ฌ ์ปค๋ฐ์ ๋ถ๋ชจ๋ก ์ด๋(HEAD ๋ถ๋ฆฌ)
^^๋ฅผ ๋ ๋ฒ ์ฐ๋ฉด “์กฐ๋ถ๋ชจ(๋ถ๋ชจ์ ๋ถ๋ชจ)” ์ปค๋ฐ์ผ๋ก ์ด๋ํ๋ค.- ์ฌ๋ฌ ์ปค๋ฐ ์๋ก ์ด๋ํ ๋
~<num>๋ฌผ๊ฒฐํ(ํธํธ) ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ค. ex)HEAD~3 ^,~๊ฐ์ ์๋ ์ฐธ์กฐ๋-f์ต์ ์ ์ด์ฉํด ๋ธ๋์น๋ฅผ ํน์ ์ปค๋ฐ์ผ๋ก (๊ฐ์ )์ฌ์ง์ ํ ๋ ์ ์ฉํ๋ค.
git branch -f bugFix HEAD~3 # bugFix ๋ธ๋์น๋ฅผ 3๋ฒ ๋ค์ ์ปค๋ฐ์ผ๋ก ์ฌ์ง์
git reset
git reset์ โํผ์ ์ฌ์ฉํ๋ ๋ธ๋์น๋ โorigin์ ์์ง๋ง ์๋ฌด๋ ์ด ๋ธ๋์น๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ ์ด ์์ ๋ ์ฌ์ฉํ๋ค. ๋ค๋ฅธ ์ฌ๋๊ณผ ํจ๊ป ์์
ํ๋ ๋ธ๋์น์์ reset์ ์ฌ์ฉํ๋ฉด ํฌ๊ฒ์ดํธ๊ฐ ์ด๋ฆด ์๋ ์๋ค.
์๋์ฒ๋ผ ์ด 3๋ฒ์ ์ปค๋ฐ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
// log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
console.log('commit3'); // ์ธ๋ฒ์งธ ์ปค๋ฐ
git log --oneline
# 74d1dc1 (HEAD -> master) commit 3
# 0057e3f commit 2
# fa3e214 commit 1
git reset --mixed HEAD^
- ๋ง์ง๋ง commit ์ทจ์
- ๋ณ๊ฒฝ ๋ด์ญ์ unstaged ์ํ๋ก ๋จ์์์
git reset HEAD^์ ๋์ผ
git rest HEAD^ # commit 3์ด ์ญ์ ๋จ
git log --oneline
# 0057e3f (HEAD -> master) commit 2
# fa3e214 commit 1
git status
# Changes not staged for commit:
# modified: revert.js
# no changes added to commit (use "git add" and/or "git commit -a")
# commit 3์ ๋ณ๊ฒฝ ๋ด์ฉ์ด unstaged ์ํ๋ก ๋จ์ ์์
// reset ํ์ log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
console.log('commit3'); // ์ธ๋ฒ์งธ ์ปค๋ฐ
git reset --soft HEAD^
- ๋ง์ง๋ง commit ์ทจ์
- ๋ณ๊ฒฝ ๋ด์ญ์ staged ์ํ๋ก ๋จ์์์
git reset --soft HEAD^ # commit 3์ด ์ญ์ ๋จ
git log --oneline
# 0057e3f (HEAD -> master) commit 2
# fa3e214 commit 1
git status
# Changes to be committed:
# modified: revert.js
# commit 3์ ๋ณ๊ฒฝ ๋ด์ฉ์ด staged ์ํ๋ก ๋จ์ ์์
// reset ํ์ log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
console.log('commit3'); // ์ธ๋ฒ์งธ ์ปค๋ฐ
git reset --hard HEAD^
๐ก ์ปค๋ฐ์ ๋ฌผ๋ก ๋ณ๊ฒฝ ๋ด์ฉ๋ ๊ฐ์ด ์ญ์ ๋๋ฏ๋ก ์ฃผ์
- ๋ง์ง๋ง commit ์ทจ์
- ์ทจ์ํ commit์ ๋ณ๊ฒฝ ๋ด์ญ๋ ์ญ์ ๋จ
git reset --hard HEAD^ # commit 3์ด ์ญ์ ๋จ
git log --oneline
# 0057e3f (HEAD -> master) commit 2
# fa3e214 commit 1
git status
# nothing to commit, working tree clean
# commit 3์ ๋ณ๊ฒฝ ๋ด์ฉ๋ ์ญ์ ๋ผ์ commit 2 ์ํ๋ก ๋์๊ฐ
// reset ํ์ log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
git reset HEAD~n
- ๋ง์ง๋ง
n๊ฐ์ commit ์ทจ์ - ๋ณ๊ฒฝ ๋ด์ญ์ unstaged ์ํ๋ก ๋จ์์์ —
git reset --mixed HEAD^์ ๋์ผ
git reset HEAD~2 # ๋ง์ง๋ง commit 2๊ฐ ์ญ์ (commit 2, commit 3 ์ญ์ )
git log --oneline
# fa3e214 (HEAD -> master) commit 1
git status
# Changes not staged for commit:
# modified: revert.js
# no changes added to commit (use "git add" and/or "git commit -a")
# commit 2 / commit 3์ ๋ณ๊ฒฝ ๋ด์ฉ์ด unstaged ์ํ๋ก ๋จ์ ์์
// reset ํ์ log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
console.log('commit3'); // ์ธ๋ฒ์งธ ์ปค๋ฐ
git reset --option commitHash
์๋์ฒ๋ผ commit hash๋ฅผ ์ง์ ์ ๋ ฅํ๋ฉด ํด๋น commit์ผ๋ก ๋์๊ฐ๊ณ , ๊ทธ ์ดํ์ commit์ ๋ชจ๋ ์ญ์ ๋๋ค.
git reset --mixed a232ba2
# a232ba2 ์ปค๋ฐ์ผ๋ก ๋์๊ฐ๊ณ , ๊ทธ ์ดํ์ ํ๋ ์ปค๋ฐ์ ๋ชจ๋ ์ญ์
git reset --mixed|--soft commitHash- ์ ๋ ฅํ commit์ผ๋ก ๋์๊ฐ๊ณ , ๊ทธ ์ดํ์ commit์ ๋ชจ๋ ์ญ์ ๋จ
- ๋ง์ง๋ง commit ๊น์ง์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ชจ๋ ๋จ์์์
--mixed: unstaged ์ํ--soft: staged ์ํ
git reset --hard commitHash- ์ ๋ ฅํ commit์ผ๋ก ๋์๊ฐ๊ณ , ๊ทธ ์ดํ์ commit์ ๋ชจ๋ ์ญ์ ๋จ
- ๋์๊ฐ commit ์ดํ์ ๋ณ๊ฒฝ ๋ด์ฉ๋ ๋ชจ๋ ์ญ์ ๋จ
git revert
๐ก ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ push ํ ํ ๋ก์ปฌ์์ reset์ ์ด์ฉํด commit์ ์ญ์ ํ ์ํ์์ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ๋ก push ํ ์ ์๋ค. reset ์ด์ ์ํ๋ก ๋๋๋ฆฌ๊ฑฐ๋ --force ์ต์
์ผ๋ก ๋ก์ปฌ commit ์ด๋ ฅ์ ์๊ฒฉ commit ์ด๋ ฅ์ ๋ฎ์ด์จ์ผ ํ๋ค. ํ์ง๋ง ์ฌ๋ฌ ์ฌ๋์ด ์์
ํ๋ ๋ธ๋์น์์ --force ์ต์
์ ์ฌ์ฉํ๋ฉด ํฌ๊ฒ์ดํธ๊ฐ ์ด๋ฆด ์๋ ์์ผ๋ ์ฃผ์ํ๋ค. ํ์
ํ๋ ๋ธ๋์น๋ผ๋ฉด reset์ ์ฌ์ฉํ์ง ์๋ ๊ฒ ์ข๋ค.
commit ์ด๋ ฅ์ ์ญ์ ํ๋ reset๊ณผ ๋ฌ๋ฆฌ revert๋ Revert “...” ํํ๋ก ์ด๋ ฅ์ด ์ถ๊ฐ๋๋ค. ํนํ ์ค๊ฐ์ ์๋ ์ปค๋ฐ ๋ด์ฉ๋ง ์ญ์ ํ๊ณ ์ถ์ ๋ ์ ์ฉํ๋ค. ์ด๋ฏธ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ pushํ ์ํ์ผ ๋๋ revert๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ปค๋ฐ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ ์ญ์ ํ๋์ง์ ๋ํ ์ด๋ ฅ์ ๋จ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์ ์ฐจ์์์ reset๋ณด๋ค ์ข๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
revert๋ฅผ ์ฌ์ฉํ๋ฉด...
- ์ ๋ ฅํ commit์ ๋ณ๊ฒฝ ๋ด์ฉ๋ง ์ญ์ — commit ์ด๋ ฅ์ ๊ทธ๋๋ก ๋จ์ ์์
- commit ๋ณ๊ฒฝ ๋ด์ฉ์ ์ญ์ ํ ์ด๋ ฅ์ด
Revert “...”commit์ผ๋ก ๋จ์
git revert commit2hash # commit 2 ๋ณ๊ฒฝ ๋ด์ฉ ์ญ์
git log --oneline
# 8aaf2a3 (HEAD -> master) Revert "commit 2" -> commit 2 ๋ณ๊ฒฝ ๋ด์ฉ์ ์ญ์ ํ ์ด๋ ฅ์ด ๋จ์
# 3991c6d commit 3
# 49ec5d0 commit 2 -> ํด๋น ์ปค๋ฐ์ ๋ณ๊ฒฝ ๋ด์ฉ์ด ์ญ์ ๋จ / ์ปค๋ฐ ์ด๋ ฅ์ ๋ณด์กด๋จ
# a0d48a6 commit 1
-n ์ต์
Revert “...” ์ด๋ ฅ์ ๋จ๊ธฐ๊ณ ์ถ์ง ์๋ค๋ฉด -n(ํน์ --no-commit) ์ต์
์ ๋ถ์ด๋ฉด ๋๋ค. revertํ ๊ฒฐ๊ณผ์ stage ์ํ๋ง ์ ์งํ๊ณ revert ์ด๋ ฅ์ด ๋จ์ง ์๋๋ค.
git revert -n commit2hash # commit 2 ๋ณ๊ฒฝ ๋ด์ฉ ์ญ์
git status # commit 2์ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ญ์ ํ ํ์ ๊ฒฐ๊ณผ๊ฐ staged๋ ์ํ
# You are currently reverting commit 24e6e6e(commit 2).
# Changes to be committed: modified: revert.js
git log --oneline
# 7c87c84 (HEAD -> master) commit 3
# 24e6e6e commit 2
# 717d3a8 commit 1

์ฌ๋ฌ ์ปค๋ฐ revert
์๋์ฒ๋ผ ์ฌ๋ฌ commit์ revertํ ์๋ ์๋ค.
git revert commit2hash commit3hash # commit 2, commit 3 ๋ณ๊ฒฝ๋ด์ฉ ์ญ์
git log --oneline
# 5af042f (HEAD -> master) Revert "commit 3"
# 0e450b3 Revert "commit 2"
# 0d1d8ba commit 3
# 7f68fc8 commit 2
# 0b84063 commit 1
์ด๋ฏธ pushํ commit์ ์ทจ์ํด์ผ ๋๋ค๋ฉด?
๐ก ์ฌ๋ฌ ์ฌ๋์ด ์์
ํ๋ ๋ธ๋์น์์ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ pushํ ํ commit์ ์ทจ์ํด์ผ ๋๋ ์ํฉ์ด๋ผ๋ฉด revert๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ์ ๊ฑด๊ฐ์ ์ข๋ค.
push ์ค๋ฅ ์ํฉ ์ฌํ
โถ commit์ 3๋ฒํ๊ณ ํ๊ณ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ push
// log.js
console.log('commit1'); // ์ฒซ๋ฒ์งธ ์ปค๋ฐ
console.log('commit2'); // ๋๋ฒ์งธ ์ปค๋ฐ
console.log('commit3'); // ์ธ๋ฒ์งธ ์ปค๋ฐ
โท ๋ก์ปฌ์์ reset์ ์ฌ์ฉํด 3๋ฒ์งธ commit ์ทจ์ (reset์ ์ต์
์ด ์์ผ๋ฏ๋ก reset --mixed ์ ๋์ผ)
git reset HEAD^
git log --oneline
# 969e77a commit 2
# 321e8ab commit 1
โธ 4๋ฒ์งธ commit ํ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ pushํ๋ ค๊ณ ํ๋ฉด ์๋ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
# ! [rejected] master -> master (non-fast-forward)
# error: failed to push some refs to '...'
์์ธ ๋ฐ ํด๊ฒฐ
์๋ ๋ก์ปฌ commit์ ์ญ์ ํ ์ํ์์, ์๊ฒฉ์ ์๋ commit์ ๋ฎ์ด์ฐ๋ ค๊ณ ํด์ ๋ฐ์ํ๋ ์๋ฌ๋ค. ์ด๋ ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด “์ต์ง๋ก” ํด๊ฒฐํ ์ ์๋ค(์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ).
โถ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ mergeํ ํ ๋ค์ push ํ๋ ๋ฐฉ๋ฒ (reset ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ๊ณผ ๋์ผ)
git pull origin master # ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ commit ์ด๋ ฅ์ด ๋ก์ปฌ์ merge๋จ
git log --oneline
# 7941eb9 (HEAD -> master) Merge branch 'master' of ... -> merge commit
# d606c9b commit 4
# e56800b (origin/master) commit 3 -> ๋ก์ปฌ์์ ์ญ์ ํ์ง๋ง ์๊ฒฉ์ ๋จ์์์ผ๋ฏ๋ก mergeํ ๋ ๋๊ธฐํ๋จ
# 969e77a commit 2
# 321e8ab commit 1
--hard ์ต์
์ผ๋ก commit์ ์ญ์ ํ๋ค๋ฉด ๋ณ๊ฒฝ ๋ด์ฉ๊ณผ ์ปค๋ฐ ์ด๋ ฅ์ด ๋ชจ๋ ์์ผ๋ฏ๋ก merge ์์ด ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ ์๋ commit 3 ๋ณ๊ฒฝ ๋ด์ฉ๊ณผ commit ์ด๋ ฅ์ด ๋ก์ปฌ์ ๋๊ธฐํ๋๋ค.
--soft ํน์ --mixed ์ต์
์ผ๋ก commit์ ์ญ์ ํ๋ค๋ฉด commit 3์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ก์ปฌ์ ๋จ์์์ง๋ง commit ์ด๋ ฅ์ด ์์ผ๋ฏ๋ก ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ commit ์ด๋ ฅ์ ๋ง์ถ๊ธฐ ์ํด mergeํด์ผ ํ๋ค.
๋ง์ฝ reset ํ ๋ก์ปฌ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ญ์ ํ๊ณ pullํ๋ฉด merge ์์ด commit 3 ๋ณ๊ฒฝ ๋ด์ฉ๊ณผ commit ์ด๋ ฅ์ด ๋ก์ปฌ์ ๋๊ธฐํ๋๋ค.
โท โ๏ธ -f(ํน์ --force) ์ต์
์ผ๋ก ๋ก์ปฌ commit ์ด๋ ฅ์ ์๊ฒฉ commit ์ด๋ ฅ์ ๋ฎ์ด์ฐ๊ธฐ ํ๋ ๋ฐฉ๋ฒ
git push origin master -f
git log --oneline # ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ commit ์ด๋ ฅ์ด ์๋์ ๋์ผํด์ง(๊ฐ์ ๋ก ๋ฎ์ด์)
# d606c9b commit 4
# 969e77a commit 2
# 321e8ab commit 1
๊ฒฐ๋ก
์ฌ๋ฌ ๋ช
์ด ์์
ํ๋ ๋ธ๋์น์์ -f ์ต์
์ผ๋ก ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ commit ์ด๋ ฅ์ ๋ฎ์ด์ฐ๋ ๊ฒ์ ๊ธ์งํด์ผ ๋ ํ์ ์ค ํ๋๋ค. ํฌ๊ฒ์ดํธ๊ฐ ์ด๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒฐ๋ก , ์ฌ๋ฌ ์ฌ๋์ด ์์
ํ๋ ๋ธ๋์น์์ ์ด๋ฏธ pushํ๋ commit์ ์ทจ์ํด์ผ ๋๋ ์ํฉ์ด๋ผ๋ฉด revert๋ฅผ ์ฌ์ฉํ๋ค.
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[TS] ํ์ ์คํฌ๋ฆฝํธ - ๋๋ํ ์ฐ์ฐ์
[TS] ํ์ ์คํฌ๋ฆฝํธ - ๋๋ํ ์ฐ์ฐ์
2024.05.02 -
[Algorithm] ์๋ฐ์คํฌ๋ฆฝํธ ์(pairs)์ ํฌํจํ๋ ๋ฐฐ์ด์์ ์ ๋ํฌ ๋๋ฒ ์ฐพ๊ธฐ
[Algorithm] ์๋ฐ์คํฌ๋ฆฝํธ ์(pairs)์ ํฌํจํ๋ ๋ฐฐ์ด์์ ์ ๋ํฌ ๋๋ฒ ์ฐพ๊ธฐ
2024.05.02 -
[HTML/CSS] ์ค๋ฐ๊ฟ ์ ์ด ์์ฑ word-break / word-wrap(overflow-wrap)
[HTML/CSS] ์ค๋ฐ๊ฟ ์ ์ด ์์ฑ word-break / word-wrap(overflow-wrap)
2024.05.01 -
[DevTools] direnv๋ก ํด๋๋ง๋ค ๋ค๋ฅธ node ๋ฒ์ ์ ์ฉํ๊ธฐ / ์ ์ญ gitignore
[DevTools] direnv๋ก ํด๋๋ง๋ค ๋ค๋ฅธ node ๋ฒ์ ์ ์ฉํ๊ธฐ / ์ ์ญ gitignore
2024.05.01