2012-05-20 25 views
23

Vì một lý do nào đó, Git nói với tôi rằng tôi có một tập tin vừa "cam kết" và cũng "không được dàn dựng để cam kết"? Điều này không có ý nghĩa:Git liệt kê cùng một tệp đã sửa đổi và không được dàn dựng để cam kết?

% git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: Dir1/Dir2/filename.cpp 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: Dir1/Dir2/filename.cpp 

Dir1, Dir2filename.cpp chắc chắn tất cả các tập tin tương tự. Tôi đã phải thêm filename.cpp một lần nữa để làm cho nó xuất hiện như một sự thay đổi được cam kết (sau khi nó đã được ban đầu trong kho lưu trữ). Về điều duy nhất có thể đã gây ra vấn đề là tôi đã cất giấu, pull --rebase, sau đó xuất hiện stash? .gitignore không liệt kê Dir1, Dir2 hoặc filename.cpp ở bất kỳ đâu và các mẫu không đề xuất chúng sẽ thu thập tệp này?

+0

Câu hỏi chính xác là gì? – svick

+1

có vẻ như bạn đã sửa đổi nó sau khi thêm, thêm lại và nó sẽ ổn. – thenetimp

+1

Vui lòng đọc về [khái niệm cơ bản] (http: // git-scm.com/book/vi/Bắt đầu-Git-Khái niệm cơ bản # The-Ba-Kỳ) trước khi sử dụng một công cụ trong sản xuất. – kostix

Trả lời

4

Nếu bạn sửa đổi tệp, thêm tệp và chúng sửa đổi tệp, bạn sẽ nhận được hành vi này. Khi bạn thực hiện thêm git, nó sẽ thêm các thay đổi cho đến thời điểm đó và cam kết sau đó mà không cần thêm lại chỉ cam kết tập hợp các thay đổi đã thêm đầu tiên.

$ git status 
# On branch master 
nothing to commit (working directory clean) 

matthewfarwell (master) 
$ vi foo.txt <-- add lines 1,2,3 here 

matthewfarwell (master) 
$ git add foo.txt 

matthewfarwell (master) 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.txt 
# 

matthewfarwell (master) 
$ vi foo.txt <-- add lines 4,5,6, here 

matthewfarwell (master) 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: foo.txt 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: foo.txt 
# 

Vì vậy, nếu tôi cam kết bây giờ, chỉ có các dòng 1,2,3 sẽ được cam kết.

28

Điều đó có nghĩa là bạn đã thực hiện thay đổi đối với filename.cpp, đã thêm thay đổi đó (với git add), sau đó thực hiện thay đổi khác chưa được thêm.

Phần "thay đổi được cam kết" có nghĩa là Git đã cập nhật chỉ mục của mình bằng thay đổi. Khi bạn chạy git commit, các thay đổi đối với chỉ mục sẽ được sử dụng để tạo đối tượng cam kết mới.

Phần "thay đổi không tổ chức" cho thấy sự khác biệt giữa chỉ mục và bản sao làm việc của bạn.

Bạn có thể mô phỏng những gì bạn đang nhìn thấy như vậy:

  • Sửa filename.cpp
  • Run git status. Bạn sẽ thấy "thay đổi không được tổ chức".
  • Chạy git add filename.cpp
  • Chạy git status. Bạn sẽ thấy "thay đổi được cam kết".
  • Chỉnh sửa filename.cpp một lần nữa
  • Chạy git status. Bạn sẽ thấy cả "thay đổi không được tổ chức" và "thay đổi được cam kết".

Điều đó có hợp lý không? Nó luôn luôn là một chút khéo léo giải thích cách Git hoạt động.

+1

cũng lưu ý: bạn chỉ có thể thêm tệp một lần vào nhóm cam kết. Nếu bạn thay đổi nó một lần nữa sau khi thêm nó; những thay đổi đó sẽ không được bao gồm trong cam kết. Để bao gồm tất cả các thay đổi mới trong cam kết, bạn phải "git reset -file-" và sau đó "git add -file-" để đưa bản sao đã cam kết cập nhật – ppostma1

+0

Tôi chạy 'git add file.java', chạy' git status' ngay sau đó và nó vẫn hiển thị các tập tin trên cả hai "thay đổi không dàn dựng" và "thay đổi để được cam kết", rất bối rối – Jose

10

Trong CVS, SVN, BZR, và không nghi ngờ một tá công cụ khác, khi tệp được thêm vào có nghĩa là nó sẽ được đưa vào cam kết tiếp theo.

Không phải như vậy GIT.

Trong git bạn không "thêm tệp", bạn "thêm thay đổi" (đôi khi nó được gọi là "giai đoạn thay đổi").

Nếu bạn thay đổi tệp hai lần, bạn phải "thêm" tệp đó hai lần.

+0

Đó là đúng. Tôi chỉ cần thêm rằng bạn có thể giai đoạn chỉ là một dòng (s) từ tập tin hoặc thậm chí một số phần (s) (nó được gọi là chunk). Đó là một tính năng tuyệt vời, tôi sử dụng nó rất thường xuyên, ví dụ khi tôi thực hiện nhiều thay đổi (hợp lý không liên quan) trong cùng một tệp và tôi muốn chia chúng thành các cam kết riêng biệt. –

Các vấn đề liên quan