Yığılmış dallar
Yığın, her birinin altındakinin üzerine kurulduğu bir dal zinciridir:
main → api → ui. Üç küçük PR incelemek, tek bir devasa PR incelemekten iyidir.

Gitcito bunu bir güzergâh olarak çizer: en üstte bir başlangıç dalı, altında her katman için bir durak. Her durağın PR'ı üstündeki durağı hedefler, ilk durak da başlangıç dalına iner. Durak kendi commit'lerini, restack gerekip gerekmediğini ve gönderildikten sonra PR numarasını gösterir.
Güzergâhı düzenlemek
Uygula'ya basana kadar hiçbir şey çalışmaz. Bir dal seçmek, bir durağı taşımak, onu güzergâhtan çıkarmak — hepsi ekrandaki bir listeyi düzenler. Gerçek işlem dalları rebase eder ve checkout yapar; keşif amaçlı bir tıklamanın yapacağı iş değildir. Güzergâh doğru okununca Güzergâhı uygula onu tek ve geri alınabilir bir adım olarak yürütür; Vazgeç çizimi deponun söylediğine döndürür.
Güzergâh merge sırasına göre çizilir: üstteki dal altındakine merge olur, en altta da yığının indiği dal vardır.
| Denetim | Ne yapar |
|---|---|
| Başlangıç alanı | Yığının indiği yer. Değiştir; bütün zincir yeni dala bağlanır ve yeniden oynatılır. |
| Bir durağın alanı | O konumu hangi dalın tuttuğunu değiştirir. Güzergâhtan çıkan dal yalnızca çözülür, asla silinmez. |
| ↑ / ↓ | Durağı bir sıra taşır. |
| ✕ | Durağı güzergâhtan çıkarır; komşuları birleşir. |
| Durak ekle | Zaten sahip olduğun bir dalı seç, güzergâhın tepesine katılsın — ya da henüz olmayan bir ad yaz: son durağın ucunda oluşturulur ve ona geçilir. |
| Ok düğmesi | O durağa geçer (checkout). |
Bütün alanlar yazdıkça süzer: süzmek için yaz, seçmek için ↑/↓ ve Enter; listede
olmayan bir şey yazsan da geçerlidir — yani origin/main gibi uzak bir referans
başlangıç dalı olabilir.
Altta bu düzenlemelerin hepsi aynı işlemdir: güzergâhın tamamı, tek seferde geri verilir. Bu yüzden bir hareket tek bir geri alma (⌘Z) demektir; yarım uygulanmış bağlantı izleri değil.
Güzergâh değişikliğinin bedeli
Sırayı değiştiren her şey — takas, taşıma, başka bir başlangıç — zinciri yeniden oynatır: her durağın kendi commit'leri yeni temeline rebase edilir. Yani tıpkı restack gibi çakışabilir. Aynı satırlara dokunan iki durak, bir insan olmadan yer değiştiremez; böyle olduğunda hiçbir şey olmaz: değişikliğin tamamı geri alınır — uçlar, ebeveyn bağları ve yarım kalan rebase — ve Gitcito çarpışan iki durağı adıyla söyler. Dürttüğün bir açılır liste seni rebase'in ortasında bırakmamalı.
Restack anlaşmanın öteki yarısıdır: adıyla istediğin bir rebase olduğu için çakışmada durur ve çakışma görünümünü verir — bu aynı zamanda Gitcito'nun reddettiği sıralamayı elde etmenin yoludur: orada çöz, sonra durağı taşı.
Geri alma önceki güzergâhı yeniden oynatır. Eski commit'leri diriltmez, çünkü yenileri farklı ebeveynlerle aynı iştir.
Hepsini gönder
Hepsini gönder her katmanı --force-with-lease ile iter ve orada durur —
hiçbir şey açmadan gh stack push. Yığını PR olarak gönder aynı push'u yapıp
ardından PR işini de yapar; dalları uzakta isteyip incelemeye henüz hazır
değilsen Hepsini gönder'i kullan.
Yığını zincirlenmiş PR'lar olarak gönderme
Gönder önce sorar: kaç pull request açacağını, kaçını yeniden hedefleyeceğini,
hangi uzakta ve her biri için dal → temel satırını — PR açmak halka açıktır ve
geri alması zahmetlidir. Her gövdeye yazılan gezinme bölümü, zinciri
GitHub'da görünür kılan şeydir; GitHub'ın yığın diye bir kavramı yoktur.
Gönderme kendi ekranında olur: önce plan, sonra adım adım ilerleme, en sonunda da her pull request’in ve yığının bağlantıları.

Yığını PR olarak gönder, yığınlama araçlarının para aldığı işi tek tıkla yapar:
- Her seviyeyi
--force-with-leaseile push eder (taze dallar bunu tolere eder, yeniden yığılmış olanlarsa buna muhtaçtır). - PR'ı olmayan her seviye için bir PR açar — her biri
maine değil kendi ebeveyn dalına dayanır, böylece her inceleme yalnızca kendi commit'lerini gösterir. Başlık ve açıklama, seviyenin kendi commit'lerinden gelir. - Tabanı kaymış mevcut her PR'ı yeniden hedefler.
- Her PR gövdesine bir yığın gezinme bölümü yazar; böylece herhangi bir seviyedeki inceleyici zincirin tamamını ve bu PR'ın zincirdeki yerini görebilir.
Eylem idempotenttir: her yeniden yığmadan, yeni seviyeden veya birleşen PR'dan sonra basın, sonuç aynı noktaya yakınsar — hiçbir şey çoğaltılmaz, yalnızca kaymış olana dokunulur.
En alttaki PR birleştiğinde, aynı düğme arkasını da temizler: birleşen seviyenin çocuğu ana dala aktarılır, seviyenin izlemesi kaldırılır, yerel dalı silinir (güvenlidir — ana dalın onu içerdiği kanıtlanabilir), zincir yeniden yığılır ve kalan her PR yeniden hedeflenir. Aşağıdan yukarıya birleştirin, Gönder'e basın, tekrarlayın.
GitHub'da ayrıca gerçek bir yığın olur
Zincirlenmiş temeller her sunucunun anladığı şeydir; GitLab, Bitbucket ve Azure DevOps'ta olan da yalnızca budur. GitHub'da fazlası var: stacked pull requests önizlemesinden beri yığın, sunucu tarafında bir nesne. Pull request'ler oluştuktan sonra Gitcito onları — alttan üste — yığın olarak kaydeder; PR arayüzünde yığın haritasını, sunucu tarafında kademeli rebase'i ve en üstteki PR'da yapılan, altındaki tüm katmanları indiren bir merge'ü kazanırsın.
Depo o önizlemede değilse ya da belirteç yığınları yönetemiyorsa çağrı sessizce atlanır: zincir ve gezinme bölümü kendi başlarına ayakta durur, tıpkı diğer sunucularda olduğu gibi.
Yeniden yığma
Alttaki bir dal değiştiğinde — api üzerindeki inceleme yorumlarını
karşıladığınızda — onun üzerindeki her dal artık yanlış temelin üzerine kurulmuş
olur. Yeniden yığ, zincirin tamamını rebase --onto ile ardışık olarak rebase
eder; böylece bir ebeveynin yeniden yazılması commit'leri çocuklarına
kopyalamaz. Yeniden yığmadan sonra Gönder'e tekrar basın: yeniden yazılan
seviyeleri zorla push eder ve PR'lar yerinde güncellenir.
Sınırlar
- Gönderme şimdilik yalnızca GitHub içindir (oluşturma dört barındırıcının hepsinde çalışır, ancak yeniden hedefleme ve gövde güncellemeleri GitHub API'sini gerektirir).
- Alt birleşme temizliği merge ve rebase birleştirmelerini soy ilişkisinden, squash birleştirmelerini ise dalın PR'ının birleşip birleşmediğini GitHub'a sorarak görür — yani bir GitHub token'ıyla her birleştirme stili temizlenir. Diğer barındırıcılarda veya token olmadan, squash ile birleşen bir seviyenin izlemesi yine elle kaldırılmalıdır. Ayrıca önce fetch yapın — soy denetimi ana dalı son fetch'inizdeki haliyle okur.
- PR gövdesindeki yığın bölümü gizli işaretçiler arasında tutulur — onun üzerindeki kendi açıklamanız korunur.
- Yeniden sıralama ve ana dal değiştirme, dokundukları her katmanda geçmişi yeniden yazar. Dallar senindir ve gönderilmemiş katmanların maliyeti yoktur, ama zaten incelemede olan bir katman bir sonraki göndermede force-push yer.
- Bir katman seferde tek sıra yer değiştirir. İki takas iki rebase demektir ve yarıda kalmak okunaklı bir durumdur; üç sıra öteye düşen bir sürükleme değil.
- Bir durak rebase edilir, dolayısıyla yığının indiği dal asla aynı zamanda
durak olamaz; korumalı bir dal da olamaz (listeyi değiştirmedikçe
mainvemaster). İkisi de sessizce ortak geçmişi yeniden yazmak yerine reddedilir. - Gönderme, herhangi bir şey açmadan önce uzağa hangi dalların gerçekten ulaştığını sorar ve ulaşmayanları adıyla söyler. GitHub, eksik bir head'e kuru bir "Validation Failed" ile yanıt verir; kimsenin işine yaramaz. Yığının indiği dal da denetlenir: yalnızca yereldeyse gönderme, onu gönderip devam etmeyi önerir.
Bağlantılar nerede yaşar
Ebeveyn bağlantıları git config içinde saklanır, dolayısıyla depoyla birlikte yolculuk eder ve yeniden klonlamadan sağ çıkar. Hiçbir şey bir serviste yaşamaz.
Ayrıca bakınız: Etkileşimli rebase · Sunucular ve pull request'ler