Git: Làm thế nào để trở về từ trạng thái 'tách rời'


217

Nếu một người sẽ kiểm tra một chi nhánh:

git checkout 760ac7e

từ ví dụ b9ac70b, làm thế nào người ta có thể quay trở lại cái đầu được biết đến cuối cùng b9ac70bmà không biết SHA1 của nó?

Câu trả lời:


331

Nếu bạn nhớ chi nhánh nào đã được kiểm tra trước đó (ví dụ master), bạn có thể chỉ cần

git checkout master

để thoát khỏi trạng thái ĐẦU tách ra .

Nói chung: git checkout <branchname>sẽ giúp bạn thoát khỏi điều đó.

Nếu bạn không nhớ tên chi nhánh cuối cùng, hãy thử

git checkout -

Điều này cũng cố gắng kiểm tra chi nhánh kiểm tra cuối cùng của bạn.


17
git checkout -- Tính năng sát thủ!
dimpiax

1
Nếu bạn không làm, git checkout -b new_branch_namebạn có bị mất các cam kết được thực hiện khi ở trạng thái CHÍNH không?
jocassid

2
@jocassid Có bạn làm. Chúng có mặt trong một thời gian nhưng khi git gcđược chạy, chúng sẽ bị xóa vĩnh viễn. Bạn có thể xem chúng git reflogmiễn là chúng vẫn ở đó.
eckes

bạn sẽ không mất bất kỳ cam kết / thay đổi nào bạn đã thực hiện trong ĐẦU tách ra nếu bạn làm điều này? Đây không phải là một cách tốt hơn sao? stackoverflow.com/a/61489179/13087176
boopenstein mẹo

@tipsyboopenstein đúng. jocassid đã đề cập đến điều này: stackoverflow.com/questions/11801071/ từ
eckes

16

Sử dụng git reflogđể tìm các giá trị băm của các xác nhận đã kiểm tra trước đó.

Một lệnh tắt để đến chi nhánh đã kiểm tra cuối cùng của bạn (không chắc chắn liệu điều này có hoạt động chính xác với tiêu đề đã tách rời và các cam kết trung gian không) git checkout -


4

Tôi đã có trường hợp cạnh này, nơi tôi đã kiểm tra một phiên bản mã trước đó trong đó cấu trúc thư mục tệp của tôi khác nhau:

git checkout 1.87.1                                    
warning: unable to unlink web/sites/default/default.settings.php: Permission denied
... other warnings ...
Note: checking out '1.87.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. 
Example:

  git checkout -b <new-branch-name>

HEAD is now at 50a7153d7... Merge branch 'hotfix/1.87.1'

Trong trường hợp như thế này, bạn có thể cần phải sử dụng - lực lượng (khi bạn biết rằng quay trở lại chi nhánh ban đầu và loại bỏ các thay đổi là điều an toàn để làm).

git checkout master đã không làm việc:

$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
web/sites/default/default.settings.php
... other files ...

git checkout master --force(hoặc git checkout master -f) đã làm việc:

git checkout master -f
Previous HEAD position was 50a7153d7... Merge branch 'hotfix/1.87.1'
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

1

Bạn có thể đã thực hiện một số cam kết mới trong detached HEADtiểu bang. Tôi tin rằng nếu bạn làm như những câu trả lời khác khuyên:

git checkout master
# or
git checkout -

sau đó bạn có thể mất các cam kết của bạn !! Thay vào đó, bạn có thể muốn làm điều này:

# you are currently in detached HEAD state
git checkout -b commits-from-detached-head

và sau đó hợp nhất commits-from-detached-headvào bất cứ nhánh nào bạn muốn, vì vậy bạn không mất các cam kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.