(Bu yinelenen bir soruya yanıt olarak başladı. Temizlemek için biraz ışık düzenleme yaptım.)
Git'in tüm iç okları tek yönlüdür ve geriye dönüktür. Bu nedenle, ileriye doğru hareket etmek için kısa ve uygun bir sözdizimi yoktur: bu mümkün değildir.
Bu ise sen sonra önceden görmüş ve ardından belirgin değil eğer "oklarıyla karşı hareket", ancak şaşırtıcı yapmanız şekilde mümkün. Diyelim ki elimizde:
A <-B <-C <-D <-E <-- last
^
|
\--------- middle
Kullanmak middle~2okları Carkadan iki kez takip eder A. Öyleyse nasıl hareket Cediyoruz D? Cevap: Biz başlayacak Eadını kullanarak, lastbiz gelinceye kadar ve çalışma geriye middle, yol boyunca ziyaret noktaları kayıt . Sonra sadece istediğimiz kadar ilerleriz last: bir adım Dya da iki adım E.
Bu, şubelerimiz olduğunda özellikle önemlidir:
D--E <-- feature1
/
...--B--C <-- master
\
F--G <-- feature2
Bir adım sonra hangi taahhüt var C? Soruya eklenene kadar doğru cevap yoktur: özellik_ yönünde (boşluğu doldurun).
Kendisi arasındaki C(hariç C) taahhütleri numaralandırmak için şunu Gkullanırız:
git rev-list --topo-order --ancestry-path master..feature2
Bu --topo-order, karmaşık dallanma ve birleştirme mevcudiyetinde bile, taahhütlerin topolojik olarak sıralanmış şekilde çıkmasını sağlar. Bu sadece zincir doğrusal değilse gereklidir. --ancestry-pathBiz geriye doğru zaman zorlama aracının o feature2var biz sadece liste kaydedilmesini taahhüt Ckendi atalarından biri olarak. Yani, grafik - ya da yine de onun ilgili parçası - aslında şöyle görünüyorsa:
A--B--C <-- master
\ \
\ F--G--J <-- feature2
\ /
H-------I <-- feature3
Formun basit bir istek feature2..masterkaydedilmesini sıralar J, Gve I, ve Fve Hbazı sırayla. İle --ancestry-pathbiz nakavt Hve I: onlar soyundan değildir Csadece, A. İle --topo-orderbiz gerçek numaralandırma düzeni olduğundan emin olmak J, sonra Gsonra, F.
git rev-listKomut standart çıktı satıra bir tane üzerinde bu karma kimlikleri dökülür. Bir adım ileri gitmek için feature2, sadece son çizgiyi istiyoruz .
Mümkün (ve cazip ve kullanışlı olabilir) eklemek --reverseböylece git rev-listonları oluşturduktan sonra ters sırayla baskılar kaydedilmesini. Bu işe yarar, ancak böyle bir boru hattında kullanırsanız:
git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1
sadece "id2 yönünde bir sonraki taahhüdü" elde etmek için ve çok uzun bir taahhüt listesi var, git rev-listkomut yazmayı denediğinde headgirdisini okumayı bırakıp çıkmaya çalıştığında kırık bir boru alabilir . Kırık boru hataları normalde kabuk tarafından göz ardı edildiğinden, bu çoğunlukla işe yarar. Emin onlar göz ardı ediyoruz yapmak sizin kullanım.
Ayrıca eklemek cazip gelebilir -n 1için git rev-listbirlikte komuta --reverse. Yapma! Bu, git rev-listbir adım geri yürüdükten sonra durur ve ardından ziyaret edilen taahhütlerin (tek girişli) listesini tersine çevirir. Yani bu <id2>her seferinde ortaya çıkıyor.
Önemli not
"Pırlanta" veya "benzen halkası" grafik parçaları ile:
I--J
/ \
...--H M--... <-- last
\ /
K--L
bir taahhüdü "ileri" ye Hdoğru hareket ettirmek yalast size ya I da K . Bu konuda yapabileceğiniz hiçbir şey yok: her iki taahhüt de bir adım ileri! Daha sonra, sonuçta ortaya çıkan işlemden başlayıp başka bir adıma geçerseniz, şimdi hangi yola başladığınızı taahhüt edersiniz.
Bunun tedavisi, her seferinde bir adım hareket etmekten ve yola bağlı zincirlere kilitlenmekten kaçınmaktır. Bunun yerine, başka bir şey yapmadan önce tüm soy yolu zincirini ziyaret etmeyi planlıyorsanız , zincirdeki tüm taahhütlerin tam bir listesini yapın:
git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits
Ardından, bu listedeki her bir taahhüdü birer birer ziyaret edin ve tüm zinciri alacaksınız. --topo-orderEğer isabet sağlayacağız I-ve- Jbu sırayla ve K-ve- L(KL çifti önce veya sonra IJ çifti yapacağız olmadığını tahmin etmek kolay bir yolu yok olsa) bu sırayla.