2013-04-19 35 views
26

Tôi chỉ đang học Git, thực hiện một hướng dẫn. Tôi đang ở chi nhánh seo_title và tôi có những thay đổi không được cam kết đối với tệp tin mission.html. Tôi đã làm git checkout master mong đợi để nhận được cảnh báo về những thay đổi không dàn dựng cho cam kết, không có thay đổi bổ sung, vv, tuy nhiên thay vào đó nó đã đi trước và chuyển sang chi nhánh với thông điệp:Git cho phép tôi chuyển đổi các chi nhánh mà không thực hiện các thay đổi

M  mission.html 
Switched to branch 'master' 

Sau đó, khi tôi đã làm git diff mission.html nó chỉ cho tôi rằng thư mục làm việc vẫn chứa các thay đổi tôi đã thực hiện trong khi tôi đã kiểm tra chi nhánh khác. Tôi đang thiếu gì? Đối với những gì nó có giá trị, tôi đang sử dụng Git Bash trên Windows.

CHỈNH SỬA: các thay đổi đối với mission.html cũng chưa được thêm vào chỉ mục dàn dựng.

CHỈNH SỬA 2: Tôi nghĩ câu trả lời bình chọn hàng đầu là chính xác, nhưng khi điều tra thêm, nó không phù hợp với hành vi tôi thấy. Dưới đây là một mô tả đầy đủ hơn về những gì tôi đang làm:

top_directory(master) > git branch new_branch_1 
top_directory(master) > git branch new_branch_2 
top_directory(master) > git checkout new_branch_1 

(mở notepad ++ và sửa đổi resources.html, tiết kiệm)

top_directory(master) > git status 
# On branch new_branch_1 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed 
# (use "git checkout -- <file>..." to discard changes in wo 
# 
#  modified: resources.html 
# 
no changes added to commit (use "git add" and/or "git commit 
top_directory(new_branch_1) > git checkout new_branch_2 

Đây là nơi tôi mong đợi git để phản đối và cho tôi biết để stash hoặc cam kết kể từ new_branch_1 và new_branch_2 có các phiên bản khác nhau của resources.html, nhưng nó chỉ chuyển sang chi nhánh mới mà không một lời cảnh báo và nó mang lại những thay đổi không bị giam cùng:

M  resources.html 
Switched to branch 'new_branch_2' 
top_directory(new_branch_2) > git status 
# On branch new_branch_2 
# 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: resources.html 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

có mod e hoặc một thiết lập sẽ làm cho nó hoạt động theo cách này thay vì cảnh báo? Hay tôi vẫn hiểu lầm kịch bản?

CHỈNH SỬA 3: Tôi hiểu ngay bây giờ. Câu trả lời được đánh giá hàng đầu là đúng, xem nhận xét cuối cùng của tôi về câu trả lời đó.

+0

Câu hỏi là gì? Có, git cho phép thanh toán chi nhánh khác. Điều này khá hữu ích. Nếu do nhầm lẫn nếu bạn đã chỉnh sửa tệp từ chi nhánh sai, bạn có thể thanh toán chi nhánh chính xác và cam kết ở đó. – balki

+3

Điều tôi đang nhầm lẫn là: Tôi nghĩ thanh toán sẽ cố gắng cập nhật thư mục làm việc để phù hợp với nhánh mới và khi tìm thấy các thay đổi không được cam kết (sẽ bị mất khi thư mục làm việc được cập nhật) sẽ hủy bỏ thanh toán . Ít nhất đó là những gì hướng dẫn chỉ ra (và tôi đã chứng kiến) trong một bài học trước đó – burgerB

+0

Có thể là do bạn không có bất kỳ cam kết nào sau chi nhánh chính. Vì vậy, tất cả các chi nhánh của bạn trỏ đến cùng một đối tượng cam kết. Khi bạn kiểm tra từ một chi nhánh khác, bạn thực sự kiểm tra từ cùng một cam kết với nhánh hiện tại. – nn0p

Trả lời

33

Hành vi khác nhau mà bạn nhìn thấy từ lần cuối bạn cố gắng chuyển đổi nhánh bằng các thay đổi cục bộ và giờ là do các thay đổi tệp khác nhau.

Vì vậy, giả sử chúng ta có một chi nhánh được gọi là 'readme' nơi bạn đã cam kết một số thay đổi đối với tệp, giả sử README.md.

Bây giờ, bạn đã chuyển về chế độ chính. Bạn làm một số công việc trên các tệp khác (không phải README.md). Bây giờ bạn có những thay đổi cục bộ. Nếu bạn cố gắng chuyển về chi nhánh 'readme' mà không cam kết thay đổi, nó sẽ cho phép bạn. Tại sao? Bởi vì việc chuyển sang nhánh 'readme' sẽ không ghi đè bất kỳ thay đổi cục bộ nào của bạn.

Nếu, tuy nhiên bạn thực hiện sửa đổi đối với README.md nộp vào ngành thạc sĩ, sau đó khi bạn cố gắng làm một

git checkout readme 

bạn sẽ gặp phải

error: Your local changes to the following files would be overwritten by checkout: README.md 
Please, commit your changes or stash them before you can switch branches. 

bởi vì bạn có những thay đổi để README.md rằng sẽ đòi hỏi một hợp nhất.

+1

[this] (http://stackoverflow.com/a/12044758/1048479) có thể có một số trợ giúp là tốt. –

+0

Những gì bạn mô tả là những gì tôi mong đợi, nhưng không phải những gì tôi nhìn thấy. Tôi đang thêm mô tả khác trong câu hỏi – burgerB

+0

Nevermind. Tôi đọc lại và bây giờ nó có ý nghĩa. Bây giờ tôi đang nghĩ về nó như thế này: cảnh báo này giống như một cảnh báo xung đột trong quá trình hợp nhất ngoại trừ nó xảy ra khi bạn có những thay đổi không được cam kết trong chi nhánh của bạn và khi bạn đang chuyển nhánh, không cam kết. Nếu một cam kết hợp nhất sẽ không tạo ra một xung đột, sau đó nó sẽ cho phép bạn chuyển đổi các chi nhánh mà không cam kết/stashing. – burgerB

0

Git - the stupid content tracker. Nó chỉ hoạt động với các snapshot cây đang hoạt động. Yêu cầu chính - bạn sẽ có thể tái tạo lại cây làm việc. Nó cập nhật tất nhiên. Nhưng nếu tập tin sửa đổi là như nhau trong cả hai nhánh - tại sao không cho phép chuyển đổi? Nếu bạn làm điều đó do nhầm lẫn, bạn có thể chuyển trở lại xây dựng lại trạng thái trước đó, không có vấn đề lớn. Nhưng nếu các tập tin là khác nhau trong các chi nhánh, bạn cần hợp nhất nội dung, đó là lý do tại sao nó khẳng định cam kết thay đổi, nếu không nó sẽ không thể quay trở lại.

2

Git sẽ cho phép bạn thanh toán các chi nhánh khác (hoặc thẻ hoặc băm SHA1) miễn là cam kết bạn đang thay đổi cây công việc của mình thành NOT ghi đè các thay đổi không được cam kết địa phương của bạn.

Trong trường hợp của bạn, cây công việc của chi nhánh master sẽ có cùng phiên bản missing.html vì hiện tại đang tồn tại ở đầu nhánh hiện tại của bạn mà bạn đang chuyển đổi. Git không cần chạm vào bản sao làm việc (ít nhất là missing.html) khi thay đổi nhánh tại đây và do đó cho phép bạn giữ các sửa đổi cục bộ của mình.

Nếu bạn thực sự cố gắng để checkout một cam kết, nơi có là một phiên bản khác của missing.html trong công tác cây (so với một cam kết trong chi nhánh hiện tại của bạn), git sẽ hiển thị một thông báo lỗi tương tự như sau:

$ git checkout some-other-branch 
error: Your local changes to the following files would be overwritten by checkout: 
     missing.html 
Please, commit your changes or stash them before you can switch branches. 
Aborting 
12

Đây là hành vi bình thường. Nếu bạn không muốn các tập tin sửa đổi trên chi nhánh vừa được kiểm tra của bạn, sau đó stash chúng. Như thế này.

# on branch dev 
$ git stash 
$ git checkout master 

# do stuff on master 

# back to dev 
$ git checkout dev 
$ git stash pop 
0

này là hiển nhiên, nếu bạn thay đổi một tập tin mà không được thay đổi trong chi nhánh bạn muốn kiểm vào, bởi vì cú pháp của thanh toán là đưa tất cả các chỉ mục và thư mục làm việc cho chi nhánh mới, bạn sẽ để chúng xuất hiện trong nhánh mới của bạn. Trong khi nếu có xung đột, cơ hội r u cần hợp nhất các tệp đó, có nghĩa là một lần sau khi hợp nhất, nếu bạn trả về chi nhánh cũ của bạn thì nó đã là phiên bản đã hợp nhất chứ không phải phiên bản trước của bạn, bạn mất nó. Kết quả là, để đảm bảo bạn giữ nguyên thay đổi cũ, nó sẽ không cho phép bạn làm điều đó.

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