Bagaimana saya bisa melihat apa yang saya akan mendorong dengan git?

588

Apakah ada cara untuk melihat apa yang akan didorong jika saya melakukan git pushperintah?

Apa yang saya gambar adalah sesuatu seperti tab "File Berubah" dari fitur "tarik permintaan" Github. Ketika saya mengeluarkan permintaan tarik, saya bisa melihat dan melihat apa yang akan ditarik jika mereka menerima permintaan tarik saya:contoh github dari perubahan agregat

Baris perintah OK, tapi saya lebih suka semacam GUI (seperti screenshot di atas).

cmcculloh
sumber
Banyak pertanyaan / jawaban terkait; inilah yang lain: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Jawaban:

665

Untuk mendorong daftar file, jalankan:

git diff --stat --cached [remote/branch]

contoh:

git diff --stat --cached origin/master

Untuk perbedaan kode file yang akan didorong, jalankan:

git diff [remote repo/branch]

Untuk melihat path file lengkap dari file yang akan berubah, jalankan:

git diff --numstat [remote repo/branch]

Jika Anda ingin melihat perbedaan ini dalam GUI, Anda perlu mengkonfigurasi git untuk itu. Lihat Bagaimana cara melihat output 'git diff' dengan program visual diff? .

Ionuț G. Stan
sumber
8
Kedua variasi dari git yang di-cache tanpa diberikan, hanya akan menampilkan perbedaan dengan HEAD. Saya pikir maksud Anda git diff [--stat] --cached asal / master, dengan asumsi cabang utama asal adalah master
mfontani
52
Ini bukan yang Anda inginkan. Anda harus berbeda HEAD, bukan indeks, terhadap sumber ( git diff origin/master HEAD). Difing indeks akan memberikan hasil yang sama jika dan hanya jika Anda tidak memiliki perubahan yang dilakukan untuk komit. Jika Anda memiliki perubahan yang dipentaskan, mereka akan dimasukkan ke dalam diff, tetapi jelas tidak akan didorong karena belum dilakukan.
Cascabel
5
Jawaban ini perlu diedit untuk memasukkan informasi dalam komentar dari @Jefromi git diff --stat origin/master HEADadalah jawaban yang benar.
Tony Topper
2
@fontfont memiliki jawaban yang tepat untuk saya. Saya ingin memeriksa apa yang akan didorong dari apa yang sudah saya lakukan, bukan apa yang akan dilakukan jika saya melakukan semua yang saya ubah. git diff --cached [remote/branch]melakukan trik :)
poshaughnessy
2
alih-alih mengetikkan asal / master, Anda dapat menggunakan @ {u} mis. git diff @ {u} atau git diff HEAD @ {u} Perhatikan bahwa ini hanya berfungsi jika Anda memiliki cabang pelacakan hulu yang telah dibuat dan ditautkan. Saya merasa berguna ketika saya punya banyak cabang dan banyak remote sehingga saya tidak perlu memikirkan apa yang terhubung di mana.
Damien Sawyer
192

Selalu ada dry-run:

git push --dry-run

Ini akan melakukan segalanya kecuali pengiriman data yang sebenarnya.

Jika Anda ingin tampilan yang lebih grafis, Anda memiliki banyak opsi.

Tig dan skrip gitk yang menyertai git keduanya menampilkan cabang saat ini dari salinan lokal Anda dan cabang dari remote atau asal.

teks alternatif

Jadi, setiap komit yang Anda buat setelah asal adalah komit yang akan didorong.

Buka gitk dari shell saat berada di cabang yang ingin Anda tekan dengan mengetik gitk&, lalu untuk melihat perbedaan antara apa yang ada di remote dan apa yang akan Anda push ke remote, pilih komit yang tidak dicuri lokal Anda dan klik kanan pada remote dan pilih "Diff this -> terpilih": teks alternatif

Brian Gianforcaro
sumber
18
git push --dry-run tidak menunjukkan apa pun seperti apa yang saya harapkan. gitk lebih dekat, tetapi tidak menunjukkan kepada saya total keseluruhan dari semua perubahan yang akan didorong. Jadi jika saya mendorong 6 komit ke jarak jauh, saya ingin melihat jumlah total dari apa yang akan didorong. Saya tidak peduli apa yang masing-masing komit miliki secara individual karena satu komit bisa sepenuhnya dinegasikan oleh yang berikutnya.
cmcculloh
1
Jika Anda memerlukan perbedaan dari apa yang akan didorong, lakukan git diff --stat HEAD origin/masteratau git diff HEAD origin/master. Penting adalah KEPALA , jika tidak, Anda memasukkan perubahan yang tidak dikomit dalam diff Anda
Daniel Alder
Apakah ada alasan mengapa git tidak secara otomatis melakukan dry-run sebelum mencoba mendorong data ke remote? Jika Anda mendorong sejumlah besar data, itu mengunggah semua data dan kemudian menunjukkan kesalahan setelah. Anda baru saja membuang-buang waktu dan bandwidth untuk mengunggah data yang sekarang harus Anda unggah kembali. Ini sepertinya perilaku yang aneh.
zeusstl
1
Masalahnya git push --dry-runadalah masih membutuhkan izin tulis dari jarak jauh. Jadi, jika Anda memiliki klon tanpa izin untuk mendorong ke atas, tetapi Anda ingin melihat apa perubahan lokal yang tidak disucikan, --dry-runtidak akan melakukannya.
Ed Avis
Ini adalah solusi yang baik, tetapi perlu dicatat bahwa itu memang memerlukan koneksi ke remote (termasuk memasukkan kunci SSH jika berlaku). Jika Anda hanya ingin melihat perbedaan antara branchdan origin/branch, saya akan pergi dengan jawaban Ionuț G. Stan, karena sebenarnya tidak memerlukan koneksi ke repo jarak jauh. Ini bisa baik atau buruk, tergantung apa yang Anda butuhkan.
Sean the Bean
169

Untuk sekadar daftar komit yang menunggu untuk didorong: ( ini yang akan Anda ingat )

git cherry -v

Tampilkan subjek komit di sebelah SHA1s.

Alex Nolasco
sumber
5
Satu hal yang menarik adalah Anda dapat menentukan sebuah remote untuk dibandingkan seperti: git cherry -v heroku/remotejika Anda menyimpan kode Anda di lebih dari satu remote.
fagiani
Apa perintah pelengkap terbaik yang memungkinkan kita untuk benar-benar mengkorelasikan perbedaan yang terkandung dalam komit ini?
Hassan Baig
Perintah ini bagus, tetapi saya ingin lebih detail, seperti nama file yang akan diubah selama push.
LS
21

Anda mungkin ingin lari git difftool origin/master.... yang harus memperlihatkan diff terpadu dari apa yang ada di cabang Anda saat ini yang belum di cabang asal / master dan menampilkannya di alat grafis diff pilihan Anda. Agar paling mutakhir, jalankan git fetchterlebih dahulu.

Scott Chacon
sumber
2
git difftool -d origin/master, Saya punya set difftool saya untuk berbaur sehingga berfungsi dengan baik, thx!
Aquarius Power
git difftool -djauh lebih baik, terima kasih Aquarius Power. Satu-satunya masalah adalah ia tidak mendeteksi file yang dipindahkan dan menunjukkannya sebagai dihapus dan ditambahkan sebagai gantinya.
EM0
8

Salah satu cara untuk membandingkan versi lokal Anda sebelum mendorongnya pada repo jarak jauh (semacam push-run):

Gunakan TortoiseGit:
Klik kanan pada proyek folder root> TortoiseGit> Diff dengan versi sebelumnya>
untuk Versi 2 pilihrefs/remotes/origin/master

pengguna1921207
sumber
8

Coba git diff origin/master..master(dengan asumsi itu origin/masteradalah hulu Anda). Tidak seperti git push --dry-runini, ini masih berfungsi bahkan jika Anda tidak memiliki izin menulis ke hulu.

Ed Avis
sumber
5

Gunakan git gui, di sana Anda dapat melihat daftar apa yang berubah dalam komit aktual Anda. Anda juga dapat menggunakan gitkyang menyediakan antarmuka yang mudah untuk reflog. Bandingkan saja antara remotes/...dan masteruntuk melihat, apa yang akan didorong. Ini menyediakan antarmuka yang mirip dengan tangkapan layar Anda.

Kedua program termasuk dalam git.

fuz
sumber
1
Saya tidak melihat tempat di git gui yang menunjukkan semua yang telah dilakukan tetapi tidak didorong.
cmcculloh
Di git gui Anda dapat melihat, apa yang diubah tetapi tidak dilakukan. Di gik (Via gitk --allAnda mendapatkan daftar lengkap dari semua komentar. Sekarang Anda dapat membandingkan kondisi aktual dari cabang-dev Anda dengan remote yang Anda dorong.
fuz
4

Untuk melihat file mana yang diubah dan melihat perubahan kode aktual dibandingkan dengan mastercabang yang dapat Anda gunakan:

git diff --stat --patch origin master

CATATAN : Jika Anda menggunakan salah satu dari Intellij IDEs maka Anda dapat mengklik kanan proyek tingkat atas Anda, pilih Git > Bandingkan dengan cabang > dan pilih asal yang Anda inginkan misalnya origin/master. Dalam bagan file yang akan muncul Anda dapat mengklik dua kali file untuk melihat perbedaan visual. Berbeda dengan opsi baris perintah di atas, Anda dapat mengedit versi lokal dari jendela berbeda.

ccpizza
sumber
3

Anda dapat membuat daftar komitmen dengan:

git cherry -v

Dan kemudian bandingkan dengan perintah berikut di mana jumlah ^ sama dengan jumlah komit (dalam contoh 2 komitnya):

git diff HEAD^^
DavidS
sumber
Cukup bagus melihat daftar commit terbaru. Ini tidak akan memberikan nama file. Oleh karena itu beberapa orang menjawab menggunakan opsi lari kering dan opsi tambalan lebih baik. git diff --stat --patch origin master git push --dry-run
Sree Rama
2

Jika Anda menggunakan Mac OS X, saya sarankan Anda mendapatkan Tower, ini adalah program luar biasa yang telah membuat berurusan dengan Git menjadi kesenangan bagi saya. Saya sekarang lagi harus mengingat perintah terminal dan ia menawarkan GUI yang bagus untuk melihat, melacak, dan menyelesaikan perbedaan dalam file.

Dan tidak, saya tidak berafiliasi dengan mereka, saya hanya menggunakan perangkat lunak mereka dan sangat menyukainya.

http://www.git-tower.com/

kakubei
sumber
2
Saya menggunakan Tower, tetapi bagaimana Anda bisa melihat file yang telah dikomit tapi tidak didorong?
Michael Irey
Ini tidak menjawab pertanyaan.
reinierpost
1

Hanya untuk menambahkan dua sen saya ... Saya ingin menerapkan ini ketika menjalankan pekerjaan dalam pipa gitlab pada pelari gitlab. Cara terbaik untuk melakukan ini adalah dengan menggunakan skrip ini:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Juga dalam kasus saya, saya ingin memfilter file dengan ekstensi, untuk mencapai ini saya menggunakan:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Setelah itu Anda dapat misalnya meneruskan daftar ini di tempat lain, linter mungkin;)

Semoga ini bisa membantu seseorang.

Michal Mikolajczyk
sumber
1
  1. Jika Anda memiliki izin menulis di remote
git push --dry-run
  1. Jika Anda tidak memiliki izin menulis di remote
git diff --stat HEAD remote/branch
vkg
sumber
0

Setelah itu git commit -m "{your commit message}", Anda akan mendapatkan hash komit sebelum push. Jadi, Anda dapat melihat apa yang akan Anda tekan dengan gitmenjalankan perintah berikut:

git diff origin/{your_branch_name} commit hash

misalnya: git diff origin/master c0e06d2

Chandra
sumber
Terima kasih telah menjawab, tetapi saya pikir upaya ini tidak diperlukan karena pertanyaannya sudah cukup lama dan sangat dipilih. Anda lebih baik menghabiskan upaya untuk berbagai pertanyaan.
Pbd