[Git] Gitμ μ΄λ»κ² ν©μΉμ§? : Git Merging
μλ³Έ κ²μκΈ: https://velog.io/@euisuk-chung/κΉ-λ¨Έμ§κ³Ό-ν¨μ€νΈν¬μλ©-μ΄ν΄μ-νμ©
κΉ(Git)μ μννΈμ¨μ΄ κ°λ°μμ λ²μ κ΄λ¦¬λ₯Ό μν΄ λ리 μ¬μ©λλ λꡬμ λλ€. μ¬λ¬ κ°λ°μκ° λμμ λ€μν κΈ°λ₯μ κ°λ°ν λ, μ΄λ€μ μμ μ ν¨μ¨μ μΌλ‘ ν΅ν©νκΈ° μν΄μλ κΉμ λ¨Έμ§(merging)κ³Ό ν¨μ€νΈν¬μλ©(fast-forwarding) κΈ°λ₯μ λν μ΄ν΄κ° νμμ μ λλ€.
μ΄ λΈλ‘κ·Έ ν¬μ€νΈμμλ λ¨Έμ§κ³Ό ν¨μ€νΈν¬μλ©μ κ°λ μ μ€λͺ νκ³ , 보νΈμ μΈ μμλ₯Ό ν΅ν΄ μ΄λ₯Ό μ΄λ»κ² νμ©ν μ μλμ§ μμλ³΄κ² μ΅λλ€.
κΉ λ¨Έμ§(Merging)
λ¨Έμ§μ λ κ° μ΄μμ κ°λ° λΈλμΉλ₯Ό ν΅ν©νλ κ³Όμ μ λλ€. κ°μ₯ νν μλ리μ€λ κΈ°λ₯ κ°λ°μ μν λΈλμΉ(feature branch)μμμ μμ μ λ©μΈ λΈλμΉ(main branch)λ‘ ν΅ν©νλ κ²μ λλ€. λ¨Έμ§ κ³Όμ μμλ λ€μκ³Ό κ°μ λ¨κ³λ₯Ό κ±°μΉ©λλ€:
- λͺ©ν λΈλμΉλ‘ 체ν¬μμνκΈ°: λ¨Έμ§ν λͺ©ν λΈλμΉλ‘ 체ν¬μμν©λλ€.
1
git checkout main
- λ¨Έμ§ μ€ννκΈ°: κ°λ°ν κΈ°λ₯μ΄ μλ λΈλμΉλ₯Ό νμ¬ λΈλμΉμ λ¨Έμ§ν©λλ€.
1
git merge feature-branch
λ¨Έμ§ κ³Όμ μμ μΆ©λ(conflict)μ΄ λ°μν μ μμ΅λλ€. μ΄λ λ λΈλμΉμμ κ°μ νμΌμ κ°μ λΆλΆμ μμ νμ λ μ£Όλ‘ λ°μν©λλ€. μΆ©λμ΄ λ°μνλ©΄, κΉμ κ°λ°μμκ² μΆ©λμ ν΄κ²°νκ³ λ¨Έμ§μ μλ£ν κ²μ μμ²ν©λλ€.
ν¨μ€νΈν¬μλ©(Fast-Forwarding)
ν¨μ€νΈν¬μλ©μ λ¨Έμ§μ ν ννλ‘, λΈλμΉλ₯Ό ν΅ν©ν λ κΈ°μ‘΄μ νμ€ν 리λ₯Ό μ μ§νλ©΄μ λΈλμΉμ ν¬μΈν°λ§ μ΅μ 컀λ°μΌλ‘ μ΄λμν€λ λ°©λ²μ λλ€. μ΄λ κΈ°λ₯ λΈλμΉμμ λ©μΈ λΈλμΉλ‘μ λ³κ²½ μ¬νμ΄ μ νμ μΈ κ²½μ°(μ¦, λ©μΈ λΈλμΉμμ κΈ°λ₯ λΈλμΉκ° λΆκΈ°λ μ΄ν λ©μΈ λΈλμΉμ λ€λ₯Έ λ³κ²½ μ¬νμ΄ μμ λ)μ κ°λ₯ν©λλ€.
ν¨μ€νΈν¬μλ© μμλ λ€μκ³Ό κ°μ΅λλ€:
- κΈ°λ₯ λΈλμΉμμ μμ
νκΈ°:
feature-branch
μμ μλ‘μ΄ κΈ°λ₯μ λν μμ μ μλ£ν©λλ€. -
λ©μΈ λΈλμΉλ‘ 체ν¬μμνκΈ°: μμ μ ν΅ν©ν λ©μΈ λΈλμΉλ‘ μ νν©λλ€.
1
git checkout main
-
ν¨μ€νΈν¬μλ© λ¨Έμ§ μ€ννκΈ°: λ©μΈ λΈλμΉμμ
feature-branch
μ λ³κ²½ μ¬νμ ν¨μ€νΈν¬μλ λ°©μμΌλ‘ λ¨Έμ§ν©λλ€.1
git merge feature-branch
ν¨μ€νΈν¬μλ©μ΄ κ°λ₯ν κ²½μ°, κΉμ λ©μΈ λΈλμΉμ ν€λλ₯Ό feature-branch
μ μ΅μ 컀λ°μΌλ‘ μ΄λμν€κ³ , λ³λμ λ¨Έμ§ μ»€λ°μ μμ±νμ§ μμ΅λλ€. μ΄ λ°©μμ νμ€ν 리λ₯Ό κΉλνκ² μ μ§ν μ μμ΄ λ§μ κ°λ°μκ° μ νΈν©λλ€.
git fetch
λ?
git fetch
λͺ
λ Ήμ΄λ μ격 μ μ₯μμ μ΅μ λ³κ²½ μ¬νμ λ‘컬 μ μ₯μμ κ°μ Έμ€λ λ° μ¬μ©λ©λλ€. μ΄ λͺ
λ Ήμ΄λ μ격 μ μ₯μμ λ°μ΄ν°λ₯Ό λ‘컬μ λ€μ΄λ‘λνλ, νμ¬ μμ
μ€μΈ λΈλμΉμ μ½λλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνμ§λ μμ΅λλ€. git fetch
λ μ격 μ μ₯μμ μνλ₯Ό νμΈνκ³ , νμν κ²½μ° λ‘컬 μ μ₯μμ λΈλμΉλ₯Ό μ격 λΈλμΉμ μ΅μ μνμ λκΈ°ννκΈ° μν 첫 λ¨κ³λ‘ μ¬μ©λ©λλ€.
μ¬μ©λ²
git fetch
λͺ
λ Ήμ΄λ₯Ό μ¬μ©νλ κ°μ₯ κΈ°λ³Έμ μΈ ννλ λ€μκ³Ό κ°μ΅λλ€:
1
git fetch origin
μ¬κΈ°μ origin
μ κΈ°λ³Έμ μΌλ‘ μ€μ λ μ격 μ μ₯μμ μ΄λ¦μ
λλ€. μ΄ λͺ
λ Ήμ origin
μμ λ³κ²½λ λͺ¨λ λΈλμΉ μ 보λ₯Ό λ‘컬 μ μ₯μμ κ°μ Έμ΅λλ€. κ°μ Έμ¨ μ 보λ λ‘컬μ μ격 μΆμ λΈλμΉμ μ μ₯λλ©°, μ΄λ origin/main
, origin/feature-branch
λ±μΌλ‘ νμλ©λλ€.
git fetch
νμ μμ
git fetch
λ₯Ό μ€νν ν, λ³κ²½ μ¬νμ νμ¬ λΈλμΉμ μ μ©νλ €λ©΄ μΆκ°μ μΈ λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, μ격 μ μ₯μμ main
λΈλμΉμμ λ³κ²½λ μ¬νμ νμ¬ μ²΄ν¬μμλ main
λΈλμΉμ μ μ©νκ³ μ ν λλ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€:
- λ‘컬
main
λΈλμΉλ‘ μ ννκΈ°:1
git checkout main
- λ³κ²½ μ¬ν λ¨Έμ§νκΈ°:
1
git merge origin/main
μ΄ κ³Όμ μ origin/main
μ μ΅μ λ³κ²½ μ¬νμ λ‘컬μ main
λΈλμΉμ ν΅ν©ν©λλ€.
git fetch
μ git pull
μ μ°¨μ΄
git fetch
μ λΉμ·ν λͺ
λ Ήμ΄λ‘ git pull
μ΄ μμ΅λλ€. git pull
μ git fetch
λ₯Ό μ€νν ν, λ°λ‘ git merge
λ₯Ό μ€ννμ¬ μ격 λΈλμΉμ λ³κ²½ μ¬νμ νμ¬ λΈλμΉμ μλμΌλ‘ λ¨Έμ§ν©λλ€. μ¦, git pull
μ git fetch
ν git merge
λ₯Ό ν λ²μ μννλ λͺ
λ Ήμ΄μ
λλ€.
κ°λ°μκ° μ격 μ μ₯μμ μ΅μ λ³κ²½ μ¬νμ νμΈνκ³ μΆμ§λ§, μ¦μ νμ¬ λΈλμΉμ ν΅ν©νκ³ μΆμ§ μμ κ²½μ° git fetch
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ³κ²½ μ¬νμ κ²ν νκ³ , νμν κ²½μ° μλμΌλ‘ λ¨Έμ§ν μ μμ΅λλ€.
체ν¬μμν λΈλμΉκ° μλλ°?!
git fetch origin
κ³Ό git checkout -b project1 origin/project1
λͺ
λ Ήμ΄λ λ λ¨κ³μ μ격 μ μ₯μμ λ΄μ©μ μ
λ°μ΄νΈλ‘ μ΄λ₯Ό λΈλ μΉλ‘ μ μνλ©΄ λ©λλ€. κ°κ°μ λ¨κ³μ λν΄μ μ΄ν΄λ³΄μμ£ .
1. git fetch origin
- μ΄ λͺ
λ Ήμ΄λ μ격 μ μ₯μ
origin
μΌλ‘λΆν° μ΅μ μ 보λ₯Ό λ‘컬 μ μ₯μλ‘ κ°μ Έμ΅λλ€(fetch). μ¬κΈ°μorigin
μ λ‘컬 μ μ₯μμ λ±λ‘λ μ격 μ μ₯μμ κΈ°λ³Έ μ΄λ¦μ λλ€. git fetch
λ μ격 μ μ₯μμ λͺ¨λ λΈλμΉ μ 보λ₯Ό μ λ°μ΄νΈνμ§λ§, νμ¬ μ²΄ν¬μμλ λΈλμΉμ μμ νΈλ¦¬λ μΈλ±μ€λ₯Ό λ³κ²½νμ§ μμ΅λλ€. μ¦, λ‘컬μμ μμ μ€μΈ μ½λμλ μν₯μ μ£Όμ§ μκ³ , μ격 μ μ₯μμ μ΅μ μνλ§μ λ‘컬μ λ°μν©λλ€.- μ΄ κ³Όμ μ ν΅ν΄ μ격 μ μ₯μμ μλ‘μ΄ λΈλμΉλ μ λ°μ΄νΈλ λΈλμΉ μ 보λ₯Ό λ‘컬 μ μ₯μμ κ°μ Έμ¬ μ μμ΅λλ€.
2. git checkout -b project1 origin/project1
- μ΄ λͺ
λ Ήμ΄λ
project1
μ΄λΌλ μλ‘μ΄ λ‘컬 λΈλμΉλ₯Ό μμ±νκ³ , μ΄λ₯Όorigin/project1
μ격 λΈλμΉμ μ΅μ 컀λ°μΌλ‘ μ€μ ν ν, ν΄λΉ λΈλμΉλ‘ μ ν(checkout)ν©λλ€. - μ¬κΈ°μ
git checkout -b
λ μλ‘μ΄ λΈλμΉλ₯Ό μμ±νκ³ ν΄λΉ λΈλμΉλ‘ μ ννλ λͺ λ Ήμ΄μ λλ€.project1
μ μμ±ν μλ‘μ΄ λ‘컬 λΈλμΉμ μ΄λ¦μ΄λ©°,origin/project1
μ 볡μ (clone)νκ±°λ μ λ°μ΄νΈ(fetch)ν μ격 λΈλμΉλ₯Ό μ§μ ν©λλ€. - μ΄ κ³Όμ μ νΉν μ격 μ μ₯μμ μλ‘ μμ±λκ±°λ μ
λ°μ΄νΈλ λΈλμΉλ₯Ό κΈ°λ°μΌλ‘ λ‘컬μμ μμ
μ μμνκ³ μ ν λ μ μ©ν©λλ€. μλ‘μ΄ λΈλμΉ
project1
μ μ격 λΈλμΉorigin/project1
μ μνλ₯Ό κ·Έλλ‘ λ°μνμ¬ μμ±λ©λλ€.
μμ½νλ©΄, μ΄ λ λͺ
λ Ήμ΄λ μ격 μ μ₯μ origin
μμ project1
λΈλμΉμ μ΅μ μνλ₯Ό λ‘컬 μ μ₯μλ‘ κ°μ Έμ(git fetch origin
), κ·Έ μνλ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ λ‘컬 λΈλμΉ project1
μ μμ±νκ³ ν΄λΉ λΈλμΉλ‘ μ ν(git checkout -b project1 origin/project1
)νλ μμ
μ μνν©λλ€. μ΄λ¬ν κ³Όμ μ ν΅ν΄ κ°λ°μλ μ격 μ μ₯μμ νΉμ λΈλμΉλ₯Ό κΈ°μ€μΌλ‘ λ‘컬μμ μλ‘μ΄ μμ
μ μμν μ μκ² λ©λλ€.
μΆκ° μ€λͺ
git checkout -b
μ¬μ© μλ리μ€
git checkout -b
λͺ
λ Ήμ΄λ μλ‘μ΄ λΈλμΉλ₯Ό μμ±νκ³ ν΄λΉ λΈλμΉλ‘ λ°λ‘ μ ννλ μμ
μ ν λ²μ μνν©λλ€. μ΄ λͺ
λ Ήμ΄λ νΉν μλ‘μ΄ κΈ°λ₯ κ°λ°, λ²κ·Έ μμ , μ€νμ μΈ μλ λ±μ μν μλ‘μ΄ μμ
λΈλμΉλ₯Ό μμν λ μ μ©ν©λλ€. git checkout -b
λͺ
λ Ήμ΄μ μΌλ°μ μΈ μ¬μ©λ²μ λ€μκ³Ό κ°μ΅λλ€:
1
git checkout -b [μλ‘μ΄ λΈλμΉ μ΄λ¦]
μ΄ λͺ
λ Ήμ νμ¬ λΈλμΉμ μνλ₯Ό κΈ°λ°μΌλ‘ [μλ‘μ΄ λΈλμΉ μ΄λ¦]
μΌλ‘ λͺ
λͺ
λ μλ‘μ΄ λΈλμΉλ₯Ό μμ±νκ³ , μ΄ μλ‘μ΄ λΈλμΉλ‘ μ ν(checkout)ν©λλ€.
μμ: μλ‘μ΄ κΈ°λ₯ κ°λ°μ μν λΈλμΉ μμ±
μλ₯Ό λ€μ΄, μλ‘μ΄ λ‘κ·ΈμΈ κΈ°λ₯μ κ°λ°νκΈ° μν΄ feature-login
μ΄λΌλ λΈλμΉλ₯Ό μμ±νκ³ μ ν λ, λ€μ λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν©λλ€:
1
git checkout -b feature-login
μ΄ λͺ
λ Ήμ΄λ νμ¬ μμΉν λΈλμΉ(μ: main
λλ develop
)μ μ΅μ μνλ₯Ό κΈ°λ°μΌλ‘ feature-login
λΈλμΉλ₯Ό μμ±νκ³ , μλμΌλ‘ ν΄λΉ λΈλμΉλ‘ μ νν©λλ€. μ΄λ‘μ¨ κ°λ°μλ μ κΈ°λ₯μ λν μμ
μ μ¦μ μμν μ μμ΅λλ€.
git checkout -b
μ μ격 λΈλμΉ
git checkout -b
λͺ
λ Ήμ΄λ μ격 λΈλμΉλ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ λ‘컬 λΈλμΉλ₯Ό μμ±νκ³ μΆμ λλ μ¬μ©λ©λλ€. μ΄ κ²½μ° λͺ
λ Ήμ΄ νμμ λ€μκ³Ό κ°μ΅λλ€:
1
git checkout -b [μλ‘μ΄ λ‘컬 λΈλμΉ μ΄λ¦] origin/[μ격 λΈλμΉ μ΄λ¦]
μλ₯Ό λ€μ΄, μ격 μ μ₯μμ μλ feature-login
λΈλμΉλ₯Ό κΈ°λ°μΌλ‘ λ‘컬μμ λμΌν μ΄λ¦μ λΈλμΉλ₯Ό μμ±νλ €λ©΄, λ€μκ³Ό κ°μ΄ μ€νν©λλ€:
1
git checkout -b feature-login origin/feature-login
μ΄λ μ격μ feature-login
λΈλμΉ μνλ₯Ό 볡μ νμ¬ λ‘컬μ feature-login
λΈλμΉλ₯Ό μμ±νκ³ , ν΄λΉ λΈλμΉλ‘ μ νν©λλ€.