git diff giữa kho lưu trữ từ xa và bản gốc


170

Tôi đã nhân bản một kho lưu trữ github và không thay đổi cục bộ. Kho lưu trữ Github di chuyển về phía trước với các cam kết trên cùng một chi nhánh.

  1. Làm cách nào để tìm khác biệt giữa kho lưu trữ cục bộ của tôi và kho lưu trữ github ban đầu?
  2. Làm cách nào để tìm khác biệt giữa bản sao làm việc của tôi và kho lưu trữ github ban đầu?
  3. Làm cách nào để tìm khác biệt giữa kho lưu trữ cục bộ của tôi và kho lưu trữ github khác của cùng dự án?


1
@CiroSantilli 心 心 Chúng chắc chắn tương tự nhau, vì vậy liên kết của bạn chắc chắn hữu ích.
jvriesem

Câu trả lời:


161

1) Thêm bất kỳ kho lưu trữ từ xa nào bạn muốn so sánh:

git remote add foobar git://github.com/user/foobar.git

2) Cập nhật bản sao cục bộ của bạn từ xa:

git fetch foobar

Fetch sẽ không thay đổi bản sao làm việc của bạn.

3) So sánh bất kỳ chi nhánh nào từ kho lưu trữ cục bộ của bạn với bất kỳ điều khiển từ xa nào bạn đã thêm:

git diff master foobar/master

Tôi sẽ cần git fetch trước diff? Tôi đoán không có cách nào để khác mà không có nó.
Oleg Proudnikov

Đây thực sự chỉ là một câu trả lời cho câu hỏi 3 (khác với một repo github khác).
Ruslan Kabalin

5
Không có gì phân biệt "kho github gốc" với bất kỳ kho lưu trữ từ xa nào khác. Hay tôi đang hiểu lầm điều gì đó?
dbyrne

Khi tôi thử nó với git 2.7.4, "git diff master foobar / master" không cho thấy sự khác biệt. Tôi nhìn tôi giống như nó so sánh bản sao cục bộ của tôi ("chính") với repo được đưa ra làm đối số thứ nhất ("chính") và trong đó chỉ khác "đường dẫn / tệp" "foobar / master". Nhưng lệnh "diff foobar / master" đã làm việc với tôi, so sánh chủ địa phương của tôi với foobar / master.
dùng2081279

Thay vì fetch(số 2) thay thế: git remote update- nó sẽ cập nhật tất cả các nhánh của bạn được đặt để theo dõi những cái ở xa, nhưng không hợp nhất bất kỳ thay đổi nào trong; hoặcgit pull
Timo

49

Một câu trả lời khác cho câu hỏi của bạn (giả sử bạn là chủ và đã thực hiện "git fetch origin" để khiến bạn nhận thức lại về các thay đổi từ xa):

1) Cam kết trên nhánh từ xa kể từ khi nhánh cục bộ được tạo:

git diff HEAD...origin/master

2) Tôi giả sử bằng "bản sao làm việc", bạn có nghĩa là chi nhánh địa phương của bạn với một số cam kết cục bộ chưa có trên điều khiển từ xa. Để xem sự khác biệt của những gì bạn có trên chi nhánh địa phương nhưng điều đó không tồn tại trên nhánh chạy từ xa:

git diff origin/master...HEAD

3) Xem câu trả lời của dbyrne.


Cảm ơn bạn đã HEAD..origin/mastercú pháp! Chúng tôi đã nhận được lỗi với nguồn gốc / ĐẦU không tồn tại và điều này đã giải quyết nó.
Dan Bechard

@ruslan: có nghĩa là git diff HEAD...origin/mastergì khi trả về không có gì nếu tôi đã sao chép một thư mục từ xa mà tôi được phép thay đổi?
Mona Jalal

Đã xảy ra lỗi khi tôi nhân bản bằng Windows GUI do đó tôi tự hỏi liệu bản sao đã hoàn thành chưa. Tôi thấy các thư mục ở đây trong thư mục của tôi nhưng tôi muốn chắc chắn rằng nó giống như từ xa. Tuy nhiên trong git shell, git diff không trả về gì cả. Tôi bối rối liệu bản sao của tôi đã thành công hay chưa?
Mona Jalal

@MonaJalal có nghĩa là không có thay đổi ngược dòng kể từ khi bạn nhân bản nó.
Ruslan Kabalin

21

Ví dụ này có thể giúp ai đó:

Lưu ý " origin" là bí danh của tôi cho điều khiển từ xa "Cái gì trên Github"
Ghi chú " mybranch" là bí danh của tôi cho chi nhánh của tôi "địa phương" mà tôi đang đồng bộ hóa với github
- tên chi nhánh của bạn là 'chính chủ' nếu bạn không tạo một. Tuy nhiên, tôi đang sử dụng tên khác mybranchđể hiển thị tham số tên nhánh được sử dụng.


Chính xác thì repos từ xa của tôi trên github là gì?

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

Thêm "kho lưu trữ github khác có cùng mã" - chúng tôi gọi đây là một ngã ba:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

đảm bảo repo địa phương của chúng tôi được cập nhật:

$ git fetch

Thay đổi một số thứ cục bộ. hãy nói tập tin ./foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

Xem lại những thay đổi không cam kết của tôi

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

Cam kết tại địa phương.

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

Bây giờ, tôi khác với điều khiển từ xa (trên github)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Khác biệt với điều khiển từ xa - ngã ​​ba của bạn: (điều này thường được thực hiện với git diff master origin)

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(git đẩy để áp dụng những điều này cho điều khiển từ xa)

Chi nhánh từ xa của tôi khác với chi nhánh từ xa như thế nào?

$ git diff origin/mybranch origin/master

Làm thế nào để công cụ địa phương của tôi khác với chi nhánh chủ từ xa?

$ git diff origin/master

Làm thế nào để công cụ của tôi khác với ngã ba của người khác, chi nhánh chính của cùng một repo?

$git diff mybranch someOtherRepo/master

5
Trước khi chúng tôi thực hiện một 'git diff', tôi nghĩ rằng cần phải thực hiện một 'git fetch' để đảm bảo rằng bản sao từ xa cục bộ của chúng tôi được cập nhật.
Don

1
Tôi đã đọc khoảng 20 bài viết về cách so sánh từ xa và cục bộ Tôi chỉ tự mình tìm ra điều này: git fetch là BẮT BUỘC trước tiên. git thực sự là mã lắp ráp của RCS. chúa Cảm ơn đã xác nhận, Don!
Terence Parr

chỉ cần thêm vào git fetchcâu trả lời này
FlipMcF

1
Hummm ... Tôi không thích cách tôi sử dụng 'myfork' làm tên chi nhánh của mình. Điều đó có thể gây nhầm lẫn cho ai đó (Giống như tôi, người vừa trở lại vì câu trả lời này)
FlipMcF

Đã chỉnh sửa - sự rõ ràng và trả lời câu hỏi 'khác biệt ngã ba' # 3
FlipMcF
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.