(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~2
okları C
arkadan iki kez takip eder A
. Öyleyse nasıl hareket C
ediyoruz D
? Cevap: Biz başlayacak E
adını kullanarak, last
biz gelinceye kadar ve çalışma geriye middle
, yol boyunca ziyaret noktaları kayıt . Sonra sadece istediğimiz kadar ilerleriz last
: bir adım D
ya 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 G
kullanı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-path
Biz geriye doğru zaman zorlama aracının o feature2
var biz sadece liste kaydedilmesini taahhüt C
kendi 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..master
kaydedilmesini sıralar J
, G
ve I
, ve F
ve H
bazı sırayla. İle --ancestry-path
biz nakavt H
ve I
: onlar soyundan değildir C
sadece, A
. İle --topo-order
biz gerçek numaralandırma düzeni olduğundan emin olmak J
, sonra G
sonra, F
.
git rev-list
Komut 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 --reverse
böylece git rev-list
onları 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-list
komut yazmayı denediğinde head
girdisini 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 1
için git rev-list
birlikte komuta --reverse
. Yapma! Bu, git rev-list
bir 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 H
doğ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-order
Eğer isabet sağlayacağız I
-ve- J
bu 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.