2011-10-26 18 views
11

xem xét sau "câu chuyện":Cách thư mục hoạt động được cập nhật trên "git checkout"?

$ mkdir my_project 
$ cd my_project 
$ git init 
Initialized empty Git repository in /home/misha/misha/my_project/.git/ 

$ echo "first line" > hello.txt 
$ git add hello.txt 
$ git commit -m "first commit" 
[master (root-commit) 9c913a1] first commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 hello.txt 

$ git branch new_feature 
$ git checkout new_feature 
Switched to branch 'new_feature' 
$ echo "second line" >> hello.txt 
$ cat hello.txt 
first line 
second line 

$ git checkout master 
M hello.txt 
Switched to branch 'master' 
$ cat hello.txt 
first line 
second line 

Tại sao hello.txt có hai dòng trên nhánh chủ? (Tôi nghĩ rằng git checkout sẽ hoàn nguyên thư mục hoạt động về trạng thái trước đó, tức là hello.txt sẽ chỉ có một dòng.)

Điều gì thực sự xảy ra sau hậu trường đối với thư mục làm việc trên git checkout? Làm thế nào nó được cập nhật?

Trả lời

15

Thanh toán git của bạn thành chính ngăn bạn mất các thay đổi không được cam kết. Đó là lý do tại sao bạn vẫn có dòng thứ hai trong tệp hello.txt của mình. Nếu bạn thực sự muốn mất các thay đổi không được cam kết, bạn phải sử dụng tham số -f.

Cuối cùng thanh toán của bạn sẽ trông như thế này:

git checkout -f master 
+2

Rõ ràng, git hợp nhất theo mặc định thư mục làm việc hiện tại vào nhánh mới (_master_ trong trường hợp của tôi): http://www.gitguys.com/topics/switching-branches-without-committing –

+0

Hành vi tương tự nếu tệp được thêm vào chỉ mục nhưng không cam kết. –

+0

Tôi nghĩ rằng các chi nhánh chỉ lưu trữ các cam kết, chứ không phải thay đổi làm việc. Khi bạn chuyển sang một chi nhánh và thực hiện một số công việc, bạn cần phải cam kết những thay đổi đó trước khi chuyển sang một nhánh khác hoặc những thay đổi đó sẽ không được liên kết với nhánh đó. Một cách khác để xử lý các chi nhánh là sao chép kho lưu trữ của bạn vào một thư mục mới. Sau đó, bạn có thể làm việc trên hai nhánh trong hai thư mục khác nhau mà không cần phải cam kết cho đến khi bạn sẵn sàng. Điều này làm cho nó dễ dàng hơn để tránh những sai lầm. –

2

Thanh toán Git (lỏng lẻo) sẽ cập nhật bản sao làm việc với nội dung của kho lưu trữ tại cam kết chỉ định. Chi nhánh new_feature của bạn không có dòng thứ hai mà bạn đã thêm vào tệp của mình (vì bạn chưa cam kết). Ngay bây giờ, dòng thừa đó chỉ là một thay đổi không được theo dõi trong bản sao làm việc của bạn và nó sẽ được thêm vào nhánh mà bạn cam kết nó.

+2

Nếu 'git checkout' cập nhật các thư mục làm việc với các nội dung của kho tại các cam kết mà tôi chỉ định (_master_ trong trường hợp của tôi), và chỉ có một dòng trong 'hello.txt' trên nhánh _master_, sau đó trên' git checkout master', tôi sẽ mong đợi 'hello.txt' trong thư mục làm việc để chỉ có một dòng (giống như trên nhánh _master_). Tôi đang thiếu gì ở đây? –

+0

Thực tế là bạn có những thay đổi không được cam kết địa phương trong thư mục làm việc của bạn. Nếu thanh toán sẽ ghi đè những thay đổi đó, git sẽ cảnh báo bạn và từ chối chuyển đổi các chi nhánh. –

+1

Nếu những thay đổi đó không xung đột với master thì git sẽ chỉ mang những thay đổi đó vào thư mục làm việc của master (nhưng nó sẽ cho phép bạn chuyển nhánh). Đây là những gì OP đang trải qua. Nếu những thay đổi đó mâu thuẫn với chủ thì nó sẽ không cho phép bạn chuyển đổi. Cuối cùng, nếu thư mục làm việc được sạch khi thanh toán, nó sẽ cập nhật thư mục làm việc để làm chủ. Câu trả lời này để lại quá nhiều thông tin phải chính xác. Ngoài ra, kể từ khi OP đã tuyên bố rằng thư mục làm việc là KHÔNG sạch, câu trả lời này không giải quyết được kịch bản đó. – Despertar

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