Git tham nhũng chi nhánh


9

Tôi mở kho Git của mình bằng gitExtensions trên Windows 7 cho một dự án Visual Studio. Nó đột nhiên trống rỗng. Các kho lưu trữ tồn tại, nhưng tất cả các cam kết của tôi đã biến mất.

Tôi đang sử dụng giao diện đồ họa và tôi tin rằng đây là lần đầu tiên tôi mở nó kể từ khi họ cập nhật nó.

Tôi không biết phải làm gì để nhận lại các cam kết của mình.

Khi tôi gõ

git log 

tôi nhận

gây tử vong: sửa đổi mặc định xấu 'ĐẦU'

Cập nhật
Sau khi xem /programming/1545407/recovering-broken-git-reposeective tôi đã thử

git fsck

nó trở lại:

lỗi: Không hợp lệ
chết người: đối tượng rời 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (được lưu trữ trong .git / obj ects / 36 / b7d9e1ca496bcb864c0b9c

Cam kết trả lại:

lỗi: không thể giải quyết tham chiếu CHÍNH: Không có tệp hoặc thư mục nào
gây tử vong: không thể khóa CHÍNH ref

và đăng nhập trả về chi nhánh chính

$ git log master alert: bỏ qua ref ref / Heads / master. cảnh báo: bỏ qua ref ref / thủ trưởng / chủ. fatal: đối số mơ hồ 'master': không biết sửa đổi hoặc đường dẫn không có trong cây làm việc. Sử dụng '-' để tách các đường dẫn khỏi các phiên bản

Tôi chỉ cần dán những thứ có thể có liên quan

$ git reflog master alert
: bỏ qua ref ref / Heads / master.
cảnh báo: bỏ qua ref ref / thủ trưởng / chủ.
fatal: đối số mơ hồ 'master': không biết sửa đổi hoặc đường dẫn không có trong cây làm việc.
Sử dụng '-' để tách các đường dẫn khỏi các phiên bản

Thông tin hữu ích hơn có thể: mỗi lần tôi xóa tệp bị hỏng, một tệp khác sẽ diễn ra. Tôi bắt đầu nghĩ rằng nó phải làm gì đó với nhánh chủ chỉ vào điều sai hoặc điều gì đó. bởi vì tôi giả sử cái đầu đang chỉ vào chủ.

Một ngày sau:
Vì vậy, tôi đã đưa người bạn đời của mình vào chuyện này, anh ta có thể xem qua nhật ký và anh ta nói rằng các giá trị băm trong nhật ký không khớp với các đối tượng trong thư mục. Anh ấy đã thử đặt lại nhánh chủ vào nhật ký hoặc một cái gì đó tương tự, tôi đã bị mất một chút. Hy vọng điều đó hữu ích



1
@ematvyd vui lòng kiểm tra cập nhật
MrJD

Câu trả lời:


3

Các kho lưu trữ tồn tại, nhưng tất cả các cam kết của tôi đã biến mất.

Chính xác ý của bạn là gì? Cây làm việc có còn không? Có .git/tồn tại? Có tập tin nào trong đó không?

Các tin nhắn bạn đăng cho thấy rằng tập tin .git/HEADkhông tồn tại. Nó xác định trạng thái dự kiến ​​của cây làm việc (những gì bạn đã kiểm tra). Nếu tập tin đó biến mất, git không biết bạn đang ở đâu.

Bạn có thể thử tự tạo tệp với nội dung này: ref: refs/heads/master

Nếu bạn ở một nhánh khác, chỉ cần thay thế "master" bằng tên nhánh. Nếu bạn không ở trong một chi nhánh, nó sẽ phức tạp hơn.

.git/logs/HEADghi lại các trạng thái trong quá khứ của HEAD, với các dòng sau ở phía dưới. Dòng ví dụ này hiển thị thanh toán: 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 1346938344 +0200 checkout: moving from master to MySuperBranch

Các SHA1 ở phía trước đề cập đến các cam kết. Bạn nên có thể tìm thấy những thứ này trong nhật ký chi nhánh, ví dụ .git/logs/refs/heads/master.

Đầu ra glog reflog mà bạn đưa ra có vẻ như refs/heads/mastercũng bị thiếu. Nội dung duy nhất của nó được cho là SHA1 của cam kết mới nhất về nó (và một dòng mới). Ví dụ, bạn có thể tìm thấy SHA1 ở cuối nhật ký chi nhánh .git/logs/refs/heads/master.


2

Nếu .git / HEAD tồn tại và nội dung của nó là ref: refs/heads/masterkiểm tra tệp refs / Heads / master thì nó phải chứa sha1 của lần xác nhận cuối cùng.

Nếu tệp đó bị hỏng và có đầy đủ các ký tự NULL Chỉnh sửa tệp đó và đặt sha1 của cam kết mới nhất từ .git/logs/HEADhoặc trước một cam kết cuối cùng.

Sau đó làm git reset --hard 'sha1 of the commit that you selected'


Nó thực sự chứa đầy các ký tự NULL vì vậy tôi đã đặt vào sha1 của cam kết trước đó, nhưng sau đó thực hiện thiết lập lại git dẫn đến "error: update_Vf không thành công cho ref 'HEAD': không thể khóa ref 'HEAD': không thể giải quyết tham chiếu HEAD: Đối số không hợp lệ "
fantabolous

1

Có vẻ như repo của bạn đã bị hỏng. Cách dễ nhất để làm là khôi phục repo của bạn từ bản sao lưu hoặc sao chép lại repo từ nguồn ban đầu (giả sử bạn không có hàng tấn công việc trong repo).

Nếu resotring / clone không phải là một lựa chọn, tôi khuyên bạn nên đọc qua Pro Git (sách trực tuyến miễn phí hoặc phiên bản giấy ). Toàn bộ cuốn sách rất nhiều thông tin, nhưng đặc biệt hãy xem chương cuối để hiểu về cách Git hoạt động trong nội bộ. Khi bạn đã hiểu về cách Git hoạt động, hãy xem hướng dẫn của Linus về việc khôi phục các đối tượng bị hỏng .


Vì vậy, thật đáng buồn khi tôi đã sao lưu các tập tin ẩn, .git đã bị ẩn. Tôi thực sự không có đủ thời gian để đọc toàn bộ cuốn sách, có điều gì bạn nghĩ tôi có thể thử không?
MrJD

"Đọc một cuốn sách về nội bộ" có thể là lời khuyên chung chung nhưng nó không giúp giải quyết vấn đề và câu hỏi cụ thể trong tay.
Burhan Ali

0

Sau khi lướt web một lúc, cuối cùng tôi cũng tìm thấy cái này và nó hoạt động.

git fetch origin
git reset --hard origin/master

Điều đó nhận được bất kỳ thay đổi nào từ origin(hy vọng không có quá nhiều công việc được thực hiện tại địa phương), và sau đó buộc masterchi nhánh địa phương phải đồng ý với điều khiển từ xa. Cẩn thận, --resetcó nghĩa là loại bỏ bất kỳ thay đổi địa phương! Bên cạnh đó, nếu nó không được quá bị hỏng, chỉ git reset origin/mastercó thể đã khôi phục cuối cùng được biết đến (kiểm tra in) trạng thái của masterchi nhánh.
vonbrand
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.