Dapatkan semua file yang telah dimodifikasi di git branch


209

Apakah ada cara untuk melihat file apa yang telah berubah di cabang?



2
Mereka bukan karyawan saya, mereka adalah kolega saya dan bukan mereka secara khusus seperti halnya orang pada umumnya. Tapi ya, membaca kembali posting ini sepertinya agak agro. :)
Raif

3
Bisakah Anda menggunakan github atau bitbucket, gitlab? Ada alat untuk mengelola situasi ini dengan tepat. Pengembang membuat permintaan tarik. Anda mendapatkan permintaan dan Anda akan memiliki akses ke antarmuka yang sangat baik yang akan menunjukkan kepada Anda perbedaan dari semua perubahan yang dibuat untuk setiap file. Anda bahkan dapat berkomentar, meminta perubahan, dll. Ketika perubahan baik, Anda dapat menerima permintaan yang akan menggabungkan perubahan ke cabang yang diminta (biasanya berkembang). Itu adalah cara praktik terbaik untuk menangani situasi ini.
Scott Wright

Jawaban:


168

Alternatif jawaban oleh @Marco Ponti, dan menghindari checkout:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Jika shell khusus Anda tidak memahami konstruk $ (), gunakan kembali tanda centang.


1
ah! ini menyenangkan, sekarang bagaimana kalau saya ingin mengatakan <notMainDev> menjadi cabang saat ini. itu tidak harus menentukannya?
Raif

29
git diff --name-only <some-other-branch>akan menunjukkan kepada Anda file apa yang berbeda antara cabang Anda saat ini dan <some-other-branch>. Jadi pada dasarnya perintah yang sama, tetapi perhatikan bahwa Anda dapat menggunakan ini untuk menemukan file yang berbeda antara setiap dua cabang, bahkan jika mereka tidak berhubungan jarak jauh. Apakah perbandingan itu bermanfaat atau tidak tergantung pada topologi cabang Anda ... Juga, note <some-other-branch>benar-benar bisa berupa komit sama sekali, atau apa pun yang diselesaikan menjadi satu (tag, dll.).
twalberg

hmmm, well, saya kira yang saya maksud adalah saya ingin melakukan git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) di mana MY_CURRENT_CO_BRANCH tentu saja akan menjadi cabang saya saat ini diperiksa cabang
Raif

Anda bisa melakukannya juga. Itu akan menemukan titik di mana <notMainDev>dan yang <MY_CURRENT_CO_BRANCH>terbaru memiliki leluhur yang sama, dan dibandingkan <notMainDev>dengan leluhur itu. Namun, Anda harus memberikan nama cabang saat ini, seperti yang git merge-basediharapkan oleh dua argumen - tidak ada jalan pintas, setidaknya dalam versi saat ini.
twalberg

1
baik! Saya mendapatkannya. Atas perkenan rekan saya, siapa namanya. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' yang akan mendapatkan komit untuk cabang antara <notMainDev> dan cabang saya saat ini. Saya kemudian dapat melakukan git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif

147

Yang harus Anda lakukan adalah sebagai berikut:

git checkout <notMainDev>
git diff --name-only <mainDev>

Ini akan menunjukkan kepada Anda hanya nama file yang berbeda antara dua cabang.


wow cepat dan juga intinya. Terima kasih. tapi aku suka git. selalu cepat dan to the point
Raif

23
Saya percaya itu juga akan menunjukkan hal-hal yang telah berubah <mainDev>sejak cabang bercabang. Anda mungkin ingin menggunakan git diff --name-only <sha-of-branch-point>sebagai gantinya, atau melihat jawaban alternatif yang saya posting yang menghindari checkout.
twalberg

Ya, itu benar @twalberg akan menunjukkan perubahan itu jika cabang-cabangnya berbeda. Saya berasumsi notMainDevakan tetap up to date dengan komit mainDev ... Saya biasanya merasa berguna untuk melihat perbedaan itu juga.
Marco Ponti

tidak bisakah Anda menentukan - hanya-hanya untuk menunjukkan file yang diubah di sisi kanan?
TheZenker

Anda dapatkan <sha-of-branch-point>dengangit rev-parse <branch-name>
fc9.30

69

kagum ini belum dikatakan sejauh ini!

git diff master...branch

Jadi lihat perubahan hanya pada branch

Untuk memeriksa penggunaan cabang saat ini

git diff master...

Terima kasih untuk jqr

Ini tangan pendek untuk

git diff $(git merge-base master branch) branch

jadi dasar gabungan (komit umum terbaru antara cabang) dan ujung cabang

Juga menggunakan asal / master alih-alih master saja akan membantu jika master lokal Anda diberi tanggal


4
Meskipun ini menunjukkan apa yang telah berubah, ini menunjukkan SEMUA perubahan, bukan ringkasan dari file yang diubah ... yang mana yang membawa saya ke halaman ini sejak awal :)
Chris Rutledge

1
kemudian tambahkan bendera --name-only untuk ini. atau --short-stat
exussum

2
git diff --name-only master..jika Anda hanya ingin nama-nama file yang berbeda antara dua cabang.
Adam

1
Ini tidak akan berfungsi dengan baik jika master Anda telah melakukan setelah Anda membuat cabang samping Anda.
simplylizz

2
@implylizz ya itu. itulah tepatnya yang sedang dipecahkan ini
exussum

45

Saya tidak percaya ada begitu banyak cara untuk melakukan ini. Saya menggunakan whatchanged sebagai seseorang yang diposting sebelumnya, hanya dengan argumen berikut:

git whatchanged --name-only --pretty="" origin..HEAD

Ini hanya mencantumkan nama file, dan hanya yang berubah pada cabang saat ini.


3
Ini tampaknya menjadi jawaban termudah di sini karena tidak memerlukan informasi tambahan. Outputnya terlihat benar dan jauh lebih mudah diingat daripada jawaban yang diterima!
RickMeasham

1
Terima kasih, ini menarik, lebih banyak bertele-tele. Ini memberikan output dari setiap komit, dalam urutan terbalik. git-whatchanged - Tampilkan log dengan perbedaan setiap komit memperkenalkan git-scm.com/docs/git-whatchanged
nealmcb

Dari the 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

Saya sangat menyukai jawaban @ twalberg tetapi saya tidak ingin harus mengetikkan nama cabang saat ini setiap saat. Jadi saya menggunakan ini:

git diff --name-only $(git merge-base master HEAD)

1
Solusi Anda berfungsi untuk saya dan saya mendapatkan daftar file yang saya harapkan. Saya seorang pemula Git dan telah digunakan git diff master... --name-onlysaat dijalankan pada cabang target dan mendapatkan hasil yang sama. Bisakah Anda berbaik hati memberikan umpan balik tentang apa yang baik vs buruk antara jawaban Anda dan perintah yang saya berikan?
hungerstar

Perintah Anda akan bekerja persis sama, jika master tidak memiliki komitmen baru sejak cabang Anda dibuat. Saya pikir perintah saya akan sama dengan git diff master.. --name-only(perhatikan hanya ada 2 titik, bukan 3). Untuk memahami apa yang dimaksud dengan titik-titik, lihat jawaban ini
Yep_It's_Me

Luar biasa! Terima kasih atas balasan dan wawasan yang cepat. Sangat dihargai.
hungerstar

12

git whatchanged tampaknya menjadi alternatif yang bagus.


1
Apa sebenarnya yang saya cari.
Sild

Dari the 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

yang ingin kita bandingkan.


Sepertinya sebagian dari jawaban yang ada, stackoverflow.com/a/41486181/11912
James Skemp

Variasi ini membandingkan KEPALA master dengan cabang saat ini. Jawaban yang diterima membandingkan keadaan master pada saat Anda bercabang . Entah mungkin memiliki jawaban yang Anda cari, tergantung pada apa yang ingin Anda ketahui.
Mark Stosberg

8

Bagaimana jika ini semudah ini?

git changed

Jika Anda mau berasumsi bahwa cabang utama disebut "master", dan bahwa Anda membuat cabang lain dari master, maka Anda dapat menambahkan alias ini ke ~/.gitconfigfile Anda agar mudah:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Asumsi-asumsi itu akan bekerja untuk kebanyakan orang di kebanyakan situasi, tetapi Anda harus sadar bahwa Anda membuatnya.

Anda juga harus menggunakan shell yang mendukung $(). Sangat mungkin shell Anda mendukung ini .


3
git show --stat origin/branch_name

Ini akan memberi Anda daftar file yang telah ditambahkan atau dimodifikasi di bawah cabang ini.


2
Ini salah, ini hanya menunjukkan file yang diubah di kepala komit dari cabang itu, bukan seluruh cabang.
davidtbernal

2

Untuk beberapa alasan tidak ada yang disebutkan git-tree. Lihat https://stackoverflow.com/a/424142/1657819

git-treelebih disukai karena ini perintah plumbing ; dimaksudkan untuk diprogram (dan, mungkin, lebih cepat)

(dengan asumsi cabang dasar adalah master)

git diff-tree --no-commit-id --name-only -r master..branch-name

Namun ini akan menunjukkan kepada Anda semua file yang terpengaruh di cabang, jika Anda hanya ingin melihat file yang dimodifikasi secara eksplisit , Anda dapat menggunakan --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

Anda juga dapat menggunakan --name-statusalih-alih --name-onlymelihat status file ( A/ M/ Ddan seterusnya)


Ini hanya apa yang saya butuhkan untuk menyisir file yang diubah sambil mengecualikan file yang telah dihapus. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

Jawaban yang diterima - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- sangat dekat, tetapi saya perhatikan bahwa statusnya salah untuk dihapus. Saya menambahkan file dalam cabang, namun perintah ini (menggunakan --name-status) memberi file saya menghapus status "A" dan file yang saya tambahkan status "D".

Saya harus menggunakan perintah ini sebagai gantinya:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

Memperluas dari apa yang dimiliki @twalberg dan @iconoclast, jika Anda menggunakan cmd untuk alasan apa pun, Anda dapat menggunakan:

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

File batch berikut didasarkan pada jawaban twalberg tetapi akan bekerja di Windows:

@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

Di atas mengasumsikan bahwa cabang utama adalah origin / master dan bahwa git bash dimasukkan ketika Git diinstal (dan lokasinya berada di lingkungan path). Saya sebenarnya perlu menunjukkan perbedaan yang sebenarnya menggunakan alat diff yang dikonfigurasi (kdiff3) sehingga menggantikan perintah bash berikut di atas:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

Saya menggunakan grep jadi saya hanya mendapatkan baris dengan diff --git yang merupakan path file:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.