Tại sao Git lưu ý sai rằng các tệp của tôi được cập nhật?


8

Tôi có hai thư mục Bộ dữ liệu A và B trong thư mục tệp của tôi liên kết đến cùng một kho lưu trữ Git.

Tôi đã tạo một tập tin trong thư mục A được gọi index.html. Sau đó tôi tạo một tệp khác cũng được gọi index.htmltrong thư mục B. Sau đó tôi thêm index.htmlvào thư mục B, cam kết và đẩy nội dung của B.

Khi tôi lấy từ thư mục A, Git tuyên bố rằng các tệp của tôi là "Đã cập nhật". Tuy nhiên cả hai thư mục rõ ràng có các index.htmltập tin khác nhau . Chuyện gì đang xảy ra vậy?


Cập nhật - xóa "index.html" khỏi thư mục A sau đó không giúp ích gì. Lỗi "Đã cập nhật." vẫn phát sinh khi tôi kéo vào thư mục A.
David Faux

Bạn đã làm git rm index.htmltrong A?
new123456

1
Khi bạn tạo index.html trong Thư mục A, bạn git addgit commitnó, hoặc chỉ đặt nó vào thư mục? Git không quan tâm những gì trong thư mục, chỉ những gì nó được bảo phải quan tâm.
asfallows

Câu trả lời:


9

git pullCông việc của họ là fetchcam kết mới và mergeđưa họ vào chi nhánh hiện tại. Nếu nhánh hiện tại không bị lỗi thời so với nhánh bạn kéo từ đó, pull sẽ nói Already up-to-date. ngay cả khi bạn có thay đổi cục bộ trong thư mục làm việc của mình . git pullliên quan đến các nhánh, không phải cây làm việc - nó sẽ chỉ nhận xét về cây làm việc nếu có những thay đổi gây trở ngại cho việc hợp nhất.

Mô tả của bạn không đủ để giải thích lý do tại sao nó không phản đối hiện tại index.html, nhưng bạn không nên hiểu Already up-to-date.như git nghĩ rằng bạn không có thay đổi. Thay vào đó, sử dụng git statusđể có được một bản tóm tắt.

Để hiểu trạng thái của các nhánh của bạn, git branch -vrất hữu ích (nó hiển thị ID cam kết và mối quan hệ với nhánh ngược dòng của mỗi nhánh) hoặc gitk --allcho chế độ xem đồ họa của tất cả các cam kết.


2

Nếu tôi hiểu chính xác đoạn script sau sẽ tái tạo vấn đề của bạn:

kiểm tra mkdir
kiểm tra cd
git init --bare test.git
git clone test.git a
git clone test.git b
lặp lại a> a / index.html
tiếng vang b> b / index.html
cd b
git thêm index.html
git cam kết -m thêm
git đẩy nguồn gốc
cd ..
kéo git

Bản git pullin cuối cùng :

từ xa: Đếm các đối tượng: 3, xong.
từ xa: Tổng 3 (delta 0), tái sử dụng 0 (delta 0)
Giải nén các đối tượng: 100% (3/3), xong.
Từ / nhà / cyrus / tmp / kiểm tra / kiểm tra
 * [chi nhánh mới] chính -> nguồn gốc / chủ

Và nội dung index.htmlđã bị âm thầm ghi đè:

cyrus: ~ / tmp / test / a $ cat index.html
b

Tôi không biết phiên bản git nào bạn đang sử dụng, nhưng đó rõ ràng không phải là hành vi an toàn. Điều gì xảy ra nếu tôi có một cái gì đó quan trọng trong đó được ghi đè index.html? Lần kéo cuối cùng, git của tôi nóierror: Untracked working tree file 'index.html' would be overwritten by merge.
jjlin

git version 1.7.2.5. Tôi chưa bao giờ nói đó là một hành vi an toàn. Tin nhắn đó bật ra trong một số trường hợp nhất định, nhưng đó không phải là trường hợp (đừng hỏi tôi tại sao).
cYrus

0

Hãy nhớ một điều về git- nó theo dõi nội dung, không phải tập tin .

Trong nội bộ, tất cả các nội dung mà kho lưu trữ, là một đốm màu ở đâu đó. Những gì bạn coi là một tập tin, gitcoi là một tên chỉ đến một đốm màu. Những gì bạn coi là hai tệp có cùng nội dung, gitđược coi là hai tên được liên kết với cùng một blob. Vì vậy, vì không có đốm màu nào thay đổi, nên kho lưu trữ không thay đổi.

Bạn đang mong đợi git hoạt động giống như hệ thống tập tin của bạn (hoặc có thể giống như hầu hết các hệ thống kiểm soát phiên bản khác làm) - gitthực sự hiệu quả về không gian hơn trong vấn đề này. Cuốn sách giải thích khái niệm này khá tốt - cụ thể là Mô hình đối tượng Git .


0

Có vẻ như bạn đã quen với SVN, nơi các thư mục khác nhau (hoặc thậm chí các tệp, không biết) có thể được kiểm tra các phiên bản khác nhau.

Điều này là không thể với git. Độc lập với thư mục bạn đang ở trong một cam kết hoặc thanh toán (cũng là bước cuối cùng của việc kéo thành công) hành động trên tất cả các tệp công việc độc lập với thư mục bạn hiện đang ở.

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.