2015-11-06 24 views
6

Tôi thích git rebase -i HEAD~5 để giảm bớt cam kết của tôi. Đôi khi tôi nghĩ rằng tôi cần phải quay trở lại 5 cam kết nhưng sau đó nhận ra tôi cần 7. Tuy nhiên git đã đưa lên biên tập viên rebase .git/rebase-merge/git-rebase-todo trong vim.Git: hủy một lần rebase tương tác

Nếu tôi bỏ rằng đệm (vim) sau đó git nói:

Successfully rebased and updated refs/heads/my-branchname 

Có cách nào để ngăn chặn sự rebase từ w/trong trình soạn thảo? Tôi cho rằng tôi có thể git rebase --abort từ một trình bao khác nhưng không chắc chắn điều đó sẽ làm gì với tệp git-rebase-todo mà tôi muốn ở giữa chỉnh sửa trong bộ đệm khác.

+1

Nếu bạn chưa thay đổi bất cứ điều gì bên trong tập tin sau đó mặc dù chi nhánh là " Đã thành công rebased "tất cả các cam kết là như nhau vì vậy nó có hiệu quả một no-op. –

Trả lời

10

Nếu bạn đang ở cửa sổ soạn thảo rebase tương tác ban đầu trông như thế này:

pick f7f3f6d changed my name a bit 
pick 310154e updated README formatting and added blame 
pick a5f4a0d added cat-file 

# Rebase 710f0f8..a5f4a0d onto 710f0f8 
... 
... 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 

bạn có thể hủy bỏ rebase bằng cách xóa toàn bộ nội dung của cửa sổ soạn thảo và lưu nó, hoặc gây ra soạn thảo để đóng với một mã lỗi.

Trong trường hợp này có thể được thực hiện với d SHIFT+g, sau đó là :wq hoặc cách khác khiến trình chỉnh sửa thoát ra có lỗi như Mike H-R chỉ ra sử dụng :cq.

Nếu bạn đã rời khỏi cửa sổ đó và đang thực hiện các bí quyết/chỉnh sửa sau đây, điều này sẽ không hủy bỏ toàn bộ quá trình rebase mà chỉ thay đổi cam kết hiện đang được chỉnh sửa. Tại thời điểm này bạn có thể giết trình soạn thảo như trên, nhưng ngoài ra, bạn sẽ phải thực hiện một số git rebase --abort trên dòng lệnh.

+0

Điều đó không đúng. Nếu bạn muốn hủy bỏ toàn bộ hoạt động rebase, nhưng bạn đang ở trong squash cuối cùng của một loạt các rebasing tương tác, điều này không "hủy bỏ" rebase tương tác. Nó chỉ hủy bỏ các bước rebase hiện tại cam kết. – fourpastmidnight

+0

@fourpastmidnight Tôi không hoàn toàn chắc chắn rằng tôi theo dõi. Việc xóa và lưu chỉ áp dụng cho cửa sổ trình chỉnh sửa ban đầu mà bạn chọn để chọn/squash/edit/etc. Nếu bạn đã bỏ điều đó và đang ở trong trình soạn thảo cho một độ phân giải squash riêng lẻ thì điều này sẽ không áp dụng. Đó là trường hợp bạn đang nói về? – whaleberg

+0

Vâng, đó là chính xác. Tôi hiểu câu hỏi của OP về việc hủy bỏ quy trình rebase _entire_, nhưng chỉ sau khi OP ở trong cửa sổ trình soạn thảo cho một bóng quần, chẳng hạn. Tôi thấy mình trong một tình huống tương tự ngày hôm qua và đã thử những gì bạn đề nghị trong câu trả lời của bạn. Thật không may, nó đã hành xử theo cách bạn vừa mô tả trong bình luận của bạn. Có lẽ làm rõ câu trả lời của bạn sẽ giúp những người khác tránh được sai lầm của tôi (tôi là một chút mới để rebase tương tác, bản thân mình). Trong mọi trường hợp, tôi đã có thể khởi động lại và chỉnh sửa/chia nhỏ cam kết, nhưng hành vi không mong muốn. – fourpastmidnight

6

Bạn có thể thực hiện lệnh thoát vim bằng mã thoát khác 0 để hủy rebase bằng cách nhập :cq. Kết quả của việc này là:

$ git rebase -i HEAD~4 
# enter vim, then type :cq<enter> 
Could not execute editor 

Từ trang giúp đỡ vim chúng ta thấy rằng cq là viết tắt của cquit:

             *:cq* *:cquit* 
:cq[uit][!]    Quit Vim with an error code, so that the compiler 
         will not compile the same file again. 
         WARNING: All changes in files are lost! Also when the 
         [!] is not used. It works like ":qall!" |:qall|, 
         except that Vim returns a non-zero exit code. 
+0

OK, tôi sẽ cắn; ': cq' là gì? – Meltemi

+0

@Meltemi Tôi đã cập nhật câu trả lời của mình với giải thích về 'cq'. –

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