๐Ÿ”
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

Diff ์ถœ๋ ฅ ์ฝ๋Š” ๋ฐฉ๋ฒ•: ํŒจ์น˜ ํŒŒ์ผ๊ณผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ดํ•ดํ•˜๊ธฐ

ยท ํƒœ๊ทธ: diff-output, unified-diff, patch-file, diff-format, git-diff

Diff ์ถœ๋ ฅ ์ฝ๋Š” ๋ฐฉ๋ฒ•: ํŒจ์น˜ ํŒŒ์ผ๊ณผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ดํ•ดํ•˜๊ธฐ

Diff ์ถœ๋ ฅ์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ๊ณต์šฉ์–ด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ค‘์—, ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ๋•Œ, ๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ์˜ ํŒจ์น˜๋ฅผ ์ ์šฉํ•  ๋•Œ ์ •๊ธฐ์ ์œผ๋กœ diff ์ถœ๋ ฅ์„ ์ ‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ diff ์ถœ๋ ฅ์„ ํšจ์œจ์ ์œผ๋กœ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์˜ diff ์ถœ๋ ฅ์„ ์ฝ๋Š” ๋ฐฉ๋ฒ•, ํŒจ์น˜ ํŒŒ์ผ์˜ ์ž‘๋™ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์‹  ์žˆ๊ฒŒ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Diff ์ถœ๋ ฅ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Diff ์ถœ๋ ฅ์€ ๋‘ ํŒŒ์ผ ๋˜๋Š” ํŒŒ์ผ ์ง‘ํ•ฉ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1970๋…„๋Œ€์— Bell Labs์˜ Douglas McIlroy๊ฐ€ ๋งŒ๋“  diff ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” Git, Mercurial ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ๊ธฐ์ดˆ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

git diff ๋˜๋Š” ๋‹ค๋ฅธ diff ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์ถœ๋ ฅ์€ ๋ฌด์—‡์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€, ์–ด๋””์„œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์‚ฌ๋žŒ๊ณผ ๊ธฐ๊ณ„ ๋ชจ๋‘๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Unified Diff ํ˜•์‹ ์ดํ•ดํ•˜๊ธฐ

Unified diff ํ˜•์‹์€ ์˜ค๋Š˜๋‚  ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ถœ๋ ฅ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ hunk๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉฐ, ๊ฐ hunk ์•ž์—๋Š” ํŒŒ์ผ ๋‚ด์—์„œ ๋ณ€๊ฒฝ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ปจํ…์ŠคํŠธ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Hunk ํ—ค๋”์˜ ๊ตฌ์กฐ

๋ชจ๋“  hunk๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ—ค๋”๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค:

@@ -start,count +start,count @@

์ด๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

| ๋ถ€๋ถ„ | ์˜๋ฏธ | |------|---------| | @@ | hunk์˜ ์‹œ์ž‘์„ ํ‘œ์‹œํ•˜๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | | -3,7 | ์›๋ณธ ํŒŒ์ผ์—์„œ ์ด hunk๋Š” 3๋ฒˆ์งธ ์ค„์—์„œ ์‹œ์ž‘ํ•˜์—ฌ 7์ค„์— ๊ฑธ์ณ ์žˆ์Šต๋‹ˆ๋‹ค | | +3,8 | ์ƒˆ ํŒŒ์ผ์—์„œ ์ด hunk๋Š” 3๋ฒˆ์งธ ์ค„์—์„œ ์‹œ์ž‘ํ•˜์—ฌ 8์ค„์— ๊ฑธ์ณ ์žˆ์Šต๋‹ˆ๋‹ค | | @@ | ๋‹ซ๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ |

ํ—ค๋” ๋ฐ”๋กœ ๋’ค์˜ ์ปจํ…์ŠคํŠธ ์ค„(์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋‚˜ ๊ทผ์ฒ˜ ์ฃผ์„)์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํŒŒ์ผ์˜ ์–ด๋А ๋ถ€๋ถ„์— ์†ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Hunk ๋‚ด์˜ ์ค„

hunk ๋‚ด์˜ ๊ฐ ์ค„์€ ๋‹จ์ผ ๋ฌธ์ž๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค:

 context line (๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)
-added line    (์ƒˆ ํŒŒ์ผ์— ์กด์žฌ, ์ด์ „ ํŒŒ์ผ์—๋Š” ์—†์Œ)
+added line    (์ƒˆ ํŒŒ์ผ์— ์กด์žฌ, ์ด์ „ ํŒŒ์ผ์—๋Š” ์—†์Œ)
  • ์ปจํ…์ŠคํŠธ ์ค„์€ ๊ณต๋ฐฑ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์€ ๋‘ ๋ฒ„์ „์—์„œ ๋™์ผํ•˜๋ฉฐ ์ฐธ์กฐ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ญ์ œ๋œ ์ค„์€ ๋นผ๊ธฐ ๊ธฐํ˜ธ(-)๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์€ ์ด์ „ ํŒŒ์ผ์—๋Š” ์žˆ์ง€๋งŒ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋œ ์ค„์€ ๋”ํ•˜๊ธฐ ๊ธฐํ˜ธ(+)๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„์€ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์˜ˆ์ œ

๋‹ค์Œ์€ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์ •๋˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๋Š” diff์ž…๋‹ˆ๋‹ค:

@@ -5,7 +5,9 @@
 def greet(name):
-    print("Hello, " + name)
-    print("Welcome!")
+    message = f"Hello, {name}!"
+    print(message)
+    print("We are glad to see you.")
+
     if name == "admin":
         print("You have admin privileges.")

์ด diff๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•:

  • ์ด์ „ ๋ฒ„์ „์€ "Hello, "์— ์ด๋ฆ„์„ ๋”ํ•œ ํ›„ "Welcome!"์„ ์ถœ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ ๋ฒ„์ „์€ ํฌ๋งท๋œ ๋ฉ”์‹œ์ง€ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๊ณ , ์ถœ๋ ฅํ•œ ํ›„, ์ถ”๊ฐ€ ์ธ์‚ฌ๋ง ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ, admin ํ™•์ธ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ๋‘ ์ค„์ด ์‚ญ์ œ๋˜์—ˆ๊ณ (- ์ค„), ์„ธ ์ค„์ด ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ(+ ์ค„), ๋นˆ + ์ค„์€ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋นˆ ์ค„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜ ํŒŒ์ผ: ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Diff

ํŒจ์น˜ ํŒŒ์ผ์€ ๋‹จ์ˆœํžˆ ํŒŒ์ผ๋กœ ์ €์žฅ๋œ diff์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ .patch ๋˜๋Š” .diff ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜ ํŒŒ์ผ์€ ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์‹ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜ ๋งŒ๋“ค๊ธฐ

Git์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ์ปค๋ฐ‹์—์„œ ํŒจ์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

git format-patch HEAD~1

๋˜๋Š” ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—์„œ ํŒจ์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

git diff > my-changes.patch

ํŒจ์น˜ ์ ์šฉํ•˜๊ธฐ

๋Œ€์ƒ ์ €์žฅ์†Œ์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค:

git apply my-changes.patch

๋˜๋Š” ํด๋ž˜์‹ patch ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

patch -p1 < my-changes.patch

-p1 ํ”Œ๋ž˜๊ทธ๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ, ํŒจ์น˜ ์ž‘์„ฑ์ž์™€ ์ ์šฉ์ž ๊ฐ„์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ์ฐจ์ด๋ฅผ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ Diff ์ถœ๋ ฅ ํ˜•์‹

Unified diff ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ์ ‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Normal Diff

์›๋ž˜ diff ๋ช…๋ น์˜ ๊ธฐ๋ณธ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ a(์ถ”๊ฐ€), c(๋ณ€๊ฒฝ), d(์‚ญ์ œ)์™€ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œ ์ง€์นจ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

3c3
< Hello world
---
> Hello beautiful world

Context Diff

๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ฃผ์œ„์— ์„ธ ์ค„์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์ „ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋А๋‚Œํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์ค„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Side-by-Side Diff

๋‹จ์ผ ํŒŒ์ผ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ ๋‘ ์—ด์„ ๋‚˜๋ž€ํžˆ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋ž˜ํ”ฝ diff ๋„๊ตฌ์™€ ์˜จ๋ผ์ธ diff checker์—์„œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ Diff ์ถœ๋ ฅ ์ฝ๊ธฐ

Pull request๋ฅผ ๊ฒ€ํ† ํ•  ๋•Œ ๋‹ค์Œ ์š”์†Œ์— ์ง‘์ค‘ํ•˜์„ธ์š”:

  1. Hunk ํ—ค๋”: ์–ด๋–ค ํŒŒ์ผ๊ณผ ํ•จ์ˆ˜๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  2. ์ถ”๊ฐ€๋œ ์ค„๊ณผ ์‚ญ์ œ๋œ ์ค„์˜ ๋น„์œจ: ์ค‘์š”ํ•œ ํŒŒ์ผ์—์„œ ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ๋” ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํ…์ŠคํŠธ ์ค„: ์ฃผ๋ณ€ ๋กœ์ง์„ ๋ณด์—ฌ์ฃผ์–ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  4. ๊ณต๋ฐฑ๋งŒ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ: ๋งŽ์€ diff ๋„๊ตฌ๋Š” ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ•์กฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Diff ํ•ด์„์„ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

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

Diff ์ถœ๋ ฅ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํ˜‘์—… ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. diff ์ฝ๊ธฐ์— ์ต์ˆ™ํ•ด์ง€๋ฉด ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ณ‘ํ•ฉ ์ถฉ๋Œ, ํŒจ์น˜ ํŒŒ์ผ์„ ํ›จ์”ฌ ๋” ์ž์‹  ์žˆ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Diff ์ถœ๋ ฅ ์ฝ๋Š” ๋ฐฉ๋ฒ•: ํŒจ์น˜ ํŒŒ์ผ๊ณผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ดํ•ดํ•˜๊ธฐ - CoolTool