2012-10-10 20 views
6

tôi đã cố gắng lệnh sau trên vỏthanh toán git tự động kết hợp thay đổi địa phương

git init 

echo "test1" > test1.txt 
git add test1.txt 
git commit -a -m "test1" 

echo "test2" >> test1.txt 

git branch test 
git checkout test 

text.txt bây giờ chứa:

test1 
test2 

Sau lần kiểm tra chi nhánh test tất cả các thay đổi địa phương từ master nhận sáp nhập.

Tại sao?

Tôi hy vọng rằng git từ chối thanh toán thành test do các thay đổi cục bộ. Tôi mong rằng git sẽ yêu cầu một cam kết hoặc stash các thay đổi cục bộ.

Chỉnh sửa: Tôi đã sử dụng tập lệnh bash để thực thi lệnh này. Tôi nhận được kết quả sau:

[email protected]:/tmp/test$ ./createrepo 
Initialized empty Git repository in /tmp/test/.git/ 
[master (root-commit) 0407f5b] test1 
1 file changed, 1 insertion(+) 
create mode 100644 test1.txt 
M  test1.txt 
Switched to branch 'test' 
+0

Tôi có cùng một vấn đề, điều kỳ lạ là, đối với một số kho lưu trữ, tôi không thể thanh toán mà không cam kết, những người khác hợp nhất. Tôi đã nhìn vào cấu hình và không thể thấy bất kỳ sự khác biệt nào. – jdborg

Trả lời

14

git cố gắng hết sức để không làm mất dữ liệu có thể có giá trị. Trong trường hợp này, nó không thực sự sáp nhập các chi nhánh, vì những thay đổi trong câu hỏi chưa được cam kết. Thay vào đó, khi bạn thực hiện một git checkout, nó cố gắng bảo tồn các thay đổi mới được thực hiện nhưng chưa cam kết, vì vậy nó sẽ kiểm tra cam kết bạn đang yêu cầu và thêm các thay đổi không được cam kết của bạn. Nếu bạn thực sự muốn loại bỏ các thay đổi không được cam kết, hãy sử dụng git checkout -f hoặc git checkout theo sau là git reset --hard HEAD. Đôi khi, nếu những thay đổi bạn chưa cam kết không thể được hợp nhất vào những gì bạn đang kiểm tra một cách rõ ràng, bạn sẽ nhận được thông báo lỗi và việc thanh toán sẽ không thành công.

+1

Tôi không muốn hủy bất kỳ thứ gì. Nhưng tôi không wan't rằng những thay đổi không được tự động được sáp nhập tự động. Nếu tôi thực hiện điều gì đó trong 'test', sau đó thực hiện một số thay đổi không được sửa đổi và thử chuyển đổi lại, git nói rằng không thể vì thực sự có những thay đổi không được sửa đổi. Nhưng tại sao git không làm điều này nếu không có cam kết trong nhánh mới này? Bởi vì nhánh 'master' và' test' có cùng 'HEAD'? – Razer

+0

Nếu bạn đã cam kết điều gì đó trong 'test', thì có cam kết trên nhánh mới này, vì vậy tôi đoán tôi không theo câu hỏi của bạn ... Nếu, theo ví dụ trên, bạn đã thực hiện thay đổi' test2' trên ' thử nghiệm chi nhánh, sau đó thực hiện nhiều sửa đổi để 'kiểm tra.txt' và cố gắng chuyển về 'master' mà không cam kết trước, có khả năng những thay đổi không được cam kết không thể được sao chép một cách rõ ràng, vì vậy' checkout' sẽ thất bại cho đến khi bạn loại bỏ các thay đổi hoặc sử dụng 'git stash'. – twalberg

+0

Sự nhầm lẫn ở đây là trong thực tế là OP nghĩ rằng có dòng test2 trong tệp khi kiểm tra chi nhánh có nghĩa là chúng được hợp nhất. Điều này không chính xác: Những thay đổi đó không được hợp nhất vào nhánh thử nghiệm, mà được bảo quản trong thư mục làm việc. cố gắng làm git diff và git status trong cả hai nhánh và bạn sẽ thấy những gì tôi đang nói về. –

0

Bạn đã sử dụng tùy chọn nào với lệnh git checkout chưa? Tôi hỏi vì hành vi bạn mô tả có vẻ như khi "git checkout -f" được sử dụng.

+0

Không, tôi đã sao chép lệnh này ra khỏi tập lệnh bash để thử nghiệm. – Razer

0

git checkoutthay thế các tệp đã thay đổi cục bộ.

git mergehợp nhất địa phương & thay đổi đến, cảnh báo cho bất kỳ xung đột nào.

Cả hai lệnh này sẽ xóa các tệp cục bộ không tồn tại trong cam kết gửi đến.

Chỉ git reset --hard sẽ xóa hoàn toàn các thay đổi cục bộ.

+0

Tôi biết điều đó. Nhưng tại sao 'git checkout' kết hợp các thay đổi cục bộ từ nhánh' master' vào nhánh 'test' mặc dù tôi không cam kết gì cả? – Razer

+0

Ý của bạn là "hợp nhất các thay đổi cục bộ từ chủ"? Nó không thực sự thực hiện một 'hợp nhất'. – Mars

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