Menggunakan Git bagaimana cara menemukan perubahan antara lokal dan jarak jauh

152

Berikut adalah dua pertanyaan yang berbeda tetapi saya pikir mereka saling berhubungan.

  1. Saat menggunakan Git, bagaimana cara menemukan perubahan yang telah saya lakukan secara lokal, tetapi belum mendorong ke cabang jauh? Saya mencari sesuatu yang mirip dengan perintah Mercurial hg outgoing.

  2. Saat menggunakan Git, bagaimana cara menemukan perubahan apa yang dimiliki cabang jauh sebelum melakukan tarikan? Saya mencari sesuatu yang mirip dengan perintah Mercurial hg incoming.

Untuk yang kedua: apakah ada cara untuk melihat apa yang tersedia dan kemudian memilih perubahan yang ingin saya tarik?

ejunker
sumber
11
Melihat jawabannya, tampaknya ada beberapa kebingungan mengenai apa hg incomingdan hg outgoingsebenarnya yang dilakukan. Setara Git terdekat yang saya temukan adalah --dry-runopsi. Hanya git pull --dry-rundan Anda akan melihat daftar semua hal yang perlu terjadi.
Roman Starkov

Jawaban:

97

Git tidak dapat mengirim informasi semacam itu melalui jaringan, seperti Hg bisa. Tetapi Anda dapat menjalankan git fetch(yang lebih seperti hg pulldaripada hg fetch) untuk mengambil komit baru dari server jauh Anda.

Jadi, jika Anda memiliki cabang yang dipanggil masterdan remote dipanggil origin, setelah menjalankan git fetch, Anda juga harus memiliki cabang yang dipanggil origin/master. Anda kemudian bisa mendapatkan git logsemua komitmen yang masterperlu menjadi superset origin/masterdengan melakukan git log master..origin/master. Balikkan keduanya untuk mendapatkan yang sebaliknya.

Seorang teman saya, David Dollar, telah membuat beberapa skrip git shell untuk disimulasikan hg incoming/outgoing. Anda dapat menemukannya di http://github.com/ddollar/git-utils .

Jordi Bunster
sumber
113

Dimulai dengan Git 1.7.0, ada sintaks khusus yang memungkinkan Anda untuk merujuk secara umum ke cabang upstream: @{u}atau @{upstream}.

Untuk meniru hg incoming:

git log ..@{u}

Untuk meniru hg outgoing:

git log @{u}..

Saya menggunakan yang berikut incomingdan outgoingalias untuk membuat yang di atas lebih mudah digunakan:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
Richard Hansen
sumber
git log .. @ {u} memberi saya kesalahan ini. (Saya memiliki asal dan repositori hulu di konfigurasi git saya). error: Tidak ada cabang upstream yang ditemukan untuk '' error: tidak ada cabang upstream yang ditemukan untuk '..' error: Tidak ada cabang upstream yang ditemukan untuk '..' fatal: argumen ambigu '.. @ {u}': revisi atau jalur tidak dikenal tidak dalam pohon yang bekerja. Gunakan '-' untuk memisahkan jalur dari revisi
Henrik
6
Anda akan mendapatkan kesalahan-kesalahan itu jika cabang lokal Anda tidak dikonfigurasikan dengan upstream. Untuk memperbaiki, jalankan git branch --set-upstream foo origin/foo.
Richard Hansen
git log @{u}..daftar setiap perubahan dalam repo untuk saya. Tidak mungkin mereka belum ada.
Roman Starkov
@romkyns: Mungkin cabang lokal Anda memiliki cabang jarak jauh yang salah dikonfigurasi sebagai hulu. Pastikan git rev-parse --symbolic-full-name @{u}mencetak referensi jarak jauh yang sesuai. Juga, git log @{u}..memperlihatkan komit yang tidak dapat dijangkau oleh cabang hulu, yang dapat menyertakan komit yang sudah ada di repositori jarak jauh (jika mereka dapat dijangkau dengan referensi yang berbeda). Ini akan terjadi tepat setelah Anda bergabung dengan cabang yang sudah didorong.
Richard Hansen
@RichardHansen Saya khawatir saya terlalu pemula untuk tahu apa yang cocok untuk referensi jarak jauh, namun ini adalah repo yang baru dikloning di mana saya hanya melakukan checkout <somebranch>dan merge <otherbranch>. Pada titik ini, saya melakukan log @{u}..dan melihat setiap perubahan terdaftar.
Roman Starkov
42

Bukan jawaban penuh tetapi git fetch akan menarik repo jarak jauh dan tidak melakukan penggabungan. Anda kemudian dapat melakukan

git beda master asal / master

Martin Redmond
sumber
1
Bekerja untuk saya (tapi sebaliknya) -git diff origin/master master
Nick Grealy
34
  1. Gunakan "git log origin..HEAD"

  2. Gunakan "git fetch" diikuti oleh "git log HEAD..origin". Anda dapat memilih komit individu menggunakan id komit yang terdaftar.

Tentu saja, asumsi di atas mengasumsikan bahwa "asal" adalah nama cabang pelacak jarak jauh Anda (jika Anda telah menggunakan klon dengan opsi default).

Greg Hewgill
sumber
3
(Dan jika Anda tidak melacak cabang jarak jauh, itu adalah "git log origin / master..HEAD".)
plindberg
4
"asal" bukan nama cabang pelacakan jarak jauh, itu nama jarak jauh. Dan hanya menentukan nama jarak jauh tidak berfungsi, Anda harus menentukan cabang pelacakan jarak jauh, yang akan menjadi asal / master.
robinst
22

Ada juga ini, untuk membandingkan semua cabang:

git log --branches --not --remotes=origin

Inilah yang dikatakan halaman manual git log tentang ini:

Memperlihatkan semua komit yang ada di cabang lokal mana pun tetapi tidak di cabang pelacakan jarak jauh mana pun untuk asal (apa yang Anda miliki asal tidak).

Di atas adalah untuk outgoing. Untuk incoming, cukup tukar:

git log --remotes=origin --not --branches
robinst
sumber
8

Saya akan lakukan

$ git fetch --dry-run

untuk hg incomingdan

$ git push --dry-run

untuk hg outgoing.

chris
sumber
Maaf, saya lupa bahwa ini sudah dikatakan sebagai komentar kepada OP.
chris
1

git-out adalah skrip yang ditiru dengan hg outgoingcukup akurat. Ini mem-parsing pada output "push -n", sehingga menghasilkan output yang akurat jika Anda perlu menentukan argumen tambahan untuk mendorong.

stepancheg
sumber
0

masuk git

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git keluar

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
prayagupd
sumber
0

Ketika "git log" dan @ {u} jawaban awalnya memberi saya kesalahan "revisi tidak dikenal", saya mencoba saran Chris / romkyns dari git push --dry-run.

Anda akan mendapatkan output seperti "5905..4878 master-> master". 5905 adalah komit terbaru yang dimiliki dan dikomit melalui remote (dan termasuk) 4878 akan diterapkan ke remote.

Anda kemudian dapat menggunakan 5905..4878 sebagai argumen untuk beberapa perintah git lain untuk mendapatkan detail lebih lanjut:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment
pierce.jason
sumber
-1

Ketika Anda melakukan git fetch, semua konten termasuk cabang, tag (ref) disimpan sementara di .git / FETCH_HEAD yang isinya dapat dilihat dengan perintah: git log FETCH_HEAD Jika Anda tidak menggunakan akhiran -a dengan git fetch maka secara default , Konten FETCH_HEAD akan ditimpa oleh konten baru. Dari konten ini, Anda dapat melihat dan memutuskan cabang mana yang ingin Anda gabungkan jika Anda melakukannya atau Anda dapat memilih sakura sederhana jika Anda ingin hanya beberapa komit dari apa yang telah diambil dengan mengambil.

AMIT PRAKASH PANDEY
sumber