git: diff giữa tập tin trong repo cục bộ và nguồn gốc


186

Tôi muốn tìm sự khác biệt giữa một tệp tôi có trong repo cục bộ của tôi so với những gì có trong origin master.

Tôi biết rằng có git diff, tuy nhiên tôi chỉ muốn tách nó ra thành một tập tin cụ thể này.

Để đơn giản, giả sử tập tin được đặt tên file1.txtvà nó có đường dẫn tệp cục bộ = [local_path]và trong nguồn gốc, nó có filepath = [remote-path].

Lệnh git tôi cần gõ là gì?

EDIT: Cảm ơn tất cả các bạn cho đầu vào của bạn nó đã rất sâu sắc. Đối với những người đang sử dụng Eclipse (mà tôi và tôi nên đã nêu trước đó) tôi mới phát hiện ra rằng bạn có thể chỉ cần bấm chuột phải -> So sánh với -> Chi nhánh, Thẻ hoặc Tham chiếu -> chọn phiên bản phù hợp và bạn sẽ đến đó.


[Đường dẫn từ xa] có khác với [đường dẫn cục bộ] không?
Code-Apprentice

Tôi chỉ nhận thấy chỉnh sửa của bạn. Hãy đăng nó như một câu trả lời.
Code-Apprentice

Bạn gọi "chủ gốc" là gì?

phương pháp nhật thực là tốt
user1169587

Câu trả lời:


247

Nếu [remote-path][local-path]giống nhau, bạn có thể làm

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

Lưu ý 1: Lệnh thứ hai ở trên sẽ so sánh với nhánh theo dõi từ xa được lưu trữ cục bộ. Lệnh tìm nạp được yêu cầu để cập nhật nhánh theo dõi từ xa để đồng bộ với nội dung của máy chủ từ xa. Ngoài ra, bạn chỉ có thể làm

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

Lưu ý 2: master có thể được thay thế trong các ví dụ trên bằng bất kỳ tên chi nhánh nào


15
Và thậm chí có thể bỏ qua đường dẫn cục bộ nếu đó là thư mục hiện tại.
Tony Wall

19
Đối với những người cực kỳ không thích tôi, đây là một ví dụ:git diff master:README.md -- README.md
Fabriciorissetto

23
Trên thực tế, đây là một ví dụ tốt hơn:git diff origin/master -- README.md
JDiMatteo

Tôi không thể làm git fetch masterthay vào đó được sử dụng git fetch .(nguồn gốc / chủ cũng không hoạt động) Nhưng phần còn lại hoạt động tốt.
cướp

1
@rob Bạn là người đầu tiên chỉ ra sai lầm của tôi. Nó phải git fetch **origin**.
Code-Apprentice

114

Để xem sự khác biệt đi từ tệp từ xa đến tệp cục bộ:

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

Để xem sự khác biệt theo hướng khác:

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

Về cơ bản, bạn có thể tìm bất kỳ hai tệp nào ở bất cứ đâu bằng cách sử dụng ký hiệu này:

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

Như thường lệ, ref1ref2có thể là tên chi nhánh, tên từ xa / tên nhánh, SHA cam kết, v.v.


17

Để so sánh kho lưu trữ cục bộ với kho từ xa, chỉ cần sử dụng cú pháp dưới đây:

git diff @{upstream}

2

Cho rằng tôi đã viết một kịch bản 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

Trong đoạn mã trên, tôi tìm nạp nhánh chính từ xa (không cần thiết nhánh nhánh BẤT K) của nó) FETCH_HEAD, sau đó tạo danh sách các tệp đã sửa đổi của tôi và so sánh các tệp đã sửa đổi với git difftool.

Có nhiều difftoolhỗ trợ bởi git, tôi đã cấu hình Meld Diff Viewerđể so sánh GUI tốt.
Từ tập lệnh trên, tôi có kiến ​​thức trước về những thay đổi được thực hiện bởi các nhóm khác trong cùng một tệp, trước khi tôi thực hiện các giai đoạn git untrack-->staged-->commitgiúp tôi tránh giải quyết xung đột hợp nhất với nhóm từ xa hoặc tạo chi nhánh địa phương mới và so sánh và hợp nhất trên nhánh chính.


1

Tôi đã thử một vài giải pháp nhưng tôi thấy cách dễ dàng như thế này (bạn đang ở trong thư mục cục bộ):

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

Sau đó, bạn đã so sánh git cục bộ và git số cam kết cuối cùng từ xa ....


0

Dưới đây là câu trả lời đầy đủ cho câu hỏi ban đầu nói về một con đường khác nhau có thể có trên địa phương và từ xa

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

Giả sử đường dẫn cục bộ là docs / file1.txt và đường dẫn từ xa là docs2 / file1.txt, hãy sử dụng git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Điều này được điều chỉnh từ trang trợ giúp của GitHub tại đây và câu trả lời của Code-Apprentice ở trên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.