@ 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:
- Git deposundan yama veya diff dosyası oluşturun ve başka bir git deposuna uygulayın