-
1. BaÅlanÄıc
- 1.1 Versiyaya NÉzarÉt Haqqında
- 1.2 Gitāin Qısa HekayÉsi
- 1.3 Git NÉdir?
- 1.4 Ęmr SÉtiri
- 1.5 Gitāi QuraÅdırmaq
- 1.6 İlk DÉfÉ Git QuraÅdırması
- 1.7 KƶmÉk Almaq
- 1.8 Qısa MÉzmun
-
2. Gitāin Ęsasları
-
3. GitādÉ Branch
-
4. ServerādÉ Git
- 4.1 Protokollar
- 4.2 ServerdÉ Git ĘldÉ EtmÉk
- 4.3 Sizin ƶz SSH Public Keyānizi yaratmaq
- 4.4 Server qurmaq
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Ćçüncü TÉrÉf SeƧimlÉri
- 4.10 Qısa MÉzmun
-
5. PaylanmıŠGit
-
6. GitHub
-
7. Git AlÉtlÉri
- 7.1 Reviziya SeƧimi
- 7.2 Interaktiv SÉhnÉlÉÅdirmÉ
- 7.3 Stashing vÉ TÉmizlÉmÉ
- 7.4 İÅinizin İmzalanması
- 7.5 AxtarıÅ
- 7.6 Tarixi YenidÉn Yazmaq
- 7.7 Reset Demystified
- 7.8 İnkiÅaf etmiÅ BirlÉÅmÉ
- 7.9 Rerere
- 7.10 Git ilÉ Debugging
- 7.11 Alt Modullar
- 7.12 Bundling
- 7.13 DÉyiÅdirmÉk
- 7.14 Etibarlı YaddaÅ
- 7.15 Qısa MÉzmun
-
8. Gitāi FÉrdilÉÅdirmÉk
-
9. Git vÉ DigÉr SistemlÉr
- 9.1 Git MüÅtÉri kimi
- 9.2 GitāÉ Miqrasiya
- 9.3 Qısa MÉzmun
-
10. Gitāin Daxili İÅlÉri
- 10.1 Plumbing vÉ Porcelain
- 10.2 Git ObyektlÉri
- 10.3 Git Referansları
- 10.4 Packfileālar
- 10.5 Refspec
- 10.6 Transfer Protokolları
- 10.7 Maintenance vÉ MÉlumatların BÉrpası
- 10.8 Mühit DÉyiÅÉnlÉri
- 10.9 Qısa MÉzmun
-
A1. Appendix A: DigÉr MühitlÉrdÉ Git
- A1.1 Qrafik interfeyslÉr
- A1.2 Visual Studioāda Git
- A1.3 Visual Studio Codeāda Git
- A1.4 EclipseādÉ Git
- A1.5 Sublime TextādÉ Git
- A1.6 Bashāda Git
- A1.7 ZshādÉ Git
- A1.8 PowerShellādÉ Git
- A1.9 Qısa MÉzmun
-
A2. Appendix B: Proqramlara Git Daxil EtmÉk
- A2.1 Ęmr-sÉtri Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Git ĘmrlÉri
- A3.1 QuraÅdırma vÉ Konfiqurasiya
- A3.2 LayihÉlÉrin Alınması vÉ Yaradılması
- A3.3 SadÉ Snapshotting
- A3.4 Branching vÉ BirlÉÅmÉ
- A3.5 LayihÉlÉrin PaylaÅılması vÉ YenilÉnmÉsi
- A3.6 Yoxlama vÉ MüqayisÉ
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-poƧt
- A3.10 Xarici SistemlÉr
- A3.11 İdarÉetmÉ
- A3.12 Plumbing ĘmrlÉri
3.6 GitādÉ Branch - Rebasing
Rebasing
GitādÉ dÉyiÅikliklÉri bir budaqdan digÉrinÉ birlÉÅdirmÉyin iki Ésas yolu var: merge
vÉ rebase
.
Bu bƶlmÉdÉ rebase-in nÉ olduÄunu, bunu necÉ edÉcÉyinizi, niyÉ olduqca gƶzÉl bir vasitÉdir vÉ hansı hallarda istifadÉ etmÉk istÉmÉdiyinizi ƶyrÉnÉcÉksiniz.
SadÉ Rebase
ĘvvÉlki bir nümunÉyÉ qayıtsanız SadÉ BirlÉÅdirmÉ, iÅinizi bƶlüÅdürdüyünüzü vÉ iki fÉrqli branch-da qÉrar verdiyinizi gƶrÉ bilÉrsiniz.

Branch-ları birlÉÅdirmÉyin Én asan yolu, yuxarıda bÉhs etdiyimiz kimi, merge
Émridir.
İki Én son branch snapshotu (C3
vÉ` C4`) vÉ ikisinin Én son ortaq ancestor-u (C2
) arasında üç tÉrÉfli birlÉÅmÉ hÉyata keƧirir, yeni bir snapshot yaradır (vÉ commit edir).

Ancaq baÅqa bir yol var: C4
-dÉ tÉqdim edilÉn dÉyiÅikliyin patch-ını gƶtürüb C3
-ün üstünÉ yenidÉn tÉtbiq edÉ bilÉrsiniz.
Git-dÉ buna rebasing deyilir.
rebase
Émri ilÉ bir branch-da edilmiÅ bütün dÉyiÅikliklÉri gƶtürüb baÅqa bir branch-da tÉkrarlaya bilÉrsiniz.
Bu misal üçün experiment
branch-ını yoxlayıb, master
branch-a aÅaÄıdakı kimi qaytarın:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
Bu ÉmÉliyyat iki branch-ın ortaq ancestor-una (birinÉ davam etdiyiniz vÉ birinÉ rebasing etdiyiniz) gedÉrÉk iÅlÉyir,olduÄunuz branch-ın hÉr bir commit-i tÉrÉfindÉn tÉqdim olunan fÉrqlÉri ÉldÉ edÉrÉk, hÉmin fÉrqlÉri müvÉqqÉti sÉnÉdlÉrdÉ saxlayaraq iÅlÉyir, hazırkı branch-ı yenidÉn düzÉltdiyiniz branch-la eyni commit-É bÉrpa edin vÉ nÉhayÉt hÉr dÉyiÅikliyi ƶz nƶvbÉsindÉ tÉtbiq edin.

C4`dÉ `C3
-É edilÉn dÉyiÅikliyin rebasing edilmÉsiBu nƶqtÉdÉ, master
branch-a qayıda vÉ sürÉtli bir ÅÉkildÉ birlÉÅÉ bilÉrsiniz.
$ git checkout master
$ git merge experiment

master
branch-ıİndi C4
-ün iÅarÉlÉdiyi snapshot <the merge example-dÉ C5
ilÉ iÅarÉlÉnmiÅ snapshotla eynidir.
İnteqrasiyanın son mÉhsulu arasında heƧ bir fÉrq yoxdur, lakin rebasing daha tÉmiz bir tarix yaradır.
Rebase edilmiÅ bir branch-ın log-larını araÅdırsanız, xÉtti bir tarixÉ bÉnzÉyir: gƶrünür ki, bütün iÅlÉr ÉvvÉlcÉ paralel olaraq baÅ versÉ dÉ, bütün iÅlÉrin ardıcıllıqla baÅ verdiyi anlaÅılır.
Tez-tez verdiyiniz tapÅırıqların uzaq bir branch-a tÉmiz tÉtbiq olunmasını tÉmin etmÉk üçün bunu edÉcÉksiniz - tƶhfÉ vermÉyÉ Ć§alıÅdıÄınız, ancaq qorumadıÄınız bir layihÉdÉ.
Bu vÉziyyÉtdÉ iÅinizi bir branch-da edÉr vÉ sonra patch-larını Ésas layihÉyÉ tÉqdim etmÉyÉ hazır olduÄunuz zaman iÅinizi origin/master
-É ya dÉyiÅdirÉrdiniz.
Bu yolla, qoruyucu heƧ bir inteqrasiya iÅi gƶrmÉmÉlidir - sadÉcÉ irÉli vÉ ya tÉmiz tÉtbiq olunmalıdır.
DiqqÉt yetirin ki, baÅa ƧatdıÄınız son commit-in gƶstÉrildiyi snapshot, istÉr bir düzÉltmÉ Émrinin sonuncusu olsun, istÉrsÉ birlÉÅmÉdÉn sonra edilÉn son birlÉÅmÉ, eyni Rebasing dÉyiÅikliklÉrini bir iÅ xÉttindÉn digÉrinÉ tÉqdim edilmiÅ qaydada dÉyiÅdirir, birlÉÅmÉ isÉ son nƶqtÉlÉri gƶtürÉrÉk onları birlÉÅdirir.
Daha Maraqlı Rebase-lÉr
Ayrıca, rebase hÉdÉf branch-ında baÅqa bir ÅeydÉ yenidÉn istifadÉ edÉ bilÉrsiniz.
MÉsÉlÉn, BaÅqa bir mƶvzu branch-ından bir mƶvzu branch-a olan bir tarix kimi bir tarix ƧÉkin.
LayihÉinizÉ bÉzi server tÉrÉfi funksionallıq ÉlavÉ etmÉk üçün bir mƶvzu branch-nı (server
) ÉlavÉ etdiniz vÉ commit yaratdınız.
Sonra müÅtÉri tÉrÉfindÉ dÉyiÅiklik etmÉk üçün (client
) branch-ı düzÉldin vÉ bir neĆ§É dÉfÉ commit edin.
NÉhayÉt, yenidÉn server branch-ınıza qayıtdınız vÉ daha bir neĆ§É commit etdiniz.

Tutaq ki, bir müÅtÉri tÉrÉfindÉki dÉyiÅikliklÉri sÉrbÉst buraxmaq üçün ana xÉttinizÉ birlÉÅdirmÉk istÉdiyinizÉ qÉrar verirsiniz, ancaq daha sonra sınaqdan keƧirilmÉyincÉ server tÉrÉfindÉki dÉyiÅikliklÉri dayandırmaq istÉyÉrsiniz.
server
-dÉ (` C8` vÉ C9
) olmayan client
-dÉki dÉyiÅikliklÉri gƶtürüb git rebase
-in --onto
seƧimini istifadÉ edÉrÉk master
branch-ındÉ tÉkrarlaya bilÉrsiniz:
$ git rebase --onto master server client
Bu, ÉsasÉn ā` client' branch-nı gƶtürün, `server
branch-ından ayrıldıÄından patch-ları müÉyyÉnlÉÅdirin vÉ bu patch-ları client
branch-ında birbaÅa master
branch-ından kÉnarda qurulmuÅ kimi tÉkrarlayın . 'ā
Biraz mürÉkkÉb olsa da, amma nÉticÉ olduqca gƶzÉldir.

İndi master
branch-ınızı sürÉtlÉ irÉlilÉyÉ apara bilÉrsiniz ( Client branch-ındakı dÉyiÅikliklÉri daxil etmÉk üçün master
branch-ınızı sürÉtli yƶnlÉndirin-É bax):
$ git checkout master
$ git merge client

master
branch-ınızı sürÉtli yƶnlÉndirinDeyÉk ki, hÉm dÉ server branch-nızı pull etmÉyÉ qÉrar verdiniz. git rebase <basebranch> <topicbranch>
-ı iÅÉ salmaqdan ÉvvÉl server
branch-ını master
branch -a rebase edÉ bilÉrsiniz. Mƶvzu branch-nı yoxlayır (bu vÉziyyÉtdÉ, server
) vÉ Ésas branch-a (master
) qaytarır.
$ git rebase master server
Bu, server
iÅinizi master
iÅinizin üstündÉ, Server branch-nızı master
branch-nızın üstünÉ rebasing etmÉk-da gƶstÉrildiyi kimi tÉkrarlayır.

master
branch-nızın üstünÉ rebasing etmÉkSonra Ésas branch-ı (master
) sürÉtlÉ irÉli sürÉ bilÉrsiniz:
$ git checkout master
$ git merge server
Bütün iÅlÉr inteqrasiya olunduÄuna gƶrÉ, client
vÉ server
branch-larını silÉ bilÉrsiniz, bu da bütün bu proses üçün tarixinizi Son commit tarixi kimi qoyur:
$ git branch -d client
$ git branch -d server

Rebasing-in TÉhlükÉlÉri
Ahh, lakin ƧatıÅmazlıqlar olmadan rebasing-in zƶvqü olmaz,hansı ki onları bir sÉtirdÉ yekunlaÅdırmaq olar.
Depolarınızdan kÉnarda mƶvcud olan vÉ insanların üzÉrindÉ iÅlÉyÉ bildiklÉri commitlÉri rebase etmÉyin.
Bu qaydaya ÉmÉl etsÉniz, yaxÅı olacaqsınız. Bunu etmÉsÉniz, insanlar sizÉ nifrÉt edÉcÉklÉr vÉ dostlarınız vÉ ailÉniz tÉrÉfindÉn rüsvay olacaqsınız.
ĘÅyaları rebase etdiyinizdÉ mƶvcud commit-lÉrdÉn imtina edirsiniz vÉ oxÅar, lakin fÉrqli olanları yaradırsınız.
ĘgÉr commit-lÉri bir yerÉ push etsÉniz vÉ baÅqaları onları aÅaÄı pull edib üzÉrindÉ iÅlÉyirsÉ, sonra git rebase
ilÉ yenidÉn yazıb yenidÉn push etsÉniz, iÅ yoldaÅların iÅlÉrini yenidÉn birlÉÅdirmÉyÉ mÉcbur olacaqlar vÉ iÅlÉriniz qarıÅıq olacaq. Ona gƶrÉ iÅlÉrini ƶzünüzÉ qaytarmaÄa ƧalıÅın.
Ćublic etdiyiniz iÅin rebasing olunanda problem yarada bilÉcÉyinÉ dair bir nümunÉyÉ baxaq. Tutaq ki, mÉrkÉzi bir serverdÉn klonlaÅdırırsınız vÉ daha sonra bir az iÅ gƶrürsünüz.
Commit tarixƧÉniz belÉ gƶrünür:

İndi baÅqası birlÉÅmÉyi ÉhatÉ edÉn daha Ƨox iÅ gƶrür vÉ mÉrkÉzi serverÉ iÅlÉyir. Siz gƶtürün vÉ yeni uzaq branch-ı iÅinizÉ birlÉÅdirÉrÉk tarixinizi bu kimi bir hala gÉtirin:

Sonra birlÉÅÉn iÅi push edÉn ÅÉxs geri qayıtmaÄı vÉ iÅlÉrini dÉyiÅdirmÉyi qÉrara alır; serverdÉki tarixi yenidÉn yazmaq üçün git push --force
tÉtbiq edirlÉr.
Daha sonra yeni commit-lÉri gÉtirÉrÉk hÉmin serverdÉn alırsınız.

İndi ikiniz dÉ turÅu iƧindÉsiniz.
Bir git pull
etsÉniz, tarixin hÉr iki xÉttini ƶzündÉ birlÉÅdirÉn birlÉÅmÉ ÉmÉliyyatı yaradacaqsınız vÉ depo bu cür gƶrünÉcÉk:

Tarixiniz bu kimi gƶrünÉndÉ git log
iÅlÉdirsinizsÉ, qarıÅıqlıq yaradan eyni müÉllif, tarix vÉ mesajı olan iki commit gƶrürsünüz.
Bundan ÉlavÉ, bu tarixi yenidÉn serverÉ push etsÉniz, insanları qarıÅdıra bilÉcÉk bütün ÉvÉz edilmiÅ sÉnÉdlÉri mÉrkÉzi serverÉ yenidÉn tÉqdim etmiÅ olacaqsınız.
DigÉr developerin C4
vÉ C6
-ların tarixdÉ olmasını istÉmÉdiyini güman etmÉk olduqca tÉhlükÉsizdir; buna gƶrÉ ilk nƶvbÉdÉ yenidÉn Ƨap etdilÉr.
Rebase etdiyiniz zaman yenidÉn yazın
ĘgÉr belÉ bir vÉziyyÉtdÉ Ć¶zünüzü taparsanız, Git sizÉ kƶmÉk edÉ bilÉcÉk daha bir sehrÉ sahibdir. ĘgÉr komandanızdakı kimsÉ iÅÉ ÉsaslandıÄınız iÅin üzÉrindÉ yazılan dÉyiÅikliklÉri push edirsÉ, problem sizin kim olduÄunuzu vÉ yenidÉn yazdıqlarını anlamaqdır.
MÉlum olub ki, SHA-1 yoxlama cÉdvÉlinÉ ÉlavÉ olaraq, Git yalnız commit ilÉ tÉqdim olunan patch-a Ésaslanan bir Ƨek mÉblÉÄini dÉ hesablayır. Buna āpatch-idā deyilir.
YenidÉn yazılmıŠiÅi pull doün etsÉniz vÉ tÉrÉfdaÅınızdan aldıÄınız yeni iÅin üstünÉ yazsanız, Git tez-tez misilsiz sizin nÉyi baÅa düÅdüyünüzü yeni branch-ın üstünÉ tÉtbiq edÉ bilÉr.
MÉsÉlÉn, ÉvvÉlki ssenaridÉ, ÉgÉr KimsÉ iÅinizÉ Ésaslanaraq verdiyiniz commit-lÉri tÉrk edÉrÉk, rebase edilmiÅ commit-lÉri push edir olduÄumuz zaman birlÉÅmÉ yerinÉ git rebase teamone/master
iÅlÉdiriksÉ, Git:
-
Branch-ımız üçün hansı iÅin ƶzünÉmÉxsus olduÄunu müÉyyÉnlÉÅdirin (C2, C3, C4, C6, C7)
-
Hansıların birlÉÅmÉdiyini tÉyin edin (C2, C3, C4)
-
HÉdÉf branch-ına yenidÉn yazılmayanları tÉyin edin (C4 C4 'ilÉ eyni patch olduÄundan)
-
Bu commit-lÉri
teamone/master
baÅına tÉtbiq edin
BelÉliklÉ, Eyni iÅdÉ yenidÉn yeni birlÉÅmÉ commit-nÉ qoÅulursunuz-dÉ gƶrdüyümüz nÉticÉnin ÉvÉzinÉ daha Ƨox Force-pushed rebase iÅÉ yenidÉn baÅlayın kimi bir ÅeylÉ nÉticÉlÉnÉrdik.

Bu yalnız ortaÄınızın hazırladıÄı C4
vÉ C4'
demÉk olar ki, eyni bir patch olduqda iÅlÉyir.
Ęks tÉqdirdÉ, yenidÉn yüklÉmÉ bunun bir dublikat olduÄunu sƶylÉyÉ bilmÉyÉcÉk vÉ baÅqa bir C4-É bÉnzÉr bir yamaq ÉlavÉ edÉcÉkdir (ehtimal ki, tÉmiz tÉtbiq olunmayacaq, çünki dÉyiÅikliklÉr heƧ olmasa orada olacaq).
Normal bir git pull
yerinÉ git pull --rebase
iÅlÉtmÉklÉ bunu asanlaÅdıra bilÉrsiniz.
VÉ ya bu vÉziyyÉtdÉ git rebase teamone/master
ardınca git fetch
ilÉ manual edÉ bilÉrsiniz.
git pull
istifadÉ edirsinizsÉ vÉ --rebase
standart etmÉk istÉyirsinizsÉ, git config --global pull.rebase true
kimi bir Åey ilÉ pull.rebase
konfiqurasiya dÉyÉrini tÉyin edÉ bilÉrsiniz.
HeƧ vaxt ƶz kompüterinizi tÉrk etmÉyÉn commit-lÉri yenidÉn yerinÉ yetirsÉniz, yaxÅı olacaqsınız. ĘgÉr push etdiyiniz commit-lÉri geri qaytarsanız, lakin baÅqa heƧ kim Ésas gƶtürmÉmiÅsÉ, hÉmƧinin yaxÅı olacaqsınız. ĘgÉr siz ÉvvÉlcÉdÉn ictimailÉÅdirilmiÅ commit-lÉri geri qaytarsanız vÉ insanlar bu commit-lÉri Ésas gƶtürsÉlÉr, o zaman bÉzi narahat problemlÉrÉ vÉ komanda yoldaÅlarınızın qınaÄına düÅÉ bilÉrsiniz.
ĘgÉr siz vÉ ya tÉrÉfdaÅ bir anda zÉruri hesab edirsinizsÉ,hÉr kÉsin git pull --rebase
iÅlÉtdiyini bildiyinizdÉn Émin olun ki, bu da bir az daha sadÉ olur.
Rebase vs BirlÉÅdirmÉk
İndi siz rebasing vÉ birlÉÅdirmÉ hÉrÉkÉtlÉrini gƶrdünüz, hansının daha yaxÅı olduÄunu düÅünÉ bilÉrsiniz. Buna cavab vermÉzdÉn ÉvvÉl bir az geri ƧÉkilib tarixin nÉ demÉk olduÄunu danıÅaq.
Bu baxımdan bir mÉqam odur ki, depozit tarixƧÉnizin tarixƧÉsi ÉslindÉ baÅ verÉnlÉrin qeydidir. Tarixi bir sÉnÉddir, ƶz dÉyÉrindÉdir vÉ dÉyiÅdirilmÉmÉlidir. Bu baxımdan, commit tarixinin dÉyiÅdirilmÉsi demÉk olar ki, küfrdür; ÉslindÉ nÉyi ƶtürdüyünüz barÉdÉ lying danıÅırsınız. BirlÉÅmÉyin qarıÅıq sıra seriyası varsa nÉ olacaq? Bu belÉ oldu vÉ depoları bunu sonrakı nÉsillÉr üçün saxlamalıdır.
QarÅı nƶqtÉ, commit tarixinin olmasıdır, yÉni layihÉnizin necÉ edildiyi haqqında hekayÉdir.
Bir kitabın ilk layihÉsini yayımlamazsınız vÉ proqramınızı necÉ qoruyacaÄınıza dair tÉlimat diqqÉtlÉ redaktÉyÉ etmÉlisiniz.
Bu, hekayÉni gÉlÉcÉk oxuculara Én yaxÅı ÅÉkildÉ izah etmÉk üçün rebase
vÉ filter-branch
kimi vasitÉlÉrdÉn istifadÉ edÉn düÅÉrgÉdir.
İndi gÉlÉk birlÉÅmÉyin vÉ ya rebasing etmÉyin daha yaxÅı olması sualına: ümid edirik bunun asan olmadıÄını gƶrÉrsiniz. Git güclü bir vasitÉdir vÉ tarixinizlÉ birlikdÉ Ć§ox Åey etmÉyÉ imkan verir, lakin hÉr komanda vÉ hÉr layihÉ fÉrqlidir.
Artıq hÉr ikisinin necÉ iÅlÉdiyini bildiyinizdÉn, hansınızın vÉziyyÉtiniz üçün Én uyÄun olduÄunu qÉrar vermÉyiniz sizÉ baÄlıdır.
ĆmumiyyÉtlÉ, hÉr iki dünyanın Én yaxÅısını qazanmaÄın yolu hekayÉnizi tÉmizlÉmÉk üçün onları tÉkzib etmÉdÉn ÉvvÉl etdiyiniz, lakin hÉlÉ paylaÅmadıÄınız yerli dÉyiÅikliklÉri geri qaytarmaqdır.