Git şubesinde değiştirilen tüm dosyaları alın


209

Bir dalda hangi dosyaların değiştiğini görmenin bir yolu var mı?



2
Onlar benim çalışanım değiller, onlar benim meslektaşlarım ve genel olarak insanlar kadar onlar değil. Ama evet, bu yazıyı yeniden okumak biraz agro gibi görünüyor. :)
Raif

3
Github veya bitbucket kullanabilir misin, gitlab? Tam olarak bu durumu yönetmek için araçlar vardır. Geliştirici bir çekme isteği yapar. İsteği alırsınız ve her dosyada yapılan tüm değişikliklerin bir farkını gösterecek çok iyi bir arayüze erişebilirsiniz. Hatta yorum yapabilir, değişiklik isteyebilirsiniz. Bu durumu ele almanın en iyi yolu budur.
Scott Wright

Yanıtlar:


168

@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.


1
Ah! Bu çok eğlenceli, şimdi <notMainDev> şu an bulunduğum dal olmak istiyorsam. belirtmek zorunda değil misiniz?
Raif

29
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.
twalberg

hmmm, yani, ne demek istediğim git dif yapmak istiyorum - sadece-isim <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) tabii ki benim mevcut teslim şube olurdu
Raif

Bunu da yapabilirsiniz. Bu, ortak bir ataya sahip olan <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-baseiki 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.
twalberg

1
tamam! Anladım. İş arkadaşımın nezaketi onun adı nedir. git merge-base <notMainDev> ile <notMainDev> 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}')
Raif

147

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.


vay hızlı ve çok önemli. teşekkür ederim. btw git seviyorum. her zaman hızlı ve
meseledir

23
<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.
twalberg

Evet, bu doğru @twalberg, dallar ayrılırsa bu değişiklikleri gösterecektir. notMainDevMainDev taahhütleri ile güncel tutulacağını varsayıyordum ... Genellikle bu farklılıkları da görmeyi yararlı buluyorum.
Marco Ponti

sadece sağ tarafta değiştirilen dosyaları göstermek için --right-only'i belirtebilir misiniz?
TheZenker

<sha-of-branch-point>ile olsungit rev-parse <branch-name>
fc9.30

69

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


4
Bu neyin değiştiğini gösterirken, değiştirilen dosyaların bir özeti yerine TÜM değişiklikleri gösterir ... bu beni ilk etapta bu sayfaya yönlendiren şeydir :)
Chris Rutledge

1
sonra buna --name-only bayrağını ekleyin. veya --short-stat
exussum

2
git diff --name-only master..sadece iki dal arasında farklı dosyaların isimlerini istiyorsanız.
Adam

1
Yan dalınızı oluşturduktan sonra master'ınız taahhüt etmişse bu düzgün çalışmaz.
simplylizz

2
@simplylizz evet öyle. Bu tam olarak ne
çözüyor

45

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.


3
Bu, ek bilgi gerektirmediği için burada en kolay cevap gibi görünüyor. Çıktı doğru görünüyor ve hatırlanması kabul edilen cevaptan daha kolay!
RickMeasham

1
Teşekkürler, bu ilginç, daha garip. Her bir komuttan ters sırayla çıktı sağlar. git-whatchanged - Günlükleri her taahhütte bulunan farklarla göster git-scm.com/docs/git-whatchanged
nealmcb

Gönderen git docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

21

@ 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)

1
Çözümünüz benim için çalışıyor ve görmeyi beklediğim dosyaların listesini alıyorum. Ben Git acemisiyim ve git diff master... --name-onlyhedef 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?
hungerstar

Ana dalınız oluşturulduğundan bu yana yeni taahhütleri yoksa, komutunuz tamamen aynı şekilde çalışır. Benim komut eşdeğer olacağını düşünüyorum 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
Yep_It's_Me

Müthiş! Hızlı cevap ve fikir için teşekkürler. Çok takdir etmek.
hungerstar

12

git whatchanged iyi bir alternatif gibi görünüyor.


1
Tam olarak aradığım şey buydu.
Sild

Gönderen git docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

9
git diff --name-only master...branch-name

karşılaştırmak istiyoruz.


Mevcut bir cevabın bir kısmı gibi görünüyor, stackoverflow.com/a/41486181/11912
James Skemp

Bu varyasyon master'ın HEAD'ını mevcut bir dalla karşılaştırır. Kabul edilen cevap, ustalaştığınız noktada ustalık durumunu karşılaştırır . Bilmek istediğiniz şeye bağlı olarak, aradığınız cevaba sahip olabilirsiniz.
Mark Stosberg

8

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ı ~/.gitconfigdosyaları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 .


3
git show --stat origin/branch_name

Bu size bu dalın altına eklenen veya değiştirilen dosyaların bir listesini verecektir.


2
Bu yanlış, bu sadece tüm dal değil, o dalın baş taahhütte değiştirilen dosyaları gösterir.
davidtbernal

2

Nedense kimse bahsetmedi git-tree. Bkz. Https://stackoverflow.com/a/424142/1657819

git-treebir 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-statusyerine --name-onlydosyaların durumunu görmek için ( A/ M/ Dve benzeri)


Bu sadece silinmiş olanlar hariç iken değiştirilen dosyaları linting için gerekli oldu. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

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>)

0

@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

0

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)"

0

Ben sadece dosya yolu olan diff --git ile satırları almak grep kullanın :

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
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.