Bir şubede hangi taahhütlerin diğerinde olmadığını nasıl görebilirim?


180

İki şubem var develve next. Devel'de az ya da çok büyük taahhütlerim var. Bazı taahhütler kiraz alınır next. Ayrıca bir sonrakine birleştirilen bazı taahhütler ekledimdevel .

Şimdi neyin eksik olduğunu görmek istiyorum next, böylece değişiklikleri getirmeden önce ayrıntılı olarak test edebilirim next. Benim sorum şimdi, hangi taahhütlerin içinde olduğunu develancak bir sonraki aşamada olmadığını nasıl görebilirim ?



başlığınız biraz yanıltıcı, çünkü karşılaştırmak istediğiniz şey her iki dalın da ucu. ve buraya iki şubenin özel (farklı) taahhütlerini karşılaştırmak için bir çözüm aramaya geldim
thebugfinder

Yanıtlar:


210

Az kullanılan komut git cherry, size henüz kiraz alınmamış olan taahhütleri gösterir. İçin dokümantasyon git cherryolduğunu burada Kısacası, sadece yapmak mümkün olmalıdır, ancak:

git checkout devel
git cherry next

... ve çıktıyı şöyle görün:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

İle başlayan taahhütler henüz kirazın içine girmemiş+ olanlar olacak . Bu durumda, şimdiye kadar sadece bir tane kiraz seçtim. Parametreyi komuta eklemek isteyebilirsiniz , böylece her komutun konu satırını da çıktılar.next-vgit cherry


Harika, buna ihtiyacım vardı. Ayrıca testlerin kısa bir açıklamasını almak güzel olurdu, ama bunu senaryolayabilirim.
Sascha Effert

29
Gerek yok git checkout devel, sadece yapabilirsiniz git cherry next devel.
Robin Winslow

21
“Eklemek isteyebilir -v ? A olmadan vişne -vgibi lsbir -la. ; -J
Slipp D.Thompson

1
Ve cherryeşdeğer taahhütleri işaretlemenin veya hariç tutmanın bir yolunu bilemezsiniz, değil mi? cherrybir sıhhi tesisat komutu gibi görünüyor, ancak pek çok seçenek sunmuyor (görünmüyor). Şu anda ortasında olduğum için, git cherrybana yanlış pozitifler veriyor, ancak @ sehe git log --cherry-pick, daha önce seçilmiş / yeniden basmış taahhütleri doğru bir şekilde dışlıyor.
Slipp D.Thompson

Belgeler somut bir örnek sunuyor: git-scm.com/docs/git-cherry#_concrete_example
ams

107

Ayrıca,

git log --left-right --graph --cherry-pick --oneline devel...next

şubeler arasında paylaşılmayan gerçek taahhütlerin güzel bir listesini almak için .

Operatif kelime --cherry-pick

--cherry-pick

Taahhüt kümesi simetrik farkla sınırlı olduğunda, "diğer tarafta" başka bir taahhütle aynı değişikliği getiren herhangi bir taahhüdü atlayın. Örneğin, iki dalınız (A ve B) varsa, bunların yalnızca bir tarafındaki tüm taahhütleri listelemenin olağan bir yolu, bu seçeneğin açıklamasındaki yukarıdaki örnek gibi - sağa sağdadır. Bununla birlikte, diğer daldan kirazla alınan taahhütleri gösterir (örneğin, "3. on b", dal A'dan kirazla toplanmış olabilir). Bu seçenekle, bu tür taahhüt çiftleri çıktıdan çıkarılır.

Güncelleme Bir yorumda belirtildiği gibi git'in son sürümleri eklendi --cherry-mark:

--cherry-mark

--Cherry-pick (aşağıya bakınız) gibi ama eşdeğer taahhütleri atlamak yerine = ile ve eşit olmayanları + ile işaretleyin.


1
Bu benim için işe yaramadı. Git sürümüm bilmiyor - bir satır, bu yüzden kaldırdım. Sonra devel ve sonra değiştirmek zorunda kaldı ve işe yaradı. Çok hoş!
Sascha Effert

@SaschaEffert: devel ve sonrakini değiştirmek zorunda kalmadınız (İKİ değil ÜÇ noktaya dikkat edin). Bununla birlikte , git (?) 'İn eski bir sürümünü kullandıysanız işler farklı olabilir, ancak bu durumda üç nokta üzerinde rev-parse hatası almış olmalısınız.
39'da sehe

2
Eğlenmek için, '...' (simetrik fark) rev-ayrıştırma sözdiziminin Temmuz 2006'da eklendiğini ve bunun belgelerinin Haziran 2008'de güncellendiğini öğrendim . Açık kaynak sevinci!
59'da sehe

1
'gls --first-parent --cherry-mark --sadece-geliştirmek ... sonraki' burada gls tüm güzel biçimlendirmeyle git log takma adım. kiraz işareti gelişmekte olan kiraz toplama ve kiraz toplama değil taahhüt gösterir, ancak farklı işaretler.
angularsen

1
ekleyin --no-
merges

51

Git log altkümelerini yapmayı deneyebilirsiniz:

git log --oneline devel ^next

4
Bu benim görüşüme göre en iyi çözümdür (@ sehe'nin cevabı, bir sonraki aşamada devel'de olmayan taahhütleri de gösterir - OP'nin bağlamında, hiçbiri yoktur, ancak benimkinde - kullanma --left-onlydaha iyi olurdu). Bununla birlikte, bu, --no-mergesherhangi bir birleştirme işleminin (örneğin bir özellik veya düzeltme dalının (ayrı olarak) hem geliştiriciye hem de sonrakine birleştirilmesi) eklenerek biraz geliştirilebilir . Açıkçası, elbette, birleşmelerdeki çatışma çözümü başka farklılıklar yaratabilir, ancak genellikle durum böyle değildir. Bu --no-mergesseçenek diğer cevaplara da uygulanabilir.
Alex Dupuy

27

Peki ya

git log next..devel

Sonuç, Byran'ın cevabına (farklı taahhütler sırası) benzer, ancak her iki cevabımız da dallar arasında farklı olan komisyonlar üretecek, sadece bir dalda olanı değil diğerinde olanları gösterecektir.


4
Ayrıca, o dalda bulunuyorsanız ikinci dalı da atlayabilirsiniz. iegit log next..
jmaxyz

btw 'git log next..devel', 'git log devel..next' den farklı
Eugene Kaurov

1

Serbest bırakma dalına entegre edilmemiş olan taahhütlerin listesini almak için (sonraki) şunları kullanabilirsiniz:

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

Giriş git-rev-liste daha fazla bilgi için.


bu yanıtın komutunda söz konusu gerçek dallar eksik, yaninext...devel
Alex Dupuy

@AlexDupuy Yah, bu çok yarım yamalak bir cevap. Aynı zamanda en basit cevap olmadığı ve bu yaklaşımın neden daha iyi olacağını açıklayamadığı için -1 -inging.
Slipp D.Thompson

-1

@ Mark Longair buradaki cevabını çiviledi , ama biraz daha içgörü eklemek istiyorum.

İlgili ve büyük bir Çekme Talebi'ni (PR) nasıl ayıracağınız sorusunu cevaplamak, özellikle de taahhütlerinizi ezmek için bir veya daha fazla ustanın özellikinize dahil olması nedeniyle pratik değildir.

Durumum: 30 taahhütle
büyük bir iş yaptım feature_branchve GitHub'da birleştirmek için bir Çekme Talebi (PR) açtım master. Şube masteraltımda bir ton değişti ve feature_branchsahip olmadığım 200 taahhüt aldı . Çatışmaları çözmek için yaptım git checkout feature_branchve değişiklikleri benim git merge masterile birleştirdim . Ben gittik çünkü PR GitHub inceleme yorum geçmişini silebilir. Böylece, uzmanı özellik dalımla birleştirdim ve çatışmaları 1 kez çözdüm. Her şey iyiydi. Ancak PR'm meslektaşlarımın inceleyemeyeceği kadar büyüktü. Onu ayırmam gerekiyordu. Benim 30 taahhüt ve OH NO ezmeye gitti! NEREDELER? ONLAR HER PUNTALI İLE OLAN ben birleşti çünkü şimdi 200 son kaydedilmesini s' gözlerimin içine ! BEN NE YAPARIM?masterfeature_branchmerge yerine rebaseben çözmek çatışmalar yerine potansiyel 30 kez yalnızca bir tek zaman olurdu böylece son master üzerine (benim kaydedilmesini her biri için bir kez). Önce 30 taahhüdümü 1'e sıkıştırmak ve daha sonra en sonmastermastermasterfeature_branch

git cherrygit cherry-pickbireysel taahhütleri denemek istemeniz durumunda kullanım :

git cherry kurtarmaya (çeşit)!

İçinde feature_branchancak DEĞİL tüm taahhütleri görmek masteriçin yapabilirim:

git checkout feature_branch
git cherry master

VEYA, bu şekilde feature_branchilk olarak çalıştığımdan emin olmak için HERHANGİ bir şubeden taahhütleri kontrol edebilirim git cherry [upstream_branch] [feature_branch]. Yine, bu hangi taahhütlerin olduğunu ( ancak bu durumda feature_branchDEĞİL ) kontrol eder:upstream_branchmaster

git cherry master feature_branch

Ekleme işlemi -vayrıca ileti mesajı konu satırlarını gösterir:

git cherry -v master

"Kelime sayısı" "-lines" ( wc -l) ile yapılan borular , kaç tane taahhüt bulunduğunu sayar:

git cherry master | wc -l

git cherryGerçekten işe yaradığını bilmek konusunda daha iyi hissetmek için bu sayıyı GithHub PR'nizde gösterilen taahhüt numarasıyla karşılaştırabilirsiniz . Git karmaları tek tek karşılaştırabilir git cherryve GitHub ile eşleştiğini görebilirsiniz . Not git cherry, birleştirilmesi herhangi birleştirme kaydedilmesini saymaz masteriçine feature_branchfakat GitHub WILL. Bu nedenle, sayımda küçük bir tutarsızlık görürseniz, GitHub PR taahhüt sayfasında "birleştirme" kelimesini arayın ve muhtemelen bunun görünmeyen suçlu olduğunu göreceksiniz git cherry. Örn: GitHub PR'de "Şube 'master' özelliğini feature_branch ile birleştir" başlıklı bir komut görünür ancak çalıştırdığınızda gösterilmez git cherry master feature_branch. Bu iyi ve bekleniyor.

Yani, şimdi bu farkı bölmek için taze bir özellik dalına kiraz seçmek isteyebilirsiniz bulmak için bir araç var: git cherry master feature_branchYerel olarak kullanabilir veya GitHub PR taahhütleri bakmak.

Ezmek nasıl yardımcı olabilir - sadece ezebilseydik:

Bununla birlikte, büyük farkımı bölmek için bir alternatif, taahhütlerimin 30'unu bir araya getirmek, yeni bir özellik dalına yama git guieklemek , yama taahhüdünü yumuşak bir şekilde sıfırlamak, daha sonra parça dosya eklemek için kullanmak , yığın yığın veya satır satır. Bir alt özelliği aldığımda, eklediğim şeyi yapabilir, sonra yeni bir şubeye bakabilir, biraz daha ekleyebilir, taahhüt edebilir, yeni bir şubeye göz atabilirim, büyük özelliğim birkaç alt özelliğe bölünene kadar . Sorun şu ki, benim 30 taahhüdüm diğer insanlardan gelen diğer 200 taahhüt ile iç içegit merge master gözlerimin içine feature_branchrebasing nedenle pratik değildir, bu yüzden yeniden düzene 230 kaydedilmesini elemek zorunda ve benim 30 kaydedilmesini ezmek istesem de,.

Yama dosyasını ezmek için çok daha kolay bir yedek olarak nasıl kullanılır:

Bir çözüm, sadece 30 taahhüdümün bir "squash eşdeğerini" içeren bir yama dosyası elde etmek , yeni bir çatalı master(yeni bir alt özellik dalı) üzerine yapıştırmak ve oradan çalışmaktır:

git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master 
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch

Şimdi 30 taahhüdümün hepsi yerel olarak uygulandı, ancak işaretlenmemiş ve taahhüt edilmedi.

Şimdi git guidosyaları, parçaları ve / veya satırları eklemek ve büyük PR veya "diff" i bölmek için kullanın:

Eğer yoksa git gui, Ubuntu'ya ile kolayca kurabileceğinizi unutmayın sudo apt install git-gui.

Şimdi koşabilirim git gui ve dosyaları, parçaları ve / veya satırları eklemeye başlayabilirim (git GUI programına sağ tıklayarak) ve 30 taahhüt özelliği dalını yukarıda açıklandığı gibi alt dallara ayırabilir, tekrar tekrar ekleyebilir, işleyebilir, sonra çatallayabilirim yeni bir özellik dalı ve bir alt özellik dalına tüm değişiklikler eklenene ve 30 taahhütlü özelliğim başarıyla 3 veya 4 alt özelliğe bölünene kadar bu döngüyü tekrarlar. Şimdi bu alt özelliklerin her biri için ayrı bir PR açabiliyorum ve ekibimin incelemesi daha kolay olacak.

Referanslar:

  1. Git deposundan yama veya diff dosyası oluşturun ve başka bir git deposuna uygulayın

Bu cevaba bugün başvurmam gerekiyordu, ancak çabucak bulamadım. Neyse ki, daha kolay bulmama yardım etmek için bir aşağı oy aldı, bu yüzden ekranın sağ üstündeki ödül kupası simgesine basit bir tıklama son zamanlarda 2 puan kaybettiğim yeri gösterdi ve bunu tıklatmak beni buraya getirebileceğim yere geri getirdi Şimdi burada kendi cevabımı referans al! İnşallah artık downvotes almıyorum, ama downvoter'a, yanlışlıkla bana yardımcı olan hizmet için teşekkürler!
Gabriel Staples
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.