Tôi hơi bối rối với các lệnh bạn sử dụng. HEAD
thường là nhãn git sử dụng để theo dõi cam kết hiện đang nằm trong thư mục làm việc. Lệnh git fetch
sẽ yêu cầu điều khiển từ xa hoặc cam kết từ xa cấu hình để biết bạn muốn tìm nạp thông tin gì. Sử dụng git fetch HEAD
sẽ cho biết HEAD
là điều khiển từ xa trong kho lưu trữ của bạn. Đó là lệnh làm việc mà không có lỗi là tò mò.
Ví dụ: Kết quả git fetch HEAD
trong kho Tôi hiện đang làm việc trong các lỗi sau
fatal: 'HEAD' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Lệnh git remote
sẽ liệt kê tất cả các điều khiển từ xa, trong khi git remote --verbose
sẽ bao gồm địa chỉ của điều khiển từ xa. Bạn có thể sử dụng điều này để xem bạn có điều khiển từ xa là HEAD
và địa chỉ từ xa mà bạn bè của bạn lưu trữ không?
Tuy nhiên, câu hỏi của tôi đã qua một bên và giúp xóa bỏ sự nhầm lẫn của bạn. Lệnh git fetch ...
chỉ cập nhật từ xa refs - chứ không phải từ cục bộ của bạn.
Để làm cho điều này rõ ràng, hãy nhìn vào bên trong thư mục .git trong kho lưu trữ của bạn (nó được ẩn theo mặc định để bạn có thể cần phải hiện nó).Bạn sẽ tìm thấy một cấu trúc thư mục tương tự như sau
working directory
|=>.git
| |=>objects <= contains data for each commit
| |=>refs
| |=>heads
| |-master <= file containing current commit of local master branch
| |=>remotes
| |=>origin
| |-master <= file containing current commit of remote origin's master branch
|-FETCH_HEAD <= file updated by `git fetch`, contains info of what was fetched
Giả sử bạn kiểm tra các chi nhánh chủ, git checkout master
- git sẽ thay đổi thư mục làm việc của bạn để phù hợp với dữ liệu cam kết trong thư mục 'đối tượng' phù hợp với giá trị cam kết trong tệp '.git/refs/heads/master'.
Nếu bạn sau đó git fetch origin master
, tệp '.git/refs/remotes/origin/master' được cập nhật thành cam kết của nhánh chính trên nguồn gốc từ xa - và tất cả dữ liệu cam kết cần thiết cho cam kết đó được tải xuống và đặt trong thư mục 'đối tượng'.
Điểm quan trọng ở đây là git fetch
không cập nhật thư mục làm việc của bạn phản ánh chi nhánh địa phương được kiểm tra và git fetch
không bao giờ cập nhật chi nhánh địa phương.
Sử dụng git merge ...
hoặc git rebase ...
là cần thiết để cập nhật chi nhánh master
địa phương với các thay đổi trong origin/master
. git pull ...
thực hiện cả hai git fetch ...
và git merge ...
hoặc git rebase ...
, tùy thuộc vào tùy chọn và cấu hình (git merge ...
là mặc định).
Sau tất cả giải thích đó, bạn muốn có thể xem điều gì - nếu có - được tìm nạp từ kho lưu trữ bạn bè của bạn. Lệnh git branch -avv
sẽ liệt kê tất cả các nhánh địa phương và từ xa, với số cam kết và trong trường hợp của các nhánh địa phương, nhánh nào đang theo dõi từ xa.
Để xem cách các chi nhánh liên quan đến nhau, tôi thấy hữu ích khi sử dụng công cụ để vẽ biểu đồ cây kho. Có một số để lựa chọn nhưng tôi tìm thấy lệnh git log
đủ; chẳng hạn như git log --all --graph --oneline --decorate
. Cảnh báo công bằng, điều này có thể khá dài và phức tạp cho một kho lưu trữ lớn. Có thể thu được đầu ra ngắn hơn bằng cách thêm đối số --simplify-by-decoration
.
Để tóm tắt: nếu bạn có thể khắc phục ở nhà tùy thuộc vào thông tin trong kho lưu trữ của bạn. Các lệnh được đề cập ở trên; git remote --verbose
, git branch -avv
và git log ...
phải cung cấp cho bạn sự hiểu biết về trạng thái hiện tại của kho lưu trữ của bạn. Từ đó, bạn có thể xác định xem bạn có cần làm gì khác để lấy dữ liệu trong chi nhánh địa phương của mình bằng cách sử dụng git merge
hoặc git rebase
hay không.
Như mọi khi, nếu bạn gặp rắc rối, hãy đăng lại với những gì bạn tìm hiểu.
là 'nguồn gốc' đồng nghiệp của bạn repo? –
Lưu ý: Vì git 1.8.4 (tháng 8 năm 2013), bạn không nên ngạc nhiên hơn: 'git fetch origin master' sẽ cập nhật' origin/master'! Xem [câu trả lời của tôi dưới đây] (http://stackoverflow.com/a/20967347/6309) – VonC
Liên quan: [FETCH_HEAD trong Git có nghĩa là gì?] (Http://stackoverflow.com/q/9237348/55075) tại SO – kenorb