2012-04-26 44 views
8

Tôi muốn hiểu những gì Git thực sự lưu trữ khi di chuyển tệp vào trạng thái "dàn dựng".Vùng lưu trữ git lưu trữ tệp như thế nào?

xem xét theo trình tự sau:

Một tập tin mới được thêm vào và cam kết vào kho địa phương:

touch file.txt 
git add file.txt 
git commit 

tôi có thay đổi đến tập tin:

echo text1 > file.txt 
git add file.txt 

tôi sau đó chỉnh sửa lại tệp, trước khi cam kết:

echo text2 > file.txt 

Một status git cho thấy:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: file.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: file.txt 
# 

sau đó tôi cam kết các file:

git commit file.txt 

thế nào là git khả năng xử lý dàn dựng mới, cập nhật thứ hai để file.txt mà không bị nói với? Đầu ra "trạng thái" trông như thể nó sẽ cố gắng kiểm tra bản sửa đổi đầu tiên, nhưng giữ lại những thay đổi chưa được ghi lại mà không kiểm tra chúng.

Có một giai đoạn ngầm định được thực hiện trong trường hợp này không?

Trả lời

7

Hãy nghĩ về Git như hai thứ - cam kết (ảnh chụp nhanh tệp) và nhãn (nhánh, trong số những thứ khác).

Git thực sự tạo một cam kết khi bạn git add, không phải khi bạn git commit. Vì vậy, khi bạn thực hiện git add trên tệp đã thay đổi, nó đã tạo một cam kết với những thay đổi đó và gán nhãn "dàn dựng" cho cam kết cụ thể đó.

Khi bạn thay đổi lại tệp trước khi thực hiện git commit, hiện giờ có "cam kết dàn dựng" (chưa có git commit được thực thi) và các thay đổi mới đối với tệp chưa được thêm hoặc cam kết. Đó là cách git status có thể hiển thị cho bạn cả hai.

Khi bạn git commit, nó được thực sự di chuyển nhãn chi nhánh hiện tại của bạn để mà đặc biệt là cam kết (và loại bỏ các "dàn" nhãn), do đó cam kết không còn được đánh dấu là "dàn dựng" nhưng "thầy" (hoặc bất kỳ chi nhánh bạn hiện đang bật).

+0

Hành vi tôi quan sát khi chạy thử nghiệm được mô tả ở trên là nó gửi nội dung chưa được lưu trữ của tệp ("text2") vào trong repo. Cách giải thích này có đúng không? Tôi sẽ nghĩ rằng nó sẽ gửi phiên bản "dàn dựng" của tập tin ("text1"). Tôi xác nhận đây là những gì trong repot bằng cách làm một "git checkout file.txt". –

+1

Tôi vừa thực hiện một thử nghiệm nhưng không nhận được kết quả của bạn. 'mkdir gittest'' cd gittest' 'git init'' echo văn bản 1> test.txt' 'git add .'' git commit -m 'Initial commit'' 'echo text 2> test.txt'' git add .' 'echo text 3> test.txt' Tại thời điểm này, có sự thay đổi theo giai đoạn (" văn bản 2 ") và thay đổi không được tổ chức (" văn bản 3 "). Bây giờ, 'git checkout test.txt' và' cat test.txt'. Tôi nhận được "văn bản 2".Thay đổi cục bộ đã bị loại bỏ với thay đổi theo giai đoạn. – redhotvengeance

+0

Tôi nhận được kết quả tương tự như chuỗi thử nghiệm của bạn. Nhưng nếu tôi thực hiện 'git commit' sau bước' echo text 3> test.txt' (tương tự như các bước của tôi trong bài gốc), đó là khi tôi quan sát git ngầm sắp xếp nội dung "text 3" và gửi nó đến repo. Để rõ ràng, chuỗi tôi làm ở đây là: 'mkdir gittest'' cd gittest' 'git init'' echo text 1> test.txt' 'git add .'' git commit -m 'Ban đầu commit'' 'echo text 2 > test.txt' 'git add .'' echo text 3> test.txt' 'git commit -m 'new''' git checkout test.txt' 'cat test.txt', dẫn đến kết xuất của" text 3 ". –

4

git commit <somefiles> tương đương với git add <somefiles> theo sau là git commit. Nếu bạn chỉ cần thực hiện git commit, git sẽ cam kết tất cả thay đổi theo giai đoạn, nhưng sẽ không cam kết chỉnh sửa được thực hiện kể từ lần cuối bạn dàn dựng tệp được đề cập.

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