Git: Làm thế nào để kiểm tra xem repo cục bộ có được cập nhật hay không?


85

Tôi muốn biết liệu repo cục bộ của mình có được cập nhật hay không (và lý tưởng nhất là nếu chưa, tôi muốn xem những thay đổi).

Làm thế nào tôi có thể kiểm tra điều này mà không làm git fetchhoặc git pull?

Câu trả lời:


94

Hãy thử git fetch --dry-run Hướng dẫn sử dụng ( git help fetch) cho biết:

--dry-run
Show what would be done, without making any changes.

3
Cảm ơn! Mặc dù vậy, thật khó để hiểu từ đầu ra tệp nào đã được thêm / sửa đổi / xóa.
Misha Moroshko

1
Bạn có thể xem những thẻ nào được cập nhật và phạm vi cam kết start..end cho các nhánh khác nhau. Nếu điều này không đủ, hãy thực hiện nó như một lần tìm nạp thích hợp (không phải kéo) sẽ cung cấp cho bạn một bản sao cục bộ, riêng biệt, thích hợp của điều khiển từ xa mà không ảnh hưởng đến công việc chi nhánh của riêng bạn. Một lực kéo sẽ cố gắng hợp nhất cả hai, đó không phải là điều bạn muốn. Việc truyền dữ liệu giống nhau cho dù bạn - chạy thử hay không.
Philip Oakley,

4
tại sao khi tôi chạy git fetch --dry-runkhông có gì hiển thị?
Paramvir Singh Karwal

3
@ParamvirSinghKarwal Git rất thưa thớt trong những gì nó báo cáo. Nếu không có gì để nói, nó không nói gì, như thể không có gì xảy ra. Có thể bạn đã cập nhật bản refspec tìm nạp thông thường của mình. Có thể thêm --all?
Philip Oakley

1
@AaronBeall Nếu đúng như vậy thì rất có thể có nghĩa là bạn đã tìm nạp cục bộ những thay đổi đó (vì vậy không có gì để tìm nạp) nhưng vẫn chưa hợp nhất chúng vào chi nhánh của bạn. git pullgần tương đương với a git fetch && git merge. Nếu tại bất kỳ thời điểm nào bạn chạy tìm nạp mà không có --dry-runthì bạn đã tìm nạp cục bộ mọi thứ.
DuckPuppy

34
git remote show origin

Kết quả:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------

Đó là danh sách các chi nhánh mọi thời đại. Nếu bạn có một kho lưu trữ có lịch sử lâu dài, kết quả đầu ra khá lộn xộn.
Paulo Carvalho

git remote show origin | grep "của bạn / chi nhánh"
jim smith

26

Lần sử dụng đầu tiên git remote update, để cập nhật các bản giới thiệu từ xa của bạn. Sau đó, bạn có thể thực hiện một trong một số điều, chẳng hạn như:

  1. git status -unosẽ cho bạn biết liệu nhánh bạn đang theo dõi đang ở phía trước, phía sau hay đã phân kỳ. Nếu nó không nói gì, thì local và remote giống nhau. Kết quả mẫu:

Trên DEV chi nhánh

Chi nhánh của bạn đứng sau 'origin / DEV' 7 lần cam kết và có thể được chuyển tiếp nhanh.

(sử dụng "git pull" để cập nhật chi nhánh cục bộ của bạn)

  1. 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 'master' (ví dụ: master và origin / master).

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


2
Tại sao điều này lại đi xuống? git remote update ; git status -unođã giải quyết nó. git fetch --dry-runkhông đưa ra đầu ra ngay cả trong trường hợp địa phương ở phía sau từ xa.
Aaron Beall

1
git remote -v updatelà câu trả lời cho tôi.
Paulo Carvalho

17

bạn có thể sử dụng git status -unođể kiểm tra xem chi nhánh địa phương của bạn có được cập nhật với chi nhánh gốc hay không.


18
Nó chỉ cung cấp trạng thái cục bộ, không kiểm tra với chi nhánh từ xa.
Ishan Liyanage

4
Chỉ cung cấp cho địa phương, nhưng git remote update ; git status -unođã lừa! Cácgit fetch --dry-run có đầu ra khi tôi mong đợi nó (và git pullsẽ kéo mọi thứ).
Aaron Beall

1
Câu trả lời này sai và nên bị xóa. Như vậy, nó vẫn tồn tại một huyền thoại rất phổ biến nhưng sai lầm về cách hoạt động của Git, một câu chuyện chỉ bị xóa bỏ khi / nếu ai đó quyết định đọc các bình luận về nó.
Prometheus

8

Không thực sự - nhưng tôi không thấy git fetchsẽ ảnh hưởng như thế nào vì nó sẽ không thay đổi bất kỳ chi nhánh nào tại địa phương của bạn.


Tôi hoàn toàn đồng ý với điều này. Git pull có thể làm hỏng, ghi đè lên các tập tin. Nhưng git fetch chỉ kéo xuống dữ liệu meta, cho phép các lệnh như trạng thái git cho bạn biết liệu repo cục bộ của bạn có được cập nhật hay không mà không cần ghi đè lên bất kỳ tệp nào. Nó có thể không trả lời chữ cái của câu hỏi, nhưng nó trả lời đúng tinh thần của câu hỏi, mang lại cho bạn công cụ bạn muốn. Git fetch, sau đó trạng thái git sẽ cho bạn biết vị trí của repo cục bộ của bạn liên quan đến điều khiển từ xa mà không cần ghi đè tệp.
merlit64

5

Một giải pháp thay thế khác là xem trạng thái của chi nhánh từ xa đang sử dụng git show-branch remote/branchđể sử dụng nó như một so sánh mà bạn có thể thấy git show-branch *branchđể xem chi nhánh trong tất cả các điều khiển từ xa cũng như kho lưu trữ của bạn! hãy xem câu trả lời này để biết thêm https://stackoverflow.com/a/3278427/2711378


5

Bạn sẽ cần đưa ra hai lệnh:

  1. nguồn gốc tìm nạp git
  2. trạng thái git

1
Điều này hoạt động nhưng câu hỏi nói rõ ràng mà không cần 'tìm nạp'. Có nhiều trường hợp bạn muốn biết repo cục bộ của mình khác với repo từ xa như thế nào mà không thực sự tìm nạp hoặc hợp nhất các thay đổi.
pedram bashiri

1
@pedrambashiri Tôi thực sự tò mò, thích cái gì? Theo hiểu biết của tôi, một lần tìm nạp không bao giờ có thể gây hại cho bất cứ điều gì.
Prometheus

@Prometheus Điều đầu tiên, tôi chỉ muốn chỉ ra rằng khi một câu hỏi nêu rõ ràng là 'không tìm nạp', bạn không thể sử dụng tìm nạp trong câu trả lời của mình, nếu không có cách nào khác để làm điều đó hoặc không có trường hợp thực tế nào để làm điều đó mà không cần tìm nạp để được giải thích trong câu trả lời. Nhưng để trả lời câu hỏi của bạn, một lần tìm nạp sẽ cập nhật bản sao cục bộ của repo từ xa của bạn. Nhìn vào sơ đồ trong bài đăng này blog.osteele.com/2008/05/my-git-workflow
pedram bashiri

4

Bạn phải chạy git fetch trước khi có thể so sánh kho lưu trữ cục bộ của mình với các tệp trên máy chủ từ xa của bạn.

Lệnh này chỉ cập nhật các nhánh theo dõi từ xa của bạn và sẽ không ảnh hưởng đến luồng làm việc của bạn cho đến khi bạn gọi git mergehoặcgit pull .

Để xem sự khác biệt giữa chi nhánh cục bộ của bạn và chi nhánh theo dõi từ xa khi bạn đã tìm nạp, bạn có thể sử dụng git diff hoặc git cherry như được giải thích ở đây.


2

Nếu bạn dùng

git fetch --dry-run -v <link/to/remote/git/repo>

bạn sẽ nhận được phản hồi về việc liệu nó có được cập nhật hay không. Vì vậy, về cơ bản, bạn chỉ cần thêm tùy chọn "verbose" vào câu trả lời được đưa ra trước đó.


1

Điều này là không thể nếu không sử dụng git fetchhoặc git pull. Làm thế nào bạn có thể biết liệu kho lưu trữ có "cập nhật" hay không mà không cần đến kho lưu trữ từ xa để xem "cập nhật" có nghĩa là gì?


5
Vui lòng xác nhận rằng! Bạn vừa trả lời những gì bạn nghĩ! Bạn nên cẩn thận hơn vì người mới sẽ gặp rắc rối với nó!
Amanuel Nega

4
@AmanuelNega: Đây chỉ là logic cơ bản. Nếu bạn muốn biết liệu repo cục bộ của bạn có ở trạng thái giống như repo từ xa hay không, bạn cần biết trạng thái của repo từ xa. Giai đoạn = Stage. Nếu bạn không biết trạng thái của repo từ xa, bạn không thể biết liệu repo cục bộ có ở cùng trạng thái hay không. Lưu ý rằng câu trả lời được bình chọn và chấp nhận cao nhất sử dụng git pull, điều mà OP cấm rõ ràng trong câu hỏi của mình.
Jörg W Mittag

2
Được thông báo! git status -unođiều này hoạt động và người ta cũng có thể sử dụng git show-branch *masterđể xem trạng thái của tất cả các nhánh chính! Bạn vẫn nói nó là không thể? Bạn có thể xem trạng thái của bất kỳ chi nhánh nào miễn là bạn có quyền truy cập vào điều khiển từ xa!
Amanuel Nega

2
@AmanuelNega: git statuschỉ cho bạn biết trạng thái của các ref tại địa phương của bạn, nó không cho bạn biết liệu các ref tại địa phương của bạn có được cập nhật hay không với các ref từ xa. Một lần nữa: về mặt logic thì không thể biết trạng thái của remote repo là gì nếu không nhận được trạng thái của remote repo. Giai đoạn = Stage. Đây chỉ là định luật cơ bản của không thời gian.
Jörg W Mittag

6
Nó không phải là không thể "về mặt logic" vì rõ ràng một người có thể gọi ai đó trong phòng máy chủ của bạn và nói, "mã băm của HEAD của bạn trên nhánh chính là gì" họ có thể cho bạn biết và sau đó bạn có thể kiểm tra cục bộ và thấy rằng bạn không không có hàm băm đó. Bây giờ bạn biết chúng không đồng bộ.
James Robinson

1

đã cố gắng định dạng câu trả lời của tôi nhưng không được. Vui lòng nhóm stackoverflow, tại sao việc đăng câu trả lời lại khó đến vậy.

không bao giờ có,

answer:
git fetch origin
git status (bạn sẽ thấy kết quả như "Chi nhánh của bạn đứng sau 'origin / master' bởi 9 lần cam kết")
để cập nhật các thay đổi từ xa: git pull

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.