git: ความแตกต่างระหว่างไฟล์ใน repo ท้องถิ่นและต้นกำเนิด


189

ฉันต้องการค้นหาความแตกต่างระหว่างไฟล์ที่ฉันมีใน repo ในพื้นที่กับสิ่งที่อยู่ในorigin masterนั้น

ฉันรู้ว่ามีgit diffแต่ฉันต้องการแยกมันออกเป็นไฟล์เฉพาะนี้

สำหรับความเรียบง่ายให้บอกว่าไฟล์ที่มีชื่อfile1.txtและมีเส้นทางของแฟ้มท้องถิ่น = [local_path]และในการให้กำเนิดมันมี filepath [remote-path]=

คำสั่ง git ที่ฉันต้องการพิมพ์คืออะไร

แก้ไข: ขอบคุณทุกท่านที่ให้ความเห็นของคุณมันลึกซึ้งมาก สำหรับผู้ที่ใช้ Eclipse (ซึ่งฉันและฉันควรระบุไว้ก่อนหน้านี้) ฉันเพิ่งพบว่าคุณสามารถคลิกขวา -> เปรียบเทียบกับ -> สาขาแท็กหรือข้อมูลอ้างอิง -> เลือกรุ่นที่เหมาะสมและไปที่นั่น


[remote-path] แตกต่างจาก [local-path] หรือไม่
Code-Apprentice

ฉันเพิ่งสังเกตเห็นการแก้ไขของคุณ รู้สึกอิสระที่จะโพสต์มันเป็นคำตอบ
รหัส - ฝึกงาน

สิ่งที่คุณเรียกว่า "ต้นแบบต้นกำเนิด"?

วิธี eclipse egit นั้นดี
user1169587

คำตอบ:


250

ถ้า[remote-path]และ[local-path]เหมือนกันคุณสามารถทำได้

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

หมายเหตุ 1:คำสั่งที่สองข้างต้นจะเปรียบเทียบกับสาขาการติดตามระยะไกลที่เก็บไว้ในเครื่อง คำสั่งดึงข้อมูลจำเป็นต้องมีการอัพเดทสาขาการติดตามระยะไกลเพื่อให้สอดคล้องกับเนื้อหาของเซิร์ฟเวอร์ระยะไกล หรือคุณสามารถทำได้

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

หมายเหตุ 2: masterสามารถถูกแทนที่ในตัวอย่างข้างต้นด้วยชื่อสาขาใด ๆ


15
และยังสามารถข้ามเส้นทางโลคัลหากนั่นคือไดเรกทอรีปัจจุบัน
Tony Wall

19
นี่คือตัวอย่าง:git diff master:README.md -- README.md
fabriciorissetto

24
อันที่จริงนี่เป็นตัวอย่างที่ดีกว่า:git diff origin/master -- README.md
JDiMatteo

ฉันไม่สามารถgit fetch masterใช้แทนได้git fetch .(ต้นกำเนิด / ต้นแบบไม่ทำงานอย่างใดอย่างหนึ่ง) แต่ส่วนที่เหลือทำงานได้ดี
rob

1
@rob คุณเป็นคนแรกที่ชี้ให้เห็นความผิดพลาดของฉัน git fetch **origin**มันควรจะเป็น
Code-Apprentice

114

หากต้องการดูความแตกต่างที่เกิดขึ้นจากไฟล์ระยะไกลไปยังไฟล์ภายในเครื่อง:

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

วิธีดูความแตกต่างในทิศทางอื่น:

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

โดยทั่วไปคุณสามารถกระจายสองไฟล์ได้ทุกที่โดยใช้สัญลักษณ์นี้:

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

ตามปกติref1และref2อาจเป็นชื่อสาขา remotename / branchname, กระทำ SHAs เป็นต้น


17

หากต้องการเปรียบเทียบที่เก็บข้อมูลโลคัลกับรีโมตให้ใช้ไวยากรณ์ด้านล่าง:

git diff @{upstream}

2

สำหรับสิ่งที่ฉันเขียนสคริปต์ทุบตี:

#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

ในสคริปต์ข้างต้นฉันดึงสาขาหลักระยะไกล (ไม่จำเป็นต้องเป็นสาขาหลักของสาขาใด ๆ ) ไปยังFETCH_HEADจากนั้นทำรายการไฟล์ที่ถูกแก้ไขของฉันเท่านั้นและเปรียบเทียบไฟล์ที่แก้ไขแล้วเพื่อgit difftoolแล้ว

มีหลายdifftoolgit รองรับฉันกำหนดค่าMeld Diff Viewerสำหรับการเปรียบเทียบ GUI ที่ดี
จากสคริปต์ข้างต้นฉันมีความรู้มาก่อนว่าการเปลี่ยนแปลงที่ทำโดยทีมอื่นในไฟล์เดียวกันคืออะไรก่อนที่ฉันจะทำตามขั้นตอน git untrack-->staged-->commitซึ่งช่วยฉันในการหลีกเลี่ยงการแก้ไขข้อขัดแย้งผสานกับทีมระยะไกลหรือสร้างสาขาท้องถิ่นใหม่


1

ฉันลองวิธีแก้ปัญหาสองสามอย่าง แต่สิ่งนี้เป็นวิธีที่ง่ายเช่นนี้ (คุณอยู่ในโฟลเดอร์ในเครื่อง):

#!/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

จากนั้นคุณทำการเปรียบเทียบ git โลคอลและ git รีโมตล่าสุดที่ยอมรับหมายเลข ....


0

คำตอบแบบเต็มสำหรับคำถามต้นฉบับที่พูดถึงเส้นทางที่แตกต่างที่เป็นไปได้ในท้องถิ่นและระยะไกลอยู่ด้านล่าง

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

สมมติว่าโลคัลพา ธ คือ docs / file1.txt และพา ธ แบบรีโมตคือ docs2 / file1.txt ให้ใช้ git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

สิ่งนี้ดัดแปลงมาจากหน้าความช่วยเหลือของ GitHub ที่นี่และคำตอบของโปรแกรมฝึกหัดโค้ดด้านบน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.