2011-01-11 30 views
19

Tôi đang sử dụng git svn để có được một số ưu điểm tốt với máy chủ svn do công ty uỷ quyền. Tôi chỉ có một rebase đi méo kinh dị, và tôi "m cố gắng tìm ra cách tốt nhất để phục hồiPhục hồi từ một lần rebase không thành công

Đây là những gì đã xảy ra:.

  1. Để bắt đầu, tôi đã có này

    ---1 (master) 
        \--B--C--D--E (feature/fix-widgets) 
    
  2. Vì vậy, sau đó tôi đã thực hiện git checkout master và sau đó git svn rebase trên máy chủ để gỡ bỏ các cam kết đó.Tôi không lường trước bất kỳ xung đột nào giữa chi nhánh và chủ nhân của tôi, bởi vì những thay đổi nằm trong một thư mục hoàn toàn khác. Tôi có điều này:

    ---1--2--3--4 (master) 
        \--B--C--D--E (feature/fix-widgets) 
    

    Trường hợp 1--2--3--4 là các cam kết được lấy từ svn.

  3. Tiếp theo, tôi làm git checkout feature/fix-widgets và sau đó git rebase master. Có ngay lập tức một cuộc xung đột, và một số điều không thêm lên, vì vậy tôi quyết định trượt đi và nhìn vào mọi thứ cẩn thận hơn. Tôi làm git rebase --abort, hy vọng điều này sẽ khôi phục lại tôi đến nơi tôi đã trước khi rebase.

  4. tôi làm git rebase --abort và nhận được thông báo sau

    $ git rebase --abort 
        error: git checkout-index: unable to create file somedir/somefile.cs (Permission denied) 
        fatal: Could not reset index file to revision 'be44daa05be39f6dd0d602486a598b63b6bd2af7'. 
    
  5. Bây giờ tôi không biết phải làm gì. git status cho thấy tôi đang ở trên feature/fix-widgets, nhưng tôi đã thay đổi toàn bộ giai đoạn và một số lượng lớn các tệp không được theo dõi trước đó đã được cam kết. Tôi sẽ ổn nếu tôi có thể quay lại E.

+1

Tôi gặp phải sự cố rất giống nhau hôm nay - Tôi đoán bạn đang sử dụng git trên Windows, hệ điều hành đáng yêu nghĩ rằng khóa chia sẻ là ý tưởng hay. Tôi đoán là lý do nó nghẹt thở trên somedir/somefile.cs là nó đã được mở ở đâu đó ... đây là nguyên nhân của sự thất bại của tôi rebase. Đóng tất cả các chương trình mở mà tôi có thể tìm thấy, đặt lại theo câu trả lời đã chọn, sau đó rebasing, làm việc mà không có vấn đề gì. –

+0

+1 cho câu hỏi được viết tốt đã cứu tôi khỏi khóc. – Tinman

Trả lời

25

Bạn nên có một cái nhìn tại ORIG_HEAD

ORIG_HEAD là trạng thái trước đó của HEAD, được thiết lập bởi các lệnh có hành vi có thể gây nguy hiểm, để được dễ dàng để trở lại chúng.
Đó là ít hữu ích bây giờ mà Git đã reflog: [email protected]{1} là tương đương với ORIG_HEAD ([email protected]{1} luôn là giá trị cuối cùng của HEAD, ORIG_HEAD là giá trị cuối cùng của HEAD trước khi hoạt động nguy hiểm)

Vì vậy, cố gắng git reset này để lấy lại trước bất kỳ lần rebase nào:

git reset --hard ORIG_HEAD 
+0

Điều đó thật dễ dàng. Tôi đã thiết lập lại, và sau đó chỉ câm lặng cố gắng để rebase một lần nữa, và nó đã làm việc. * nhún vai * – notJim

+0

@notJim: đúng, nhưng nó có thể hữu ích để giữ cho 'ORIG_HEAD' trong tâm trí khi thực hiện các lệnh đó. Nó có thể có ích. – VonC

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