Bir dalda hangi dosyaların değiştiğini görmenin bir yolu var mı?
Bir dalda hangi dosyaların değiştiğini görmenin bir yolu var mı?
Yanıtlar:
@Marco Ponti'nin cevabına bir alternatif ve ödeme işleminden kaçınma:
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
Kabuğunuz $ () yapısını anlamıyorsa, bunun yerine geri keneler kullanın.
git diff --name-only <some-other-branch>
mevcut şubeniz ile arasındaki dosyaların farklı olduğunu gösterecektir <some-other-branch>
. Yani aslında aynı komut, ancak arasında farklı dosyaları bulmak için bu kullanabileceği bir not herhangi onlar uzaktan ilişkili olmasalar bile, iki kola. Bu karşılaştırmanın yararlı olup olmadığı, dallarınızın topolojisine bağlıdır ... Ayrıca, not <some-other-branch>
gerçekten herhangi bir taahhüt veya bir tanesine (etiketler vb.) Çözülen herhangi bir şey olabilir.
<notMainDev>
ve <MY_CURRENT_CO_BRANCH>
en son ortak olan noktayı bulacaktır ve <notMainDev>
bu ata ile karşılaştırılacaktır . Bununla birlikte, geçerli şube adınızı git merge-base
iki bağımsız değişken beklediği gibi sağlamanız gerekir - en azından geçerli sürümde bir kısayol yoktur.
git branch | grep '\*' | awk '{print $2}'
arasındaki dalın taahhüdünü alacaksınız. Daha sonra git diff - onlyname <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}'
)
Tek yapmanız gereken aşağıdakiler:
git checkout <notMainDev>
git diff --name-only <mainDev>
Bu size yalnızca iki dal arasındaki farklı dosya adlarını gösterecektir.
<mainDev>
Yine de, dalların ayrışmasından bu yana değişen şeyleri göstereceğine inanıyorum . Bunun git diff --name-only <sha-of-branch-point>
yerine kullanmak isteyebilir veya yayınladığım alışverişten kaçınan alternatif cevabı görebilirsiniz.
notMainDev
MainDev taahhütleri ile güncel tutulacağını varsayıyordum ... Genellikle bu farklılıkları da görmeyi yararlı buluyorum.
<sha-of-branch-point>
ile olsungit rev-parse <branch-name>
bu şimdiye kadar söylenmedi hayran!
git diff master...branch
Bu yüzden değişiklikleri yalnızca branch
Mevcut şube kullanımını kontrol etmek için
git diff master...
JQR'ye teşekkürler
Bu kısa el
git diff $(git merge-base master branch) branch
böylece birleştirme tabanı (şubeler arasındaki en son ortak taahhüt) ve şube ipucu
Ayrıca, yerel ana sayfanızın tarihlendirilmesi durumunda yalnızca ana bilgisayar yerine orijin / ana öğeyi kullanmak yardımcı olacaktır
git diff --name-only master..
sadece iki dal arasında farklı dosyaların isimlerini istiyorsanız.
Bunu yapmanın pek çok yolu olduğuna inanamıyorum. Ne değiştiğini, daha önce yayınlanmış olarak, sadece aşağıdaki argümanlarla kullanıyorum:
git whatchanged --name-only --pretty="" origin..HEAD
Bu sadece dosya adlarını ve yalnızca geçerli dalda değişenleri listeler.
@ Twalberg'in cevabını gerçekten beğendim ama her zaman geçerli şube adını yazmak zorunda kalmadım. Yani bunu kullanıyorum:
git diff --name-only $(git merge-base master HEAD)
git diff master... --name-only
hedef dalda çalışırken aynı sonucu aldım. Cevabınız ve verdiğim komut arasında neyin iyi neyin kötü olduğuna dair herhangi bir geri bildirim sağlayacak kadar nazik olabilir misiniz?
git diff master.. --name-only
(3 yerine sadece 2 nokta olduğunu unutmayın). Noktaların ne anlama geldiğini anlamak için şu cevaba
git diff --name-only master...branch-name
karşılaştırmak istiyoruz.
Ya bu kadar kolay olsaydı?
git changed
Ana dalın "master" olarak adlandırıldığını ve diğer dallarınızı master'dan oluşturduğunuzu varsayarsanız, bu takma adı ~/.gitconfig
dosyalarınıza bu kadar kolay hale getirmek için ekleyebilirsiniz :
cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"
Bu varsayımlar çoğu durumda çoğu insan için işe yarayacaktır, ancak bunları yaptığınızın farkında olmalısınız.
Ayrıca, destekleyen bir kabuk kullanmalısınız $()
. Kabuğunuzun bunu desteklemesi çok olasıdır .
git show --stat origin/branch_name
Bu size bu dalın altına eklenen veya değiştirilen dosyaların bir listesini verecektir.
Nedense kimse bahsetmedi git-tree
. Bkz. Https://stackoverflow.com/a/424142/1657819
git-tree
bir sıhhi tesisat komutu olduğu için tercih edilir ; programlı olması gerekiyordu (ve muhtemelen daha hızlı)
(temel branşın olduğu varsayılarak master
)
git diff-tree --no-commit-id --name-only -r master..branch-name
Ancak bu , şubede etkilenen tüm dosyaları gösterecektir , yalnızca açıkça değiştirilmiş dosyaları görmek istiyorsanız şunları kullanabilirsiniz --diff-filter
:
git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M
Ayrıca birini kullanabilirsiniz --name-status
yerine --name-only
dosyaların durumunu görmek için ( A
/ M
/ D
ve benzeri)
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
Kabul edilen cevap - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
- çok yakın, ama silme durumunun yanlış olduğunu fark ettim . Bir şubeye bir dosya ekledim ve bu komut (kullanarak --name-status
) "A" durumunu sildiğim dosyayı ve "D" durumunu eklediğim dosyayı verdi.
Bunun yerine bu komutu kullanmak zorunda kaldım:
git diff --name-only $(git merge-base <notMainDev> <mainDev>)
@Twalberg ve @iconoclast'ın sahip olduklarını genişletmek, cmd'yi herhangi bir nedenle kullanıyorsanız, şunları kullanabilirsiniz:
FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y
Aşağıdaki toplu iş dosyası twalberg'in cevabına dayanır, ancak Windows'ta çalışır:
@ECHO OFF
C: :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE
Yukarıdakiler, ana dalın başlangıç / master olduğunu ve Git yüklendiğinde git bash'ın dahil edildiğini (ve konumunun yol ortamında olduğunu) varsayar. Aslında yapılandırılmış bir fark aracı (kdiff3) kullanarak yukarıdaki farklı bash komutunu kullanarak gerçek farklılıkları göstermek gerekiyordu:
bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"