git: beda antara file dalam repo lokal dan asal

190

Saya ingin menemukan perbedaan antara file yang saya miliki di repo lokal saya dengan apa yang ada di origin master.

Saya tahu ada git diff, namun saya hanya ingin mengisolasinya ke file yang satu ini.

Untuk kesederhanaan katakanlah file tersebut dinamai file1.txtdan memiliki path file lokal = [local_path]dan dalam asal memiliki filepath = [remote-path].

Apa perintah git yang harus saya ketik?

EDIT: Terima kasih semua atas masukan Anda, ini sangat mendalam. Bagi mereka yang menggunakan Eclipse (yang saya dan saya harus katakan sebelumnya) Saya baru tahu bahwa Anda bisa klik kanan -> Bandingkan Dengan -> Cabang, Tag atau Referensi -> pilih versi yang sesuai dan mulai sekarang.

MencariAlpha
sumber
Apakah [jalur jauh] berbeda dari [jalur lokal]?
Code-Apprentice
Saya baru saja memperhatikan hasil edit Anda. Jangan ragu untuk mempostingnya sebagai jawaban.
Code-Apprentice
apa yang kamu sebut "master asal"?
metode gerhana egit baik
user1169587

Jawaban:

251

Jika [remote-path]dan [local-path]sama, Anda bisa melakukannya

$ git fetch origin master
$ git diff origin/master -- [local-path]

Catatan 1: Perintah kedua di atas akan dibandingkan dengan cabang pelacakan jarak jauh yang disimpan secara lokal. Perintah ambil diperlukan untuk memperbarui cabang pelacakan jarak jauh agar sinkron dengan konten server jarak jauh. Atau, Anda bisa melakukannya

$ git diff master:<path-or-file-name>

Catatan 2: master dapat diganti dalam contoh di atas dengan nama cabang apa pun

Magang-Kode
sumber
15
Dan bahkan dapat menghilangkan jalur lokal jika itu adalah direktori saat ini.
Tony Wall
19
Bagi mereka yang sangat noob seperti saya, berikut adalah contohnya:git diff master:README.md -- README.md
fabriciorissetto
24
Sebenarnya, ini adalah contoh yang lebih baik:git diff origin/master -- README.md
JDiMatteo
Saya tidak bisa git fetch mastermenggunakannya sebagai gantinya git fetch .(asal / master tidak bekerja baik) Tapi sisanya bekerja dengan baik.
merampok
1
@rob Anda adalah orang pertama yang menunjukkan kesalahan saya. Seharusnya begitu git fetch **origin**.
Code-Apprentice
114

Untuk melihat perbedaan dari file jarak jauh ke file lokal:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Untuk melihat perbedaan ke arah lain:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

Pada dasarnya Anda dapat membedakan dua file di mana saja menggunakan notasi ini:

git diff ref1:path/to/file1 ref2:path/to/file2

Seperti biasa, ref1dan ref2bisa berupa nama cabang, nama remot / nama cabang, komit SHA, dll.

janos
sumber
17

Untuk membandingkan repositori lokal dengan repositori jarak jauh, cukup gunakan sintaks di bawah ini:

git diff @{upstream}
Ratna Halder
sumber
2

Untuk itu saya menulis skrip bash:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

Dalam skrip di atas, saya mengambil cabang utama jarak jauh (tidak perlu cabang master cabang APA PUN) FETCH_HEAD, kemudian membuat daftar file yang dimodifikasi saja dan membandingkan file yang dimodifikasi git difftool.

Ada banyak yang difftooldidukung oleh git, saya mengkonfigurasi Meld Diff Viewerperbandingan GUI yang baik.
Dari skrip di atas, saya memiliki pengetahuan sebelumnya tentang perubahan apa yang dilakukan oleh tim lain dalam file yang sama, sebelum saya mengikuti tahap git untrack-->staged-->commityang membantu saya untuk menghindari penyelesaian konflik penggabungan yang tidak perlu dengan tim jarak jauh atau membuat cabang lokal baru dan membandingkan dan menggabungkan cabang utama.

adg
sumber
1

Saya mencoba beberapa solusi tapi saya kira cara mudah seperti ini (Anda berada di folder lokal):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Kemudian Anda membandingkan nomor komit terakhir git lokal dan git jarak jauh ....

animati
sumber
0

Jawaban lengkap untuk pertanyaan awal yang berbicara tentang kemungkinan jalur berbeda di lokal dan jarak jauh ada di bawah ini

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Dengan asumsi path lokal adalah docs / file1.txt dan path jarak jauh adalah docs2 / file1.txt, gunakan git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Ini diadaptasi dari halaman bantuan GitHub di sini dan jawaban Code-Apprentice di atas

ng10
sumber