Bagaimana cara melihat git-pull tanpa melakukan pengambilan

204

Apakah itu mungkin?

Pada dasarnya, ada repositori jarak jauh dari mana saya tarik menggunakan hanya:

git pull

Sekarang, saya ingin melihat dulu tarikan apa yang akan berubah (beda) tanpa menyentuh apa pun di sisi saya. Alasannya adalah hal yang saya tarik mungkin tidak "baik" dan saya ingin orang lain memperbaikinya sebelum membuat repositori saya "kotor".

Milan Babuškov
sumber
4
Hasil edit Anda aneh. Melakukan "git fetch" tidak mengubah pohon kerja Anda dengan cara apa pun, jadi tidak masalah jika Anda memiliki perubahan lokal yang tidak dikomit. Dan tidak jelas bagian mana dari pengambilan yang ingin Anda batalkan, karena itu tidak menyentuh pohon kerja Anda.
dkagedal
Terima kasih dkagedal, saya menulis ini sebelum saya sepenuhnya mengerti cara kerja Git. Saya menghapus suntingan itu.
Milan Babuškov

Jawaban:

234

Setelah melakukan git fetch, lakukan git log HEAD..origin/masteruntuk menunjukkan entri log antara komit umum terakhir Anda dan cabang master asal. Untuk menunjukkan perbedaan, gunakan salah satu git log -p HEAD..origin/masteruntuk menunjukkan setiap tambalan, atau git diff HEAD...origin/master(tiga titik bukan dua) untuk menunjukkan perbedaan tunggal.

Biasanya tidak perlu membatalkan unduhan, karena melakukan pengambilan hanya memperbarui cabang jarak jauh dan tidak ada cabang Anda . Jika Anda tidak siap untuk melakukan tarikan dan menggabungkan semua komit jarak jauh, Anda dapat menggunakan git cherry-pickuntuk menerima hanya komit jarak jauh tertentu yang Anda inginkan. Kemudian, ketika Anda siap untuk mendapatkan semuanya, surat git pullwasiat akan bergabung dengan seluruh komitmen.

Pembaruan: Saya tidak sepenuhnya yakin mengapa Anda ingin menghindari penggunaan git fetch. Yang dilakukan git fetch adalah memperbarui salinan lokal dari cabang jarak jauh Anda. Salinan lokal ini tidak ada hubungannya dengan salah satu cabang Anda, dan itu tidak ada hubungannya dengan perubahan lokal yang tidak dikomit. Saya telah mendengar tentang orang yang menjalankan git mengambil pekerjaan cron karena sangat aman. (Tapi saya biasanya tidak menyarankan melakukan itu.)

Greg Hewgill
sumber
Kurasa aku melewatkan bagian 'tidak ada hubungannya dengan cabang-cabangKU' saat membaca dokumen. Terima kasih.
Milan Babuškov
1
Untuk beberapa alasan itu tidak berhasil untuk saya. Saya mencoba git diff HEAD ... origin / master dan belum daftar perubahan apa pun ketika saya melakukan 'pull origin master' ia mengambil dan menggabungkan perubahan. Apakah itu karena saya mengatur repositori jarak jauh menggunakan git remote add?
screenm0nkey
@ screenm0nkey: Saya tidak tahu (tanpa mengetahui informasi lebih lanjut). Saya sarankan membuka pertanyaan baru untuk menanyakan hal ini jika Anda masih tidak yakin.
Greg Hewgill
1
Apa yang berhasil untuk saya (setelah pengambilan git): git log origin / master
slaman
2
git diff ...@{u}sama seperti git diff HEAD...origin/masterjika asal / master adalah cabang hulu
cambunctious
47

Saya pikir git fetch adalah apa yang Anda cari.

Ini akan menarik perubahan dan objek tanpa melakukan mereka ke indeks repo lokal Anda.

Mereka bisa digabung nanti dengan git merge .

Halaman Manusia

Sunting: Eksplorasi Lebih Lanjut

Langsung dari Git- SVN Crash Course link di

Sekarang, bagaimana Anda mendapatkan perubahan baru dari repositori jarak jauh? Anda mengambilnya:

git fetch http://host.xz/path/to/repo.git/ 

Pada titik ini mereka berada di repositori Anda dan Anda dapat memeriksanya menggunakan:

git log origin 

Anda juga dapat melakukan perubahan. Anda juga dapat menggunakan git log HEAD..origin untuk melihat perubahan yang tidak Anda miliki di cabang Anda. Maka jika ingin menggabungkan mereka - lakukan saja:

git merge origin

Perhatikan bahwa jika Anda tidak menentukan cabang yang akan diambil, itu akan mudah default ke remote pelacakan.

Membaca halaman manual secara jujur ​​akan memberi Anda pemahaman terbaik tentang opsi dan cara menggunakannya.

Saya hanya mencoba melakukan ini dengan contoh dan memori, saat ini saya tidak memiliki kotak untuk diuji. Anda harus melihat:

git log -p //log with diff

Pengambilan dapat dibatalkan dengan git reset --hard ( tautan ), namun semua perubahan yang tidak dikomit di pohon Anda akan hilang serta perubahan yang Anda ambil.

Brian Gianforcaro
sumber
Jika Anda menjelaskan dua hal, itu mungkin bagus: 1. bagaimana cara membatalkan git-fetch? 2. Bagaimana cara melihat diff?
Milan Babuškov
1
1) membatalkan git-fetch? 2) git diff HEAD..origin
Chris Vest
Dif dilakukan seperti kata Christian, pengambilan dapat dibatalkan dengan git reset --hard, namun semua perubahan yang tidak dikomit di pohon Anda akan hilang serta perubahan yang Anda ambil.
Brian Gianforcaro
Apakah Anda mencari git reset --softatau tidak --mixed? Periksa halaman manual.
Aristoteles Pagaltzis
1
Jika saya mengerti benar maka tidak perlu membatalkan "git fetch" karena tidak menyentuh copy pekerjaan Anda dan juga tidak repositori Anda. "git fetch" menyimpan objek dan referensi di .git / FETCH_HEAD
Thorsten Niehues
21

Anda dapat mengambil dari repo jarak jauh, melihat perbedaannya lalu menarik atau menggabungkannya.

Ini adalah contoh untuk repo jarak jauh yang disebut origindan cabang yang disebut masterpelacakan cabang jarak jauh origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Antonio Bardazzi
sumber
8

Saya membuat alias git khusus untuk melakukan itu untuk saya:

alias.changes=!git log --name-status HEAD..

dengan itu Anda bisa melakukan ini:

$git fetch
$git changes origin

Ini akan memberi Anda cara yang bagus dan mudah untuk melihat pratinjau perubahan sebelum melakukan a merge.

Matthias
sumber
kamu adalah Tuhan. ini seharusnya masuk dalam git itu sendiri
Z. Khullah
3

Saya menggunakan dua perintah ini dan saya bisa melihat file untuk berubah.

  1. Pertama mengeksekusi git fetch , ia memberikan output seperti ini (bagian dari output):

    ...
    72f8433..c8af041 mengembangkan -> asal / kembangkan
    ...

Operasi ini memberi kita dua ID komit, yang pertama adalah yang lama, dan yang kedua akan yang baru.

  1. Kemudian bandingkan dua commit ini menggunakan git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Perintah ini akan mencantumkan file yang akan diperbarui:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Misalnya app / controller / xxxx.php dan app / view / yyyy.php akan diperbarui.

Membandingkan dua commit menggunakan git diff mencetak semua file yang diperbarui dengan baris yang diubah, tetapi dengan grep ia mencari dan hanya mendapatkan baris yang berisi diff -git dari output.

cowboycb
sumber
3

Saya mungkin terlambat ke pesta, tetapi ini adalah sesuatu yang terlalu lama mengganggu saya. Dalam pengalaman saya, saya lebih suka melihat perubahan mana yang tertunda daripada memperbarui copy pekerjaan saya dan menangani perubahan itu.

Ini masuk dalam ~/.gitconfigfile:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Ini mengambil cabang saat ini, kemudian melakukan perbedaan antara copy pekerjaan dan cabang yang diambil ini. Jadi, Anda hanya akan melihat perubahan yang akan terjadi git pull.

Andy P
sumber
1
Bisakah Anda menukar string ref HEAD..@{u}? Ini lebih sederhana, dan tidak mengharuskan remote dinamai "asal" atau cabang Anda dinamai sama seperti pada remote.
Michael - Di mana Clay Shirky
Ini alias yang dilakukan dengan baik, tetapi saya tidak yakin mengapa Anda ingin melakukan ini sejak awal. Anda harus berurusan dengan perubahan kapan saja, bukan? Anda harus dapat membatalkan bagian gabungan git pulljika Anda tidak suka apa yang dilakukannya ... jadi saya tidak yakin apa kasus penggunaan untuk ini.
Marnen Laibow-Koser
Saya tahu saya harus berurusan dengan perubahan di beberapa titik, tetapi ketika saya menulis, kadang-kadang saya tidak mau. Saya hanya ingin tahu apakah ada sesuatu yang akan rusak dan saya harus menyediakan lebih banyak waktu untuk ini - atau jika saya bisa melakukan git pullsetelahnya. Juga saya pikir itulah pertanyaan op tentang.
Andy P
-1

Jika Anda tidak ingin git-fetch memperbarui .git lokal Anda, cukup salin repo lokal Anda ke direktori temp dan lakukan tarik di sana. Ini adalah shor-hand:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
Lab AX
sumber
'gtp' perlu dijalankan di root repo lokal, di mana .git berada.
AX Labs
-2

Bagaimana dengan mengkloning repo di tempat lain, dan melakukan git log di kasir asli dan klon baru untuk melihat apakah Anda mendapatkan hal yang sama.

Ed Greenberg
sumber
Salinan lokal lebih mencerminkan negara daripada klon lain. Lihat posting utama saya untuk detailnya .
AX Labs