Git hoàn tác xóa chi nhánh địa phương


377

Tôi vừa xóa chi nhánh sai với một số thay đổi thử nghiệm tôi cần git branch -D branchName.

Làm thế nào để tôi phục hồi chi nhánh?


7
Vui mừng khi biết tôi không phải là người què duy nhất đã làm điều này (và quên thường xuyên đẩy từ xa một bản sao)
Ray

Câu trả lời:


719

Bạn có thể sử dụng git reflog để tìm SHA1 của lần xác nhận cuối cùng của chi nhánh. Từ thời điểm đó, bạn có thể tạo lại một nhánh bằng cách sử dụng

git branch branchName <sha1>

Chỉnh sửa: Như @seagullJS nói, branch -Dlệnh sẽ cho bạn biết sha1, vì vậy nếu bạn chưa đóng thiết bị đầu cuối thì nó trở nên thực sự dễ dàng. Ví dụ, điều này sẽ xóa và ngay lập tức khôi phục một nhánh có tên master2:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba

71
Git cho bạn biết SHA1 là gì khi nhánh bị xóa, vì vậy nếu bạn chỉ xóa nó, nó có thể chỉ là một vài dòng trong dòng lệnh.
hải âuJS

thay vào đó, nếu chi nhánh này tồn tại trên máy chủ, bạn có thể sử dụnggit branch branchName origin/branchName
Florian Castellane

Ngoài ra, tôi đã kết thúc bằng cách sử dụng git cherry-pick <sha1> để chuyển cam kết sang chi nhánh
Akin Okegbile

54

Nếu bạn biết SHA1 cuối cùng của chi nhánh, bạn có thể thử

git branch branchName <SHA1>

Bạn có thể tìm thấy SHA1 bằng cách sử dụng git reflog, được mô tả trong giải pháp tại đây .


34

Nếu bạn chưa xóa, bạn chỉ cần thực hiện:

$ git checkout deletedBranchName

Câu trả lời này làm cho Tiện ích mở rộng Git im lặng về "chi nhánh bạn đang cố gắng đẩy dường như là một chi nhánh mới cho điều khiển từ xa này." Cảm ơn rất nhiều.
Omer

29

Nếu bạn vừa xóa chi nhánh, bạn sẽ thấy một cái gì đó như thế này trong thiết bị đầu cuối của bạn:

Deleted branch branch_name(was e562d13)
  • trong đó e562d13 là một ID duy nhất (còn gọi là "SHA" hoặc "băm"), với điều này, bạn có thể khôi phục nhánh bị xóa.

Để khôi phục chi nhánh, sử dụng:

git checkout -b <branch_name> <sha>

ví dụ :

git checkout -b branch_name e562d13 

4

Đầu tiên: sao lưu toàn bộ thư mục của bạn, bao gồm thư mục .git.

Thứ hai: Bạn có thể sử dụng git fsck --lost-foundđể lấy ID của các xác nhận bị mất.

Thứ ba: rebase hoặc hợp nhất vào cam kết bị mất.

Thứ tư: Luôn suy nghĩ kỹ trước khi sử dụng -D hoặc - Force với git :)

Bạn cũng có thể đọc cuộc thảo luận tốt này về cách phục hồi từ loại lỗi này.

EDIT: Nhân tiện, đừng chạy git gc(hoặc cho phép nó tự chạy - tức là không chạy git fetchhoặc bất cứ thứ gì tương tự) hoặc bạn có thể mất các cam kết của mình mãi mãi.


1
1 và 4 là IMO quá mức cần thiết.
jwg

Vâng, đó là lý do tại sao chúng tôi sử dụng git, để tránh phải mang theo tất cả những thứ đó. Mỗi hành động bạn đã cam kết vẫn có sẵn cho bạn.
đời

4

Cảm ơn, điều này đã làm việc.

chi nhánh git new_branch_name sha1

kiểm tra git new_branch_name

// có thể thấy tệp cũ của tôi được kiểm tra trong các tệp trong nhánh cũ của tôi


3

Thực hiện theo các bước sau:

1: Nhập:

git reflog show 

Điều này sẽ hiển thị tất cả lịch sử Cam kết, bạn cần chọn sha-1 có cam kết cuối cùng mà bạn muốn lấy lại

2: tạo tên chi nhánh bằng ID Sha-1 bạn đã chọn, ví dụ: 8c87714

git branch your-branch-name 8c87714

0

Điều này làm việc cho tôi:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
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.