๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/Git

[Git] ์›๊ฒฉ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฐ ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ

๋ฐ˜์‘ํ˜•

[Git] ์›๊ฒฉ์ €์žฅ์†Œ์— ์˜ฌ๋ผ๊ฐ„ ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ

์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ์ œ์–ด (reset/revert)

 

1. reset ํ›„ ๊ฐ•์ œ push ํ•˜๊ธฐ

1-1. ์ฃผ์˜์‚ฌํ•ญ

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

  • ๋ณธ์ธ ํ˜ผ์ž์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ•์ œ๋กœ ๋˜๋Œ๋ฆฐ ์ปค๋ฐ‹์„ pull ํ•œ ํŒ€์›์ด ์—†๋Š” ๊ฒฝ์šฐ

๋งŒ์•ฝ ์•„๋ž˜์˜ ์ž‘์—…์„ ๋ชจ๋ฅด๊ณ  ํŒ€์›์ด ์ž‘์—… ํ›„ push ํ•˜๋ฉด, ๋‚ด๊ฐ€ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ–ˆ๋˜ ์ปค๋ฐ‹๋“ค์ด ๋‹ค์‹œ ์ƒ์„ฑ๋œ๋‹ค.

 

1-2. ๋กœ์ปฌ์—์„œ ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ ์ปค๋ฐ‹์œผ๋กœ ๊ฐ„๋‹ค.

  • ์•„๋ž˜ ๋ช…๋ น๋ฌธ์€ ์›ํ•˜๋Š” ์ปค๋ฐ‹์ƒํƒœ๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค.
  • HEAD^ ๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ฒŒ ๋˜๊ณ , HEAD~3 ๋Š” ์ตœ์‹ (ํ—ค๋“œ)๋ถ€ํ„ฐ 3๊ฐœ์˜ ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ฒŒ ๋œ๋‹ค.
$ git reset --hard HEAD^

 

1-3. ๊ฐ•์ œ๋กœ ํ‘ธ์‹œํ•˜๊ธฐ

  • ์›ํ•˜๋Š” ์ƒํƒœ์˜ ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ์•„์™”๋‹ค๋ฉด ๊ทธ ์ƒํƒœ๋กœ ๊ฐ•์ œ ํ‘ธ์‹œํ•œ๋‹ค.
  • -f ๋˜๋Š” -force๋Š” ๊ฐ•์ œ๋กœ ํ‘ธ์‹œํ•จ์„ ์˜๋ฏธ.
$ git push -f origin master

 

 

2. revert ํ›„ ๊ฐ•์ œ๋กœ ํ‘ธ์‹œํ•˜๊ธฐ

reset์˜ ๊ฒฝ์šฐ, ์ปค๋ฐ‹์‚ฌํ•ญ๋“ค์„ ์ „์ฒด์ ์œผ๋กœ ์‚ญ์ œํ•œ ํ›„ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์กฐ์ž‘๋œ๋‹ค๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค.

๋˜๋Œ๋ ธ๋‹ค๋Š” ๊ฑธ ํžˆ์Šคํ† ๋ฆฌ์— ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด revert ํ•˜์—ฌ ๊ณผ๊ฑฐ ์ปค๋ฐ‹์œผ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

2-1. ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ ์ปค๋ฐ‹์œผ๋กœ ๊ฐ„๋‹ค

$ git revert [๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ commit hash]

ํŠน์ • ์ปค๋ฐ‹์—์„œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

๋”ฐ๋ผ์„œ commit A -> commit B -> commit C ์ปค๋ฐ‹์˜ ์ˆœ์„œ๋กœ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์Œ“์—ฌ์žˆ๋Š”๊ฑธ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ,

์ด๋ฅผ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” commt C -> commit B -> commit A ์ˆœ์„œ๋กœ ๊ฑฐ๊พธ๋กœ revert ํ•ด์•ผ ํ•œ๋‹ค.

 

์ปค๋ฐ‹ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ ์ปค๋ฐ‹์˜ ์ˆ˜๋งŒํผ ๋ถˆํ•„์š”ํ•œ revert ์ปค๋ฐ‹์ด ์ƒ๊ฒจ๋‚œ๋‹ค.

์ฆ‰, ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ ์ปค๋ฐ‹์ด 100๊ฐœ๋ผ๋ฉด 100๊ฐœ์˜ revert์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ --no-commit ์˜ต์…˜์„ ์ด์šฉํ•˜๋ฉด revert๋ฅผ ์œ„ํ•œ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋ฉด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

git revert --no-commit [๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ commit hash] ์‹คํ–‰ํ•˜๋ฉด, revert ์ปค๋ฐ‹์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ working tree์™€ index(staging area)์—๋งŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋œ๋‹ค.

$ git revert --no-commit [๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€ commit hash]

 

ํ•˜์ง€๋งŒ ์ผ์ผ์ด revert ํ•  ์ปค๋ฐ‹์˜ ์ˆ˜๋งŒํผ ๋ช…๋ น์–ด๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

์—ฌ๋Ÿฌ๊ฐœ๋ฅผ revert ํ•ด์ฃผ๋ ค๋ฉด ํŠน์ • commit์˜ hash๊ฐ€ ์•„๋‹Œ "๋˜๋Œ๋ฆฌ๊ณ ์‹ถ์€ ์ปค๋ฐ‹์˜ ๋ฒ”์œ„"๋ฅผ ์ธ์ˆ˜๋กœ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

$ git revert --no-commit HEAD~3.. // ๋˜๋Š”
$ git revert --no-commit master~3..master

 

๋งˆ์ง€๋ง‰์œผ๋กœ index(staging area)์— ์˜ฌ๋ผ๊ฐ„ ๋ณ€๊ฒฝ๋“ค์„ ํ•œ๊บผ๋ฒˆ์— ์ปค๋ฐ‹ํ•œ ๋‹ค์Œ, ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œํ•˜๋ฉด ๋œ๋‹ค.

$ git commit -m "Revert commit A, B, C"
$ git push origin master

 

 

Reference

https://jupiny.com/2019/03/19/revert-commits-in-remote-repository/

 


revert ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํžˆ์Šคํ† ๋ฆฌ์— ๋‚จ์•„์„œ ์ˆ˜์ •ํ•  ๋•Œ ์•ˆ์ •์„ฑ์ด ์žˆ๋‹ค. (๋˜ ๋‹ค์‹œ ๋˜๋Œ์•„๊ฐ€์•ผ ๋  ์ˆ˜์žˆ์œผ๋ฏ€๋กœ..)

 

๋ฐ˜์‘ํ˜•