[Git] git revert, git reset ์ฐจ์ด์ ๋ฐ HEAD ๋ถ๋ฆฌ
TL;DR
- reset : ํ์ฌ ๋ธ๋์น๋ฅผ ์ง์ ํ ์ปค๋ฐ์ผ๋ก ์ด๋. ๊ทธ ์ดํ์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ ์ญ์
- revert : ์ปค๋ฐ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ๋ ์๋ก์ด ์ปค๋ฐ ์์ฑ. ๊ธฐ์กด ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ ์ ์ง
HEAD ๋ฐฐ๊ฒฝ์ง์
Git Branch ํ์ต/์ฐ์ตํ๊ธฐ ์ข์ ์ฌ์ดํธ โผ
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