Git branch’larni birlashtirish (merge)
Git branch’larni birlashtirish (merge)
Git’da birlashtirish (merge) nima?
Git’da birlashtirish (merge) — bir branch’dagi o‘zgarishlarni boshqasiga qo‘shish demakdir.
Turli funksiyalar yoki xato tuzatishlari ustida alohida ishlagandan so‘ng ishingizni shu tarzda bir joyga jamlaysiz.
git merge buyrug‘ining keng tarqalgan parametrlari
- git merge - Branch’ni joriy branch’ingizga birlashtirish
- git merge --no-ff - Har doim merge commit yaratish
- git merge --squash - O‘zgarishlarni bitta commit’ga jamlash
- git merge --abort - Jarayondagi merge’ni bekor qilish
Branch’larni birlashtirish (git merge)
Bir branch’dagi o‘zgarishlarni boshqasiga birlashtirish uchun git merge buyrug‘idan foydalaning.
Odatda avval o‘zgarishlarni qaysi branch’ga birlashtirmoqchi bo‘lsangiz, o‘sha branch’ga o‘tasiz (ko‘pincha main yoki master), so‘ng qo‘shmoqchi bo‘lgan branch nomi bilan merge buyrug‘ini ishga tushirasiz.
Avval master branch’iga o‘tishimiz kerak:
Misol
git checkout master
Switched to branch 'master'
Endi joriy branch’ni (master) emergency-fix bilan birlashtiramiz:
Misol
git merge emergency-fix
Updating 09f4acd..dfa79db
Fast-forward
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
emergency-fix branch’i to‘g‘ridan-to‘g‘ri master’dan yaratilgani va biz ishlayotgan vaqtda master’ga boshqa o‘zgarishlar kiritilmagani uchun Git buni master’ning davomi deb hisoblaydi.
Shuning uchun u “Fast-forward” qila oladi, ya’ni master’ni ham, emergency-fix’ni ham bitta commit’ga yo‘naltiradi.
Branch’larni birlashtirish bo‘yicha eng yaxshi amaliyotlar
- Merge’ni boshlashdan oldin har doim o‘zgarishlaringizni commit qiling yoki stash’ga saqlang.
- Ziddiyatlarni kamaytirish uchun asosiy branch’dan funksiya branch’ingizga muntazam ravishda merge qilib turing.
- Ziddiyatlarni diqqat bilan o‘qing va hal qiling — barcha o‘zgarishlarni ko‘r-ko‘rona qabul qilmang.
- Aniq va tavsiflovchi merge commit xabarlarini yozing.
Amaliy misollar
- Merge’ni bekor qilish:
git merge --abort - Merge davomida holatni tekshirish:
git status - Ziddiyatni hal qilish va merge’ni yakunlash: Ziddiyatli fayl(lar)ni tahrirlang, so‘ng
git add filevagit commitbuyruqlarini bajaring - Fast-forward merge: Yangi commit’lar ajralib chiqmaganda sodir bo‘ladi — Git shunchaki branch ko‘rsatkichini oldinga suradi.
- No-fast-forward merge: Branch tarixini saqlab qolgan holda har doim merge commit yaratish uchun
git merge --no-ff branchparametridan foydalaning.
Endi master va emergency-fix amalda bir xil bo‘lgani uchun emergency-fix’ni o‘chirishimiz mumkin, chunki u endi kerak emas:
Misol
git branch -d emergency-fix
Deleted branch emergency-fix (was dfa79db).
Non-fast-forward merge (git merge --no-ff)
Standart holatda, agar branch’ingizni fast-forward usulida birlashtirish mumkin bo‘lsa (asosiy branch’da yangi commit’lar bo‘lmasa), Git shunchaki branch ko‘rsatkichini oldinga suradi.
Agar har doim merge commit yaratishni istasangiz (tarixni tushunarliroq saqlash uchun), git merge --no-ff branchname parametridan foydalaning.
Misol
git merge --no-ff feature-branch
Merge made by the 'recursive' strategy.
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Squash merge (git merge --squash)
Agar branch’dagi barcha o‘zgarishlarni (har bir commit’ni saqlab qolish o‘rniga) bitta commit’ga jamlamoqchi bo‘lsangiz, git merge --squash branchname parametridan foydalaning.
Bu merge qilishdan oldin commit tarixini tartibga keltirish uchun foydali.
Misol
git merge --squash feature-branch
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
Merge’ni bekor qilish (git merge --abort)
Agar merge davomida muammoga duch kelsangiz (masalan, hal qilishni istamagan ziddiyatga), git merge --abort yordamida merge’ni bekor qilib, avvalgi holatga qaytishingiz mumkin.
Misol
git merge --abort
Merge ziddiyati (conflict) nima?
Merge ziddiyati (merge conflict) ikki branch’dagi o‘zgarishlar faylning bir xil qismiga tegib ketganda va Git qaysi versiyani saqlab qolishni bilmaganda yuzaga keladi.
Buni ikki kishining hujjatdagi bir xil gapni turlicha tahrirlashiga o‘xshatish mumkin — qaysi versiyadan foydalanishni hal qilishda Git’ga sizning yordamingiz kerak.
Merge ziddiyatini qanday hal qilish mumkin
Git faylingizdagi ziddiyatni belgilab qo‘yadi.
Faylni ochib, <<<<<<< HEAD va ======= kabi qatorlarni topishingiz va yakuniy versiya qanday bo‘lishi kerakligini hal qilishingiz kerak.
So‘ng o‘zgarishlaringizni stage va commit qiling.
Muammolarni bartaraf etish va maslahatlar
- Agar merge’ni bekor qilmoqchi bo‘lsangiz,
git merge --abortbuyrug‘idan foydalaning. - Merge’ni boshlashdan oldin har doim o‘zgarishlaringizni commit qiling yoki stash’ga saqlang.
- Ziddiyat belgilarini diqqat bilan o‘qing va muammoni hal qilganingizdan so‘ng ularni olib tashlang.
- Qaysi fayllar e’tiboringizni talab qilishini ko‘rish uchun
git statusbuyrug‘idan foydalaning. - Agar ishonchingiz komil bo‘lmasa, jamoadoshingizdan so‘rang yoki xato xabarini qidirib ko‘ring.
Merge ziddiyati misoli
Endi o‘tgan bobdagi hello-world-images’ga o‘tib, ishni davom ettirishimiz mumkin.
Yana bitta rasm fayli (img_hello_git.jpg) qo‘shing va index.html’ni u ko‘rsatiladigan qilib o‘zgartiring:
Misol
git checkout hello-world-images
Switched to branch 'hello-world-images'
Misol
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<p>A new line in our file!</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>
</body>
</html>
Endi bu yerdagi ishimiz tugadi, bu branch uchun stage va commit qilishimiz mumkin:
Misol
git add --all
git commit -m "added new image"
[hello-world-images 1f1584e] added new image
2 files changed, 1 insertion(+)
create mode 100644 img_hello_git.jpg
index.html ikkala branch’da ham o‘zgartirilganini ko‘ramiz.
Endi hello-world-images’ni master’ga birlashtirishga tayyormiz.
Lekin yaqinda master’da kiritgan o‘zgarishlarimiz bilan nima bo‘ladi?
Misol
git checkout master
git merge hello-world-images
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Merge muvaffaqiyatsiz tugadi, chunki index.html versiyalari o‘rtasida ziddiyat bor.
Keling, holatni tekshiraylik:
Misol
git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
new file: img_hello_git.jpg
new file: img_hello_world.jpg
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
Bu index.html’da ziddiyat borligini tasdiqlaydi, lekin rasm fayllari tayyor va commit qilish uchun stage qilingan.
Demak, bu ziddiyatni tuzatishimiz kerak. Faylni muharririmizda ochamiz:
Misol
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<<<<<<< HEAD
<p>This line is here to show how merging works.</p>
=======
<p>A new line in our file!</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>
>>>>>>> hello-world-images
</body>
</html>
Versiyalar o‘rtasidagi farqlarni ko‘rishimiz va uni o‘zimiz xohlagandek tahrirlashimiz mumkin:
Misol
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<p>This line is here to show how merging works.</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>
</body>
</html>
Endi index.html’ni stage qilib, holatni tekshirishimiz mumkin:
Misol
git add index.html
git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
new file: img_hello_git.jpg
new file: img_hello_world.jpg
modified: index.html
Ziddiyat tuzatildi, endi merge’ni yakunlash uchun commit’dan foydalanishimiz mumkin:
Misol
git commit -m "merged with hello-world-images after fixing conflicts"
[master e0b6038] merged with hello-world-images after fixing conflicts
Va hello-world-images branch’ini o‘chiramiz:
Misol
git branch -d hello-world-images
Deleted branch hello-world-images (was 1f1584e).
Endi branch’lar va birlashtirish (merge) qanday ishlashini yaxshiroq tushunasiz.
Masofaviy repozitoriy bilan ishlashni boshlash vaqti keldi!
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!

GitHub
Bitbucket
GitLab