Giải cứu các tập tin và cam kết từ không có chi nhánh nào trong Git


11

Tôi bắt đầu làm việc trên một số tệp mà tôi có trong một mô hình con git trong một dự án khác. Tuy nhiên, vì nó là một mô hình con git, nó không bao giờ kiểm tra "master" và thay vào đó chỉ kiểm tra phần đầu và đặt tất cả các tệp trong thư mục vào "không có nhánh".

Bây giờ tôi đã thực hiện một số thay đổi một cách tình cờ cho các tệp này, tôi mới nhận ra rằng tôi đang làm việc trong một "không có chi nhánh", mô hình con của dự án của tôi.

Làm cách nào để đưa các tệp đó vào một nhánh (như chủ) để tôi có thể giải cứu chúng?

Câu trả lời:


28

Bạn có thể sử dụng git reflogđể tìm các cam kết "bị mất":

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

Đúng, điều này đã làm việc tuyệt vời! ngoại trừ tôi đã làm một git merge $COMMIT_SHAlần khi tôi ở chi nhánh khác.
Xeoncross

3

Bang không có chi nhánh Nhà nước được gọi là TRƯỚC. Nó được gọi là bởi vì ref ref không được gắn vào bất kỳ nhánh nào, thay vào đó nó được trỏ trực tiếp vào một cam kết. Để gắn HEAD vào một nhánh trỏ đến cam kết hiện tại, hãy sử dụng git checkout -b branchname.

Bạn có thể cập nhật một cách an toàn một chi nhánh hiện có để bao gồm các cam kết tại HEAD với trình tự này:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

Hoặc, tương tự, sử dụng ký hiệu reflog HEAD@{1}để tránh phải tạo nhánh tạm thời:

git checkout branchname
git merge HEAD@{1}

Sử dụng nhánh tạm thời sẽ là một ý tưởng tốt nếu bạn không thực hiện hợp nhất ngay lập tức.

Nếu bạn muốn ghi đè lên một nhánh hiện có để trỏ đến cam kết tại HEAD bạn có thể sử dụng git branch -f branchname && git checkout branchname. Nếu cam kết tại HEAD không dựa trên mẹo hiện tại của tên chi nhánh, điều này sẽ dẫn đến thay đổi không chuyển tiếp thành tên nhánh mà bạn thường muốn tránh (nó được xem là lịch sử viết lại).


Lưu ý câu trả lời này giả định rằng CHÍNH vẫn đang chỉ vào cam kết cuối cùng đó là không phải trên nhánh. Nếu bạn đã di chuyển TRỤ từ đó và chỉ bây giờ mới nhận ra điều gì đã xảy ra, bạn có thể cần tìm kiếm cam kết đã mất trong bản reflog (xem câu trả lời của mipadi).
LarsH

1

Để thêm vào câu trả lời trước:

Trong khi bạn vẫn đang ở trên một ĐẦU tách ra, bạn có thể thêm một thẻ:

git tag <some-tag>

Điều này sẽ thêm một thẻ vào cam kết, sẽ làm cho nó hiển thị trong gitkvà các công cụ khác.

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.