SORU
6 EKİM 2009, Salı


Bulma Gıt ile şube bir nokta?

Şubeler usta ve bir havuz ve iki arasında birleştirme etkinliği var. Nasıl şube ustası dayalı oluşturulduğunda benim depo tamamlama bulabilirim?

Benim depo temel olarak bu gibi görünüyor:

-- X -- A -- B -- C -- D -- F  (master) 
          \     /   \     /
           \   /     \   /
             G -- H -- I -- J  (branch A)

git merge-base (--all) bulur ne olduğu değil, revizyon, arıyorum.

CEVAP
14 ŞUBAT 2011, PAZARTESİ


Aynı şeyi arıyordum ve buldum. Bunu sorduğunuz için teşekkür ederim!

Ancak, burada gördüğüm cevap gelmiyor buldumoldukçaG ver gibiler etmek için (ya arıyordum bu talep, yerine A commit cevap ver.

Bu yüzden, aşağıdaki ağaç (mektuplar kronolojik sıraya göre atanan) yarattık, bir şeyleri test etmek istiyorum diye

A - B - D - F - G   <- "master" branch (at G)
     \   \     /
      C - E --'     <- "topic" branch (still at E)

Bu grafik, senin bahsediyor) B, ama Bir (D ya da E değil) var, gidip de emin olmak istedim çünkü biraz seninkinden farklı görünüyor. Burada harfler önekleri SHA ve mesajlar (benim repo varsa herkes için ilginç here, klonlanmış olabilir) taahhüt bağlı:

G: a9546a2 merge from topic back to master
F: e7c863d commit on master after master was merged to topic
E: 648ca35 merging master onto topic
D: 37ad159 post-branch commit on master
C: 132ee2a first commit on topic branch
B: 6aafd7f second commit on master before branching
A: 4112403 initial commit on master

Yaniamaç: B bulun. Burada, biraz tamirattan sonra bulduğum üç yolu vardır:


1. görsel olarak, gitk ile:

Görsel olarak böyle bir ağaç master bakıldığında () görmelisiniz:

gitk screen capture from master

ya da konuya bakıldığında () burada:

gitk screen capture from topic

her iki durumda da, benim grafikte B taahhüt seçtim. Tıkladığınızda, tam SHA sadece grafiğin altındaki metin giriş alanında gösterilir.


2. görsel olarak, ama terminalden:

git log --graph --oneline --all

gösterir (git config --global color.ui auto varsayarsak):

output of git log --graph --oneline --all

Ya da, düz metin içinde:

*   a9546a2 merge from topic back to master
|\  
| *   648ca35 merging master onto topic
| |\  
| * | 132ee2a first commit on topic branch
* | | e7c863d commit on master after master was merged to topic
| |/  
|/|   
* | 37ad159 post-branch commit on master
|/  
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master

her iki durumda da, sizin 6aafd7f en küçük ortak noktası olarak işlemek, yani B benim grafikte, ya da A görüyoruz.


3. Shell magic:

Yukarıda, ya da sadece bir gözden geçirecek tek bir komut, ve başka bir şey gibi bir şey isteyip istemediğini sorunuzu belirtmeniz yok. İşte ikincisi:

diff -u <(git rev-list --first-parent topic) \
             <(git rev-list --first-parent master) | \
     sed -ne 's/^ //p' | head -1
6aafd7ff98017c816033df18395c5c1e7829960d

Ayrıca ~/içine koyabilirsiniz.olarak gitconfig(not: çizgi izleyen önemli; teşekkürler 33 ** buna dikkat çekmesi için):

[alias]
    oldest-ancestor = !zsh -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' -

Aşağıdaki (Alıntı ile karmaşık) komut satırı yapılabilir:

git config --global alias.oldest-ancestor '!zsh -c '\''diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne "s/^ //p" | head -1'\'' -'

Not: zsh kolayca ** 25, ama sh olabilirdideğil-- <() sözdizimi iş vanilya sh yok. (Tekrar, @conny, bana bunun farkında bu sayfada başka bir cevap, bir açıklama yaptığınız için çok teşekkür ederiz!)

Not: Yukarıdaki: sürüm Alternatif

Teşekkürler liori pointing out yukarıda olabilir düşme karşılaştırırken aynı dalları ve gelecek ile bir diğer fark oluşturan kaldırır sed formdan karışımı, ve bu "güvenli" (yani bir sonuç döndürür (yani, en son commit) bile karşılaştırmak yöneticisi):

Gibi .git-config satır:

[alias]
    oldest-ancestor = !zsh -c 'diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1' -

Kabuk: den

git config --global alias.oldest-ancestor '!zsh -c '\''diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1'\'' -'

Yani, benim test ağacında bir süre için kullanılamaz, özür dilerim, geri geldi, şimdi hem ana hem de konu (G ve B tamamlar, sırasıyla vererek) üzerinde çalışır. Tekrar teşekkürler,, diğer formu için liori.


Yani, ben [ve liori] ile geldi. Benim için iş gibi görünüyor. Aynı zamanda kullanışlı kanıtlamak olabilir diğer adları ek bir çift sağlar:

git config --global alias.branchdiff '!sh -c "git diff `git oldest-ancestor`.."'
git config --global alias.branchlog '!sh -c "git log `git oldest-ancestor`.."'

Mutlu-ıng git!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013