Làm thế nào để so sánh một chi nhánh git địa phương với chi nhánh từ xa của nó?


1051

Làm thế nào tôi có thể thấy diffgiữa một chi nhánh địa phương và một chi nhánh từ xa?


5
Câu hỏi này đã được hỏi lại sau. Nó có một câu trả lời hay: stackoverflow.com/questions/11935633/ từ
rustybeanstalk

3
ví dụ: git diff master origin / master (trong đó master là nhánh master cục bộ và origin / master là nhánh master từ xa).
Dũng

@klyngbaek, câu trả lời này nói riêng ;-)

Ban đầu tôi đã thử git diff HEAD origin/HEADdường như chỉ đến một nhánh từ xa khác với nhánh tôi dự định. Sử dụng tên chi nhánh đầy đủ hoạt động như mong đợi.
Deanna

Câu trả lời:


593

Để cập nhật các nhánh theo dõi từ xa, bạn cần nhập git fetchtrước rồi:

git diff <masterbranch_path> <remotebranch_path>

Bạn có thể git branch -aliệt kê tất cả các nhánh (cục bộ và từ xa) sau đó chọn tên nhánh từ danh sách (chỉ cần xóa remotes/khỏi tên nhánh từ xa.

Ví dụ: git diff master origin/master(trong đó "master" là nhánh chính cục bộ và "origin / master" là một từ xa cụ thể là nhánh gốc và nhánh chính.)


23
Anh ta có thể cần tìm nạp trước ( git fetch)
Houssem Badri

Điều đó chỉ cho thấy một sự lén lút trong các thay đổi trong bash, có cách nào để mở tất cả các thay đổi trong một IDE như mã VS không?
Harsh Phoujdar

@Harsh Phoujdar Thêm mã dưới đây vào tệp .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseĐảm bảo đường dẫn đến tệp code.exe là chính xác.
Aman

1307
git diff <local branch> <remote>/<remote branch>

Ví dụ git diff master origin/master, hoặcgit diff featureA origin/next

Tất nhiên để nói từ xa theo dõi chi nhánh bạn cần phải git fetchđầu tiên; và bạn cần nó để có thông tin cập nhật về các chi nhánh trong kho lưu trữ từ xa.


98
để chính xác hơn: git diff <nhánh cục bộ> <remote> / <nhánh từ xa>
nalply

38
Tôi thường làm git diff <remote>/<remote branch> <local branch>để xem những gì đẩy của tôi sẽ làm với repo từ xa.
Michał Tatarynowicz

76
Thậm chí ngắn hơn git diff originlà đủ nếu bạn chỉ so sánh với chi nhánh thượng nguồn của bạn.
Ludder

12
vui lòng thêm git fetchvào lúc đầu, nó gây rắc rối cho người mới như tôi
Saif

1
Này, không nên git diff <remote>/<remote branch> <local branch>sao? Mặt khác, tôi nhận được các bổ sung và xóa được bật trên máy tính của mình (phiên bản git 2.7.0.windows.2)
Martín Coll

183

Loại đầu tiên

git branch -a

để có được danh sách các chi nhánh có sẵn. Trên đầu ra, bạn có thể thấy một cái gì đó như

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Sau đó hiển thị khác

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
không nên ...hơn là ..?
Eliran Malka

9
Tôi chắc chắn đã chọn đây là câu trả lời. Theo chỉ dẫn của bạn, tôi có thể xem sự khác biệt giữa một chi nhánh địa phương và một chi nhánh từ xa. Cảm ơn!
Tass

1
Tôi thường làm điều git log origin/my_branch..đó sẽ làm HEADnhư giới thiệu địa phương, mà chủ yếu là những gì bạn có ý nghĩa.
Rudie

4
+1 cho câu trả lời tốt nhất theo ý kiến ​​khiêm tốn của tôi. Sẽ xứng đáng với +2 nếu bạn đề cập đến "tìm nạp" để đồng bộ hóa hình ảnh "từ xa" của nguồn nhân bản. Bước tổng quan về stat / màu đặc biệt hữu ích.
bvj

3
Cảm ơn vì một câu trả lời cuối cùng đã có kết quả trong bảy hoặc tám "câu trả lời" dẫn đến ít hơn fatal: bad revisionhoặc fatal: ambiguous argument. Tất cả những gì tôi muốn là nhìn thấy khác biệt trên cùng một tập tin từ một chi nhánh khác, đó có phải là quá nhiều để hỏi không? Vâng, đúng vậy. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>hoạt động tuyệt vời trên git 1.8.3.1
Steve Bonds

144

Nếu bạn đang ở một nhánh nhất định và bạn muốn so sánh nó với một nhánh ngược dòng bạn đang theo dõi, hãy sử dụng

git diff @{upstream}

nếu ngược dòng của bạn không được đặt (thường là như vậy, cảm ơn Arijoon trong các bình luận)

git diff @{push}

Với câu trả lời này , tài liệu git để chỉ định sửa đổi có:

<branchname>@{upstream}, Ví dụ như master@{upstream}, @{u}
Các hậu tố @{upstream}để một BRANCHNAME (viết tắt <branchname>@{u}) đề cập đến chi nhánh mà các chi nhánh theo quy định của branchnameđược thiết lập để xây dựng trên đầu trang của (cấu hình với branch.<name>.remotebranch.<name>.merge). Một branchnamemặc định bị thiếu cho hiện tại.


10
Câu trả lời rất tốt chỉ thiếu một phần nhỏ. Thay đổi dòng thành git diff @ @{upstream}. Phần bổ sung @HEAD, hiện tại bạn đang ở đâu, vì vậy bạn đang so sánh HEADvới dòng ngược mà chi nhánh của bạn đang theo dõi. Bạn có thể sử dụng @{push}thay vì ngược dòng để nhận khác biệt giữa nhánh bạn được đặt thành
Arijoon

3
câu trả lời tốt nhất, không yêu cầu tìm nạp từ xa. cần nhiều upvote!
jcomeau_ictx

3
Trong vỏ cá tôi đã có kết quả : fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Phải sử dụng git diff @\{upstream\}thay thế. 😥
Landon Kuhn

Bạn cần phải git fetchđầu tiên, điều này không làm gì, cho thấy không có đầu ra; đã kiểm tra bằng cách xóa một tệp trong nguồn gốc repo và chạy lệnh này cục bộ. .. chỉ hoạt động sau khi lấy.

Ngoài ra, như câu trả lời như được đưa ra bao gồm bất kỳ thay đổi địa phương. đôi khi điều này là mong muốn, lần khác, không.
Deanna

44

Tôi hiểu rõ hơn nhiều về đầu ra của:

git diff <remote-tracking branch> <local branch>

điều đó cho tôi thấy những gì sẽ bị loại bỏ và những gì sẽ được thêm vào nếu tôi đẩy chi nhánh địa phương. Tất nhiên là như vậy, chỉ là nghịch đảo, nhưng đối với tôi thì dễ đọc hơn và tôi dễ hiểu hơn khi nhìn vào những gì sắp xảy ra.


Tôi nhận được kết quả chính xác tương tự với: git diff <nhánh cục bộ> <nhánh theo dõi từ xa> hoặc git diff <nhánh theo dõi từ xa> <nhánh cục bộ>
user2928048 17/07/17

32

Cách dễ dàng:

git fetch
git log -p HEAD..FETCH_HEAD

Điều này trước tiên sẽ tìm nạp các thay đổi từ điều khiển từ xa (nguồn gốc) mặc định của bạn. Điều này sẽ được tạo tự động khi bạn sao chép một repo. Bạn cũng có thể rõ ràng : git fetch origin master.

Sau đó, nhật ký git được sử dụng để so sánh chi nhánh hiện tại của bạn với chi nhánh vừa tìm nạp. ( -pTùy chọn (tạo bản vá) là những gì cho thấy sự khác biệt .)


14

Đây là cách tôi làm điều đó.

#To update your local.
git fetch --all

cái này sẽ lấy mọi thứ từ xa, vì vậy khi bạn kiểm tra sự khác biệt, nó sẽ so sánh sự khác biệt với nhánh từ xa.

#to list all branches
git branch -a

lệnh trên sẽ hiển thị tất cả các nhánh.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Bây giờ, bạn có thể kiểm tra sự khác biệt như sau.

git diff origin/<branch_name>

điều này sẽ so sánh chi nhánh địa phương của bạn với chi nhánh từ xa


2
git fetch --all sẽ tìm nạp mọi thứ từ TẤT CẢ điều khiển từ xa. git fetch là đủ nếu bạn sử dụng từ xa gốc mặc định.
Barshe Keller

Thật ngạc nhiên khi sau 8 năm, chúng tôi nhận được một câu trả lời đầy đủ giải thích chính xác các bước. Chúng ta có thể làm một - trợ giúp để có được các lệnh. SO là về việc hiểu họ.
gdbj

11

Hãy để nhánh làm việc của bạn là phát triển và muốn phân biệt giữa nhánh phát triển cục bộ và nhánh phát triển từ xa, trường hợp đó, cú pháp nên giống git diff remotes/origin/development..development
hoặc

git fetch origin git diff origin/development


11

tl; dr :git diff <local branch> <remote branch>

Khi sử dụng git trên vỏ, trước tiên tôi muốn tự định hướng bằng cách nhìn xung quanh. Đây là một lệnh để hiển thị tất cả các chi nhánh

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Ở đây tôi có hai chi nhánh địa phương ( my-branchmaster) và 4 từ xa ( some-branch, some-other-branch, master, vàmy-branch ).

Ngoài ra, dấu hoa thị bên cạnh my-branchbáo hiệu thực tế là tôi hiện đang ở nhánh đó (bạn cũng sẽ biết rằng bằng cách sử dụng lệnh git statussẽ xuất ra On branch my-branch.:).

Lưu ý: các nhánh từ xa trong vỏ git bash được hiển thị màu đỏ trong khi các nhánh cục bộ được hiển thị bằng màu xanh lá cây.

Nếu bạn chỉ muốn hiển thị các chi nhánh từ xa :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Để chỉ hiển thị các nhánh cục bộ, bạn có thể muốn sử dụng git branch -lnhưng đó là một lệnh hoàn toàn khác. Đến hiển thị các chi nhánh địa phương sử dụng git branchmà không có tùy chọn

$ git branch
* my-branch 
  master

Để hoàn thành đánh giá các tùy chọn chi nhánh cơ bản, có --list điều đó trái ngược với những gì bạn có thể mong đợi là có cho phép lọc . Sử dụng nó với một mẫu như thế này:

$ git branch --list 'my*'
* my-branch

Bạn cũng có thể kết hợp --listvới các tùy chọn -a-rđảm bảo điều chỉnh mô hình của mình cho phù hợp ( hãy nhớ: các nhánh từ xa bắt đầu bằng "điều khiển từ xa" ). Thí dụ:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Tài liệu: https://git-scm.com/docs/git-branch

Bây giờ bạn có thể so sánh bất kỳ hai chi nhánh từ tất cả các có sẵn (bạn cũng có thể so sánh hai địa phương hoặc hai điều khiển từ xa).

Ở đây tôi đang so sánh địa phương với điều khiển từ xa my-branch , chúng được đồng bộ hóa nên tôi không nhận được bất kỳ đầu ra nào:

$ git diff my-branch remotes/origin/my-branch

Lưu ý: bạn phải cung cấp tên đầy đủ của các chi nhánh không có dấu ngoặc kép.

Tôi cũng có thể so sánh địa phương my-branchvới điều khiển từ xa master. Ở đây tôi nhận được một số đầu ra vì điều khiển từ xa my-branchchưa được sáp nhập vào nhánh chính.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]

11

Nếu bạn muốn thấy sự khác biệt chỉ là tên của các tệp đã thay đổi thì hãy sử dụng :

git diff --name-status <remote-branch> <local-branch>,

nếu không , điều này sẽ hiển thị tất cả sự khác biệt giữa hai nhánh:

git diff <remote-branch> <local-branch>


9

Dưới đây là câu trả lời ngắn gọn nếu bạn đang so sánh chi nhánh hiện tại của mình và với điều gì đó bạn muốn git pull.

git fetch
git diff FETCH_HEAD

Lệnh đầu tiên sẽ chỉ ra nhánh từ xa nào tương ứng với nhánh hiện tại của bạn. Một tạo tác của tính toán đó trong FETCH_HEADtài liệu tham khảo. Sau đó, lệnh thứ hai sử dụng so sánh tham chiếu đó so với những gì chi nhánh hiện tại của bạn có.


6

Tôi biết đã có một vài câu trả lời cho câu hỏi này nhưng tôi đã gặp một lỗi kỳ lạ khi thử hầu hết chúng.

Trong trường hợp của tôi, tôi có một giây từ xa gọi herokuđó là không những originvà vì nó không đồng bộ tôi đã nhận lỗi này khi cố gắng chạy git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

hoặc điều này khi thử phương pháp khác git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

Giải pháp đã đề cập rõ ràng đến tên từ xa git fetchtrước khi chạy git diff, trong trường hợp của tôi:

$ git fetch heroku
$ git diff master heroku/master

Hy vọng rằng sẽ giúp những người khác với vấn đề tương tự.


4
git difftool <commit> .

Điều này sẽ so sánh các cam kết bạn muốn với các tệp cục bộ của bạn. Đừng quên dấu chấm cuối cùng (đối với địa phương).

Ví dụ: để so sánh các tệp cục bộ của bạn với một số cam kết:

git Difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(và bạn không cần git fetch, trừ khi cần so sánh với các cam kết mới)


Tôi nghĩ rằng đây là điều thú vị bởi vì tôi có thể so sánh trước khi cam kết và thúc đẩy. Thật không may trong windows vimdiff cho hiển thị là xấu xí; Có cách nào để sử dụng mọi thứ tốt hơn, như notepad ++ không?
Stefano Scarpanti

3

Thí dụ

git diff 'master' 'testlocalBranch'

Nếu bạn đang sử dụng trình soạn thảo như webstorm, bạn có thể nhấp chuột phải vào tệp chọn so sánh với chi nhánh và nhập / chọn chi nhánh của bạn.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


2
Điều này thêm gì vào câu trả lời được chấp nhận 7,5 năm tuổi với hơn 170 lượt upvote?
Mark Rotteveel

Đây là Đối với mrblah người dùng hoặc cho những người dùng tương tự đã thêm nhận xét cho câu trả lời được chấp nhận. Cú pháp khác với một ví dụ và ví dụ giúp nhiều hơn từ quan điểm của người mới bắt đầu.
Kurkula

2
Trong trường hợp đó, cần bình luận về câu trả lời đó.
rachit

1

Trong VS 2019, chỉ cần thực hiện FETCH Không kéo mã.

Đây là những gì tôi đã làm. Đã thêm bên dưới trong tệp .gitconfig để tôi có thể sử dụng Beyond So sánh

File location: C:\Users\[username]\.gitconfig

Đã thêm bên dưới

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Mở dấu nhắc lệnh và vào thư mục làm việc. Tôi đã đưa ra dưới đây để so sánh chi nhánh DEV địa phương với chi nhánh DEV từ xa

git difftool dev origin/dev --dir-diff

Điều này sẽ mở Beyond So sánh và mở các thư mục có các tệp khác nhau. Nếu không có thay đổi Ngoài So sánh sẽ không khởi chạy.


0

Tôi tự hỏi liệu có bất kỳ thay đổi trong chi nhánh chủ của tôi ...

  1. Trước tiên, bạn cần thay đổi chi nhánh của mình (Nếu bạn đã ở dưới chi nhánh này, bạn không cần phải làm điều này!)

chủ thanh toán git

  1. Bạn có thể xem tập tin nào đã được sửa đổi dưới nhánh chính của bạn bằng lệnh này

tình trạng git

  1. Liệt kê các chi nhánh

chi nhánh git -a

  • tổng
    điều khiển từ xa / gốc / master
  1. Tìm sự khác biệt

nguồn gốc git diff / chủ


0

Thiết lập

git config alias.udiff 'diff @{u}'

Thay đổi tiêu đề với HEAD @ {ngược dòng}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Khác biệt với một Chi nhánh từ xa tùy ý

Điều này trả lời câu hỏi trong tiêu đề của bạn ("từ xa"); nếu bạn muốn tìm khác biệt với "một điều khiển từ xa" (không được cấu hình là ngược dòng cho chi nhánh), bạn cần nhắm mục tiêu trực tiếp vào nó. Bạn có thể thấy tất cả các chi nhánh từ xa với những điều sau đây:

git branch -r

Bạn có thể thấy tất cả các điều khiển từ xa được cấu hình với các mục sau:

git remote show

Bạn có thể thấy cấu hình nhánh / theo dõi cho một điều khiển từ xa (ví dụ: nguồn gốc) như sau:

git remote show origin

Khi bạn xác định nhánh gốc thích hợp, chỉ cần làm khác đi bình thường :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

Điều này khá đơn giản. Bạn có thể dùng:git diff remote/my_topic_branch my_topic_branch

my_topic_branchChi nhánh chủ đề của bạn ở đâu


0

Giả sử bạn đã thiết lập originkho lưu trữ từ xa. Sau đó,

git diff <local branch> <origin>/<remote branch name>


0

thử:

git diff origin HEAD

Giả sử bạn muốn khác bạn hiện tại của chi nhánh địa phương HEADso với nguồn gốc. Và giả sử bạn đang ở chi nhánh địa phương. :)


-3

Nếu bạn sử dụng TortoiseGit (nó cung cấp GUI cho Git), bạn có thể nhấp chuột phải vào thư mục repo Git của mình sau đó nhấpGit Sync .

Bạn có thể chọn các chi nhánh của bạn để so sánh nếu không được chọn. Hơn bạn có thể xem sự khác biệt cam kết. Bạn cũng có thể nhấp chuột phải vào bất kỳ cam kết nào sau đó Compare with previous revisionđể xem sự khác biệt cạnh nhau.đồng bộ rùa git để so sánh chi nhánh từ xa và địa phương

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.