๋ถ„์‚ฐ ์†Œ์Šค ์ œ์–ด ์‹œ์Šคํ…œ Git 2.22 ์ถœ์‹œ

๋„์ž… ๋ถ„์‚ฐ ์†Œ์Šค ์ œ์–ด ์‹œ์Šคํ…œ ์ถœ์‹œ ํž˜๋‚ด 2.22.0. Git์€ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๊ณ  ์•ˆ์ •์ ์ธ ๊ณ ์„ฑ๋Šฅ ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ„๊ธฐ ๋ฐ ๋ณ‘ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์œ ์—ฐํ•œ ๋น„์„ ํ˜• ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์†Œ๊ธ‰ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ €ํ•ญ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์ปค๋ฐ‹์˜ ์ „์ฒด ์ด์ „ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์•”์‹œ์  ํ•ด์‹ฑ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž์˜ ๋””์ง€ํ„ธ ์„œ๋ช…์œผ๋กœ ๊ฐœ๋ณ„ ํƒœ๊ทธ์™€ ์ปค๋ฐ‹์„ ์ธ์ฆํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์— ๋น„ํ•ด ์ƒˆ ๋ฒ„์ „์—๋Š” 745๊ฐœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์—ˆ์œผ๋ฉฐ, 74๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์—ฌํ•˜์—ฌ ์ค€๋น„ํ–ˆ์œผ๋ฉฐ, ์ด ์ค‘ 18๋ช…์ด ์ฒ˜์Œ์œผ๋กœ ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ํ˜์‹ :

  • ๋ฆด๋ฆฌ์Šค 1.18๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ ๋ฆฌ๋ฒ ์ด์Šค ๋ชจ๋“œ "git rebase --rebase-merges"๋Š” ํ˜„์žฌ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์ „ "--preserve-merges" ์˜ต์…˜์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. "git rebase" ์ž‘์—…์€ ์ผ๋ จ์˜ ์ปค๋ฐ‹์„ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์ปค๋ฐ‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ํ˜„์žฌ ์ƒํƒœ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ธŒ๋žœ์น˜ ๋’ค์— ์ถ”๊ฐ€๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. :

    o - o - o(๋‚ด ๊ธฐ๋Šฅ)

    /

    o - o - o - o - o (๋งˆ์Šคํ„ฐ)

    o - o - o(๋‚ด ๊ธฐ๋Šฅ)

    /

    o - o - o - o - o (๋งˆ์Šคํ„ฐ)

    ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๋ธŒ๋žœ์น˜์—์„œ ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์—๋Š” "--preserve-merges" ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ(git rebase -i --preserve-merges)์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ปค๋ฐ‹ ๊ธฐ๋ก ํŽธ์ง‘์„ ํ—ˆ์šฉํ–ˆ์ง€๋งŒ ์ €์žฅ์†Œ ๊ตฌ์กฐ์˜ ์™„์ „ํ•œ ๋ณด์กด์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด "--rebase-merges" ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์ธ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํ•˜๋Š” ๋™์‹œ์— ์ปค๋ฐ‹ ์‚ญ์ œ, ์žฌ๊ทธ๋ฃนํ™”, ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋ฅผ ํฌํ•จํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๋Œ€ํ™”ํ˜• ์ž‘์—…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ: "--rebase-merges" ๊ทธ๊ฒƒ์€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๋ธŒ๋žœ์น˜์˜ ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜์—์„œ ์ตœ์‹  ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋กœ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์—…๋กœ๋“œํ•˜๊ณ  ์ฆ‰์‹œ ์ปค๋ฐ‹ ๋ฉ”๋ชจ๋ฅผ ์ผ๋ถ€ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • "git Branch new A...B" ๋ฐ "git checkout -b new ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋‘ ๋ธŒ๋žœ์น˜(๋ณ‘ํ•ฉ ๋ฒ ์ด์Šค, ๊ณตํ†ต ์กฐ์ƒ์— ๋ฐ”์ธ๋”ฉ)์˜ ๋ณ‘ํ•ฉ ๋ฒ ์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. A...Bโ€, ์—ฌ๊ธฐ์„œ โ€œA ...Bโ€๋Š” โ€œgit checkout A...Bโ€๊ฐ€ HEAD๋ฅผ ๊ธฐ๋ณธ ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•˜๊ณ  โ€œdiff A. ..B"๋Š” ์ปค๋ฐ‹ "B"์™€ ์ปค๋ฐ‹ "A" "Ancestor" ์‚ฌ์ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ„๋„์˜ my-feature ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•  ๋•Œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜(์˜ˆ: my-feature ๋ธŒ๋žœ์น˜๊ฐ€ ์ฒดํฌ์•„์›ƒ๋œ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ๋™์ผํ•œ ์œ„์น˜)์—์„œ ์‹œ์ž‘ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ๋งŽ์€ ๊ฒฝ์šฐ ๋ถˆํŽธํ–ˆ๋˜ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ฒ€์‚ฌํ•œ ๋‹ค์Œ "git merge-base master my-feature"๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋งˆ์Šคํ„ฐ์™€ my-feature ๋ถ„๊ธฐ ์‚ฌ์ด์˜ ๋ณ‘ํ•ฉ ๋ฒ ์ด์Šค ํ•ด์‹œ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณตํ†ต ์กฐ์ƒ์ธ "git Branch my-other-feature hash"๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Git 2.22์—์„œ๋Š” "git Branch my-other-feature A...B" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋ณ‘ํ•ฉ ๊ธฐ๋ฐ˜์„ ๊ธฐ์ค€์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒดํฌ์•„์›ƒ ์ž‘์—… ์ค‘์— ์–ป์€ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด "git Branch --show-current" ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒดํฌ์•„์›ƒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ dir ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ์ƒํƒœ์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” "git checkout โ€”no-overlay โ€” dir" ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, master ๋ธŒ๋žœ์น˜์— ์—†๋Š” dir ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์— ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ "git checkout master - dir"์„ ์‹คํ–‰ํ•  ๋•Œ ํ•ด๋‹น ํŒŒ์ผ์€ ๋‚จ๊ฒŒ ๋˜๋ฉฐ "--no-overlay" โ€ ์˜ต์…˜์ด ์ง€์ •๋˜๋ฉด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • "git diff" ๋ช…๋ น์€ ์˜ต์…˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์œ„ํ•ด ๋ฒ”์šฉ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ git ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ์˜ต์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "git diff"์—์„œ ๋ชจ๋“  ์˜ต์…˜์—๋Š” ์ด์ œ ์ ๋Œ€์ž("--function-context" ๋ฐ "--no-function-context")๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "git log" ์ถœ๋ ฅ์˜ ์ปค๋ฐ‹์— ์ฒจ๋ถ€๋œ ํ™•์žฅ ํƒœ๊ทธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค("ํŠธ๋ ˆ์ผ๋Ÿฌ" - Signed-off-by ๋ฐ Co-authored-by์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด ํ”Œ๋ž˜๊ทธ). ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ๊ธฐ์ค€์œผ๋กœ ๋ผ๋ฒจ์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    "git log --pretty="%(trailers:key=๊ฒ€ํ† ์ž,๊ฐ’๋งŒ)";

  • ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ ํ˜•์‹์„ ์ œ๊ณตํ•˜๋Š” ์ƒˆ๋กœ์šด ์ถ”์  ์—”์ง„์ธ Trace2๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Trace2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ์ž์„ธํ•œ ๋ถ„์„ ๋ฐ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์‹คํ–‰๋œ ์ž‘์—… ๋ฐ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์›๊ฒฉ ์ธก์ •์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•ธ๋“ค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ• ๋‹นํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋Š” ์™ธ๋ถ€๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
  • "git bisect" ๋ณด๊ณ ์„œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ปค๋ฐ‹์ด ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜๊ณ  ๊ฐ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์š”์•ฝ ํ†ต๊ณ„๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(๋ณ€๊ฒฝ๋œ ์ค„ ์ˆ˜ ์ˆ˜์ค€์—์„œ).
  • ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ ˆ์ด๋ธ”์˜ ์ž˜๋ชป๋œ ์„ค์น˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์ด ์žฌ์ž‘์—…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์ด์ œ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํƒœ๊ทธ์— ํƒœ๊ทธ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ˆ˜๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ ์ž˜๋ชป๋œ ์ปค๋ฐ‹์— ํƒœ๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "git tag -f -m "updated message"์™€ ๊ฐ™์€ ๊ตฌ์„ฑ). my-tag1 my-tag2โ€ณ๋Š” ์ด์ „ ํƒœ๊ทธ์— ํƒœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์ด์ „ ํƒœ๊ทธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์— ์ƒˆ ํƒœ๊ทธ๊ฐ€ ์„ค์น˜๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ์ปค๋ฐ‹์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ฒด ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ธฐ๋ณธ ๊ฐœ์ฒด์˜ ์กด์žฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ๋งต ์ €์žฅ์†Œ(๋””์Šคํฌ ๊ธฐ๋ฐ˜ "์ ‘๊ทผ์„ฑ ๋น„ํŠธ๋งต" ๊ตฌ์กฐ)์— ๋Œ€ํ•œ ์ƒ์„ฑ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์ž‘์—…(git fetch)์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€