2009-05-11 37 views
21

Điều phổ biến tôi muốn làm là hoàn nguyên bản sao làm việc của mình thành một bản sửa đổi cụ thể, thực hiện một số kiểm tra và sau đó đưa nó trở lại phần đầu của chủ hiện tại của tôi. Trong quá khứ tôi đã ngây thơ thực hiện một "git checkout hash" chỉ để mất đầu của tôi. Tôi đã học được từ khi tôi có thể tạo ra một chi nhánh và kiểm tra xem nó ra, chuyển trở lại và xóa các chi nhánh, nhưng nó cảm thấy như quá nhiều bước cho một kiểm tra đơn giản. Trong cách nói SVN, có cách nào để nhanh chóng trở lại và sau đó nhanh chóng quay trở lại đầu của thân cây trong git?Bạn có cần tạo chi nhánh để kiểm tra một phiên bản git cụ thể không?

Chỉnh sửa: Tôi nghĩ rằng sự nhầm lẫn của tôi xuất phát từ thực tế là khi tôi kiểm tra băm và sau đó git log, tôi không thấy những thay đổi xảy ra sau khi băm được kiểm tra (điều này là hợp lý, khi bạn nghĩ đến nó). Nhưng câu trả lời được chấp nhận là chính xác; "git checkout branch" sẽ khôi phục đầu về nhánh trước đó.

+0

Bạn có thể làm rõ "mất đầu" không? Dường như với tôi không có gì bị mất. – Wok

Trả lời

27

Giả sử bạn đã có trên một chi nhánh (mà bạn luôn nên cho thay đổi mà bạn muốn giữ lại), bạn có thể chỉ làm

git checkout <revision to check out> 

này sẽ đưa bạn ra khỏi chi nhánh chủ đề bạn đang làm việc trên vào (không có chi nhánh), trong đó bản sao làm việc đề cập trực tiếp đến ID cam kết thay vì tên chi nhánh như bình thường.

Sau đó, để di chuyển trở lại, chỉ cần:

git checkout <old branch name> 

Một cách hữu ích để nghĩ về nó là thế này: git checkout không bao giờ làm thay đổi các chi nhánh; nó chỉ thay đổi những gì bản sao làm việc của bạn hiện đang xem (tức là HEAD), có thể là nhánh (trong trường hợp đó các commit sẽ cập nhật nhánh) hoặc một hash băm ngẫu nhiên.

Vì vậy, miễn là những thay đổi bạn muốn giữ lại trên một chi nhánh, bạn không phải lo lắng về việc thanh toán git mất chúng.

+0

+1 để giải thích các bản sao làm việc trỏ đến một băm cam kết ngẫu nhiên –

+0

Bạn có bao gồm 'chủ' trong cái mà bạn gọi là 'chi nhánh' không? – Wok

+1

@wok: Có. Không có gì đặc biệt về chủ nhân. – bdonlan

3

Nếu bạn muốn Git hiển thị mẹo của một số dòng thay đổi, bạn cần phải cho nó phân nhánh hoặc gắn thẻ. Nhưng ngay cả khi bạn không thực hiện một chi nhánh, không có cam kết nào bị mất. Nó nằm trong kho lưu trữ dưới dạng nút rác (tức là không thể truy cập được qua bất kỳ chi nhánh hoặc thẻ nào) và chỉ bị xóa một vài ngày/tuần sau khi bạn thực hiện "git gc".

Vì vậy, nếu bạn muốn có quyền truy cập dễ dàng vào các thay đổi, tốt nhất bạn nên tạo chi nhánh tạm thời và làm việc tại đó. Nếu bạn cam kết bên ngoài một chi nhánh và sau đó thanh toán chi nhánh khác, thì bạn sẽ cần phải sử dụng lệnh "git reflog" hoặc xem trong nhật ký (".git/logs") để tìm hiểu hàm băm của các thay đổi là gì bạn bị mất. Khi bạn biết hàm băm, bạn có thể thực hiện "git checkout hash" hoặc "git checkout -b new_branch hash" và khôi phục mẹo.

+0

Bạn có ý nghĩa gì khi "hiển thị" trong "hiển thị mẹo của một số dòng thay đổi"? Nếu tôi làm điều tự nhiên (IMO) và "băm thanh toán", tôi thấy rằng không có cách nào để quay lại nơi tôi không có (bằng cách nào đó) biết băm tôi đang ở đâu. – Nick

+0

Bởi Git cho thấy một số dòng thay đổi, tôi có nghĩa là bạn có thể nhìn thấy nó với các lệnh như "git branch", "git tag" hoặc "gitk --all". Bạn có nghĩa là "biết băm tôi ở đâu" mà bạn đang làm việc bên ngoài một chi nhánh? Bạn không được biết băm bạn đang ở đâu - bạn có nghĩa vụ phải biết chi nhánh bạn đang ở đâu. –

4

Có, bạn có thể truy cập bất kỳ sửa đổi tùy ý nào với "git checkout" khi bạn mô tả. Nếu bạn yêu cầu một phiên bản tùy ý thay vì một chi nhánh, git sẽ không có bất kỳ cách rõ ràng nào để theo dõi những thay đổi bạn thực hiện. Bạn có thể nhìn thấy nơi bạn đang ở trước bằng cách tham khảo ý kiến ​​của reflog ("git reflog show") - nhưng nói chung, bạn đã có mặt trên một nhánh trước đó nên có lẽ chỉ muốn đổi lại thành "git checkout master" hoặc tương tự. Lưu ý rằng phương pháp này sẽ không tự động xử lý các thay đổi không được cam kết trong không gian làm việc của bạn --- hoặc cam kết hoặc thay đổi các thay đổi của bạn trước khi di chuyển giữa các nhánh hoặc sử dụng "git checkout -m" để mang chúng xung quanh khi bạn di chuyển (và được chuẩn bị để đối phó với các xung đột hợp nhất nếu các thay đổi bạn đang mang không quan trọng).

Tôi nghĩ rằng các phiên bản git gần đây đã giới thiệu viết tắt "@ {- 1}" cho "nơi tôi đã ở trước khi tôi di chuyển lần cuối", mà thực sự có thể là những gì bạn muốn trong trường hợp này. (Tôi đã không sử dụng nó, chỉ cần đọc về nó trong các ghi chú phát hành).

+1

"Nếu bạn yêu cầu một phiên bản tùy ý thay vì một nhánh, bạn sẽ không thể thực hiện bất kỳ thay đổi nào, tất nhiên." - Bạn * có thể * cam kết. Nó chỉ là bạn sẽ làm việc trên "(không có nhánh)" (như được hiển thị bởi "git branch"), vì vậy việc tìm kiếm commit sau khi kiểm tra nhánh khác sẽ khó, trừ khi bạn viết hash của commit hoặc đào nó ra khỏi nhật ký. –

+0

Có, điểm tốt; Tôi thừa nhận, tôi đã không thử nó trước. – araqnid

+0

Nếu bạn đang sử dụng phần mở rộng git, nó sẽ hỏi bạn nếu bạn muốn thanh toán hoặc tạo một chi nhánh nếu bạn không ở trên một chi nhánh, đó là tốt đẹp. Nhưng phần mở rộng git có thể gây nguy hiểm cho những người mới như tôi vì bây giờ tôi mới nhận được ý nghĩa của việc kiểm tra bản sửa đổi so với chi nhánh. – Chance

6

Bạn có thể tạo một chi nhánh tại cụ thể cam kết mà bạn muốn kiểm (từ trang hướng dẫn)

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] 

để điền vào <start-point> như SHA1 bạn muốn, bạn chi nhánh mới <branchname> để bắt đầu và bạn sẽ không nhận được 'đầu' của bạn tách ra từ một chi nhánh mở rộng.

Sẽ có những thứ khác bạn có thể muốn thực hiện để giữ một số tệp đang hoạt động ở trạng thái mong muốn ....

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