2010-10-26 26 views
247

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

Làm cách nào để khôi phục chi nhánh?

+2

Vui mừng khi biết tôi không phải là lame- chỉ o ai đã làm điều này (và quên thường xuyên đẩy đến một bản sao từ xa) – Ray

+0

mà làm cho 3 người trong chúng ta bây giờ –

Trả lời

504

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

git branch branchName <sha1> 

Edit: Như @seagullJS nói, lệnh branch -D cho bạn biết sha1, vì thế nếu bạn đã không đóng cửa nhà ga nhưng nó trở nên thật dễ dàng. Trong ví dụ này xóa và sau đó ngay lập tức khôi phục lại một chi nhánh tên là master2:

[email protected] /C/MyRepo (master) 
$ git branch -D master2 
Deleted branch master2 (was 130d7ba). <-- This is the SHA1 we need to restore it! 

[email protected] /C/MyRepo (master) 
$ git branch master2 130d7ba 
+52

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. – seagullJS

+1

Cảm ơn điều này đã tiết kiệm cho tôi giờ làm việc! FYI sử dụng git reflog để có được albertski

+0

Cảm ơn bạn rất nhiều, tôi đã tìm thấy các tệp "bị mất" của mình! – inix

34

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 SHA1 sử dụng git reflog, được mô tả trong các giải pháp here.

+1

Làm thế nào để tìm thấy sha1? –

+1

Tôi đã cập nhật câu trả lời của mình về cách tìm SHA1. – Chetan

+0

Rất cám ơn !!! –

2

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

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

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

thứ tư: Luôn suy nghĩ hai lần trước khi sử dụng -D hoặc --force với git :)

Bạn cũng có thể read this good discussion làm thế nào để phục hồi từ loại hình báo lỗi.

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

+1

1 và 4 là IMO quá mức. – jwg

+0

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ứ xung quanh. Mọi hành động bạn đã cam kết vẫn có sẵn cho bạn. – mateor

18

Nếu bạn chưa đẩy việc xóa bài viết nào, bạn chỉ có thể làm:

$ git checkout deletedBranchName 
+0

Câu trả lời này làm cho Git Extensions tắt đi "nhánh bạn đang cố gắng đẩy dường như là nhánh mới cho điều khiển từ xa này". Cảm ơn rất nhiều. – Omer

10

Nếu bạn chỉ cần xóa các 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à 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 đã xóa.

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

git checkout -b <branch_name> <sha> 

ví dụ:

git checkout -b branch_name e562d13 
3

Thanks, điều này làm việc.

new_branch_name git branch sha1

git checkout new_branch_name

// có thể thấy tôi cũ kiểm tra trong các tập tin trong chi nhánh cũ của tôi

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