2010-03-25 24 views
182

Câu hỏiLàm thế nào để kiểm tra các thay đổi trên kho lưu trữ Git từ xa (nguồn gốc)?

Lệnh Git để thực hiện quy trình làm việc sau là gì?

Kịch bản

tôi nhân bản từ một kho lưu trữ và đã làm một số cam kết của riêng tôi để kho địa phương của tôi. Trong khi chờ đợi, đồng nghiệp của tôi đã cam kết với kho lưu trữ từ xa. Bây giờ, tôi muốn:

  1. Kiểm tra xem có bất kỳ cam kết mới từ những người khác trên kho từ xa, ví dụ: origin?

  2. Giả sử có 3 cam kết mới về kho từ xa kể từ kéo cuối cùng của tôi, tôi muốn diff cam kết các từ xa kho của, ví dụ: HEAD~3 với HEAD~2, HEAD~2 với HEAD~1HEAD~1 với HEAD.

  3. Sau khi biết điều gì đã thay đổi từ xa, Tôi muốn nhận các cam kết mới nhất từ những người khác.

phát hiện của tôi cho đến nay

Đối với bước 2: Tôi biết các ký hiệu caret HEAD^, HEAD^^ vv và các ký hiệu dấu ngã HEAD~2, HEAD~3, vv

Đối với bước 3: Đó là , Tôi đoán, chỉ cần git pull.

+3

có thể trùng lặp của [Kiểm tra nếu kéo cần thiết trong Git ] (http://stackoverflow.com/questions/3258243/check-if-pull-needed-in-git) –

+0

@ Daniele rằng câu trả lời bạn đang liên kết đến là tuyệt vời và thậm chí đi kèm với một kịch bản bash tùy biến. +1 – gorbysbm

Trả lời

196

Bạn có thể git fetch origin để cập nhật nhánh từ xa trong kho lưu trữ của mình để trỏ đến phiên bản mới nhất. Để có sự khác biệt so với điều khiển từ xa:

git diff origin/master 

Có, bạn cũng có thể sử dụng ký hiệu dấu mũ.

Nếu bạn muốn chấp nhận những thay đổi từ xa:

git merge origin/master 
+26

Giao diện khác bị đảo ngược. Tôi thấy dễ dàng hơn khi sử dụng 'git diff HEAD origin/master' để diff cho thấy điều gì sẽ được áp dụng nếu tôi chấp nhận những thay đổi từ xa. – cbliard

+2

"git fetch origin" và "git show-branch * master" rất hữu ích đối với tôi. –

33

Cách tốt nhất để có một cái nhìn tổng hợp về những gì đang xảy ra "nguồn gốc" là:

git remote show origin 
+7

Nhưng lệnh đó không cho tôi biết có bao nhiêu cam kết đã có trên "xuất xứ" kể từ lần kéo cuối cùng của tôi, phải không? Cách tôi hiểu nó "git remote show origin" là một hoạt động cục bộ và không đi qua mạng để lấy thông tin. – Lernkurve

11

Một giải pháp tiềm năng

Nhờ Alan Haggai Alavi's solution Tôi đã đưa ra quy trình công việc tiềm năng sau:

Bước 1:

git fetch origin 

Bước 2:

git checkout -b localTempOfOriginMaster origin/master 
git difftool HEAD~3 HEAD~2 
git difftool HEAD~2 HEAD~1 
git difftool HEAD~1 HEAD~0 

Bước 3:

git checkout master 
git branch -D localTempOfOriginMaster 
git merge origin/master 
+13

Tại sao bạn cần tạo một nhánh tạm thời cho sự khác biệt giữa các phiên bản của điều khiển từ xa? bạn chỉ có thể 'git diff origing/master^origing/master ^^' –

+0

@ PabloMarin-Garcia: Cảm ơn. Tôi không biết điều đó lúc đó. – Lernkurve

126
git remote update && git status 

Các mặt hàng này trên answer-Check if pull needed in Git

sự

git remote update để cập nhật từ xa của bạn. Sau đó, bạn có thể làm một trong nhiều điều, chẳng hạn như:

  1. git status -uno sẽ cho bạn biết liệu ngành bạn đang theo dõi đang ở phía trước, phía sau hoặc đã tách ra. Nếu nó không nói gì cả, điều khiển cục bộ và từ xa đều giống nhau.

  2. git show-branch *master sẽ hiển thị cho bạn các cam kết trong tất cả các nhánh có tên kết thúc bằng chính (ví dụ: chính và gốc/chủ).

Nếu bạn sử dụng -v với git remote update bạn có thể xem chi nhánh đã được cập nhật, vì vậy bạn không thực sự cần bất kỳ lệnh tiếp theo.

+12

Đây phải là câu trả lời được chấp nhận – mork

+0

Cách tốt nhất để làm điều đó! – mrt

+0

Không đủ. Tôi phải thực hiện một 'git pull 'sau đó ngay sau khi tôi cần đẩy, bởi vì đầu của chi nhánh địa phương của tôi nằm phía sau đối tác từ xa. – Overdrivr

4

Câu hỏi thường gặp của tôi thay vì "bất kỳ điều gì mới hoặc thay đổi trong repo" vì vậy whatchanged có ích. Đã tìm thấy nó here.

git whatchanged origin/master -n 1 
+0

'whatchanged' dường như không còn được dùng nữa: http://stackoverflow.com/a/18585297/33311 – Lernkurve

8

tôi chỉ sử dụng

git remote update 
git status 

Sau đó thì báo cáo bao nhiêu cam kết đằng sau địa phương của tôi là. (Nếu có)

sau đó

git pull origin master 

để đưa tôi địa phương đến nay :)

0

git status phải lúc nào cũng thấy sự khác biệt giữa thầy và nguồn gốc/master ngay cả sau khi lấy. Nếu bạn muốn kết hợp git fetch origin && git status để làm việc, bạn cần phải xác định thông tin theo dõi giữa chi nhánh địa phương và nguồn gốc:

# git branch --set-upstream-to=origin/<branch> <branch> 

Đối với chi nhánh tổng thể:

git branch --set-upstream-to=origin/master master 
Các vấn đề liên quan