Git / git merge

git merge

Branch дээр хөгжүүлсэн кодоо үндсэн branch-д нэгтгэхэд git merge ашиглана. Merge хийхэд Git хоёр branch-ийн түүхийг нэгтгэж, нэг шугам болгоно.

git merge — үндсэн хэрэглээ

Merge хийхдээ хүлээн авах branch дээр байх хэрэгтэй. Ихэвчлэн main branch-д буцаж ирж, feature branch-аа merge хийнэ:

bash
git switch main
git merge feature/login

Git хоёр branch-ийн commit-уудыг харьцуулж, нэгтгэнэ.

Fast-forward merge

Хамгийн энгийн тохиолдол — main branch дээр шинэ commit гараагүй, feature branch зөвхөн урагш явсан үед:

код
Өмнө:
main:    A → B
                ↘
feature:          C → D

Дараа (fast-forward):
main:    A → B → C → D

Git main-ийн заагчийг feature-ийн сүүлийн commit руу шилжүүлнэ. Нэмэлт "merge commit" үүсдэггүй — түүх шулуун үлдэнэ.

bash
git switch main
git merge feature/login
код
Updating 9f8e7d6..a1b2c3d
Fast-forward
 app/(auth)/login/page.tsx | 47 ++++++++++++++++++
 1 file changed, 47 insertions(+)

"Fast-forward" гэж мэдэгдэнэ.

3-way merge

main branch дээр шинэ commit гарсан байхад feature branch merge хийх үед Git гурван цэгийг харьцуулна:

  1. Хоёр branch-ийн нийтлэг өвөг commit (common ancestor)
  2. main-ийн сүүлийн commit
  3. feature-ийн сүүлийн commit
код
Өмнө:
main:    A → B → E
                  ↑
feature:  A → B → C → D

Дараа (3-way merge):
main:    A → B → E → M
                  ↗ ↗
feature:        C → D

M нь merge commit — хоёр салааг нэгтгэсэн тусгай commit.

bash
git switch main
git merge feature/login

Git editor нээж merge commit мессеж оруулахыг хүснэ. Анхдагч мессежийг (Merge branch 'feature/login' into main) хадгалж болно эсвэл өөрчилж болно. Editor-с гарахад merge дуусна.

Merge commit мессеж

Editor нээгдэхэд харагдах анхдагч мессеж:

код
Merge branch 'feature/login'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.

Ихэвчлэн анхдагч мессежийг үлдээдэг. Хэрэв Pull Request ашиглаж байгаа бол GitHub өөрөө merge commit мессеж үүсгэдэг.

--no-ff тугийг — merge commit үүсгэхийг шаардах

Fast-forward боломжтой ч merge commit үүсгэхийг хүсвэл:

bash
git merge --no-ff feature/login
код
Merge made by the 'ort' strategy.

Ингэснээр түүхэнд "энэ feature branch дээр хийсэн ажил" гэдэг нь тодорхой харагдана.

код
--no-ff ашигласан үед:
main:    A → B → M
              ↗
feature:    C → D

--squash — бүх commit-ийг нэг болгох

feature branch-ийн бүх commit-ийг нэг commit болгож нэгтгэх:

bash
git merge --squash feature/login
git commit -m "feat(auth): нэвтрэх хуудас нэмэх"

feature branch-ийн 10 commit нэг цэвэр commit болж main-д орно. Ажлын явцын "wip", "засвар" гэх мэт commit-ууд main-д харагдахгүй болно.

Merge хийх өмнө шалгах

bash
# feature branch-ийн юу main-д орохыг урьдчилан харах
git log main..feature/login --oneline

# Ямар файл өөрчлөгдөхийг харах
git diff main feature/login --stat

Дараагийн хичээлд:

Merge хийхэд conflict гарсан үед хэрхэн шийдвэрлэхийг судална.