Hoàn toàn hủy bỏ một cuộc nổi loạn


255

Tôi đã thực hiện một rebase như thế này:

git rebase --onto master new_background_processing export_background_processing

Điều đó đã không làm những gì tôi muốn, vì vậy tôi đã thực hiện thiết lập lại:

git reset --hard HEAD@{1}

Tôi đã đưa chi nhánh của mình trở lại trạng thái như cũ, nhưng tôi nhận được thông báo này khi tôi gõ trạng thái git:

# You are currently rebasing branch 'export_background_processing' on 'e378641'.

Làm thế nào để tôi hủy bỏ cuộc nổi loạn đó hoàn toàn? Không chắc điều đó có nghĩa là gì.


16
git rebase --abort
Micha Wiedenmann

6
Git 2.12 hiện cung cấp git rebase --quit. Xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


407

Sử dụng git rebase --abort. Từ tài liệu nhân Linux chính thức chogit rebase :

git rebase --continue | --skip | --abort | --edit-todo

5
Trong trường hợp của tôi, git rebase --abortnó không hoạt động, bởi vì tôi đã làm hỏng một cái gì đó. Tôi chỉ nhận được lỗi sau : error: could not read '.git/rebase-apply/head-name': directory of file does not exist. Các git rebase --quit mô tả dưới đây đã giải quyết vấn đề của tôi.
Kout

84

Trong trường hợp của một cuộc nổi loạn trong quá khứ mà bạn đã không hủy bỏ đúng cách, bây giờ bạn (Git 2.12, Q1 2017) có git rebase --quit

Xem cam kết 9512177 (ngày 12 tháng 11 năm 2016) của Nguyễn Thái Ngọc Duy ( pclouds) . (Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 06cd5a1 , ngày 19 tháng 12 năm 2016)

rebase: thêm --quitvào dọn dẹp rebase, để mọi thứ khác không bị ảnh hưởng

Có những lúc bạn quyết định hủy bỏ một cuộc nổi loạn đang diễn ra và chuyển sang làm việc khác nhưng bạn lại quên làm " git rebase --abort" trước . Hoặc cuộc nổi loạn đã được tiến hành trong một thời gian dài mà bạn quên nó. Đến lúc bạn nhận ra rằng (ví dụ bằng cách bắt đầu một cuộc nổi loạn khác) thì đã quá muộn để lấy lại các bước của bạn. Giải pháp là bình thường

rm -r .git/<some rebase dir>

và tiếp tục với cuộc sống của bạn.
Nhưng có thể có hai thư mục khác nhau cho <some rebase dir>(và rõ ràng nó đòi hỏi một số kiến ​​thức về cách rebase hoạt động) và phần " .git" có thể dài hơn nhiều nếu bạn không ở top-dir hoặc trong một worktree được liên kết. Và " rm -r" rất nguy hiểm khi thực hiện .git, một lỗi trong đó có thể phá hủy cơ sở dữ liệu đối tượng hoặc dữ liệu quan trọng khác.

Cung cấp " git rebase --quit" cho trường hợp sử dụng này, bắt chước một tiền lệ là " git cherry-pick --quit".


Trước Git 2.27 (quý 2 năm 2020), mục nhập stash được tạo bởi " git merge --autostash" để giữ trạng thái bẩn ban đầu đã bị loại bỏ do nhầm lẫn " git rebase --quit", đã được sửa.

Xem cam kết 9b2df3e (28 tháng 4 năm 2020) của Denton Liu ( Denton-L) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 3afdeef , ngày 29 tháng 4 năm 2020)

rebase: Lưu autostash nhập cảnh vào stash reflogtrên--quit

Đã ký tắt: Denton Liu

Trong a03b55530a (" merge: tùy chọn dạy - tự động", 2020-04-07, Git v2.27.0 - hợp nhất được liệt kê trong lô số 5 ), --autostashtùy chọn đã được giới thiệu cho git merge.

(Xem phần " Có thể git pulltự động chặn và bật các thay đổi đang chờ xử lý? ")

Đáng chú ý, khi git merge --quitđược chạy với mục nhập tự động, nó được lưu vào kho lưu trữ stash.

Điều này trái ngược với hành vi hiện tại của git rebase --quitnơi mục nhập tự động đơn giản là bị loại khỏi sự tồn tại.

Thông qua hành vi của git merge --quittrong git rebase --quitvà lưu mục nhập tự động vào kho lưu trữ stash thay vì chỉ xóa nó.


3
Điều này rất hữu ích để tránh tác dụng phụ của việc đặt lại thư mục làm việc khi các thay đổi được thực hiện trên đầu trang git rebase, thay vì mất chúng như tôi vừa làm: P.
Tinh tinh hiếu chiến

12

Bạn thật may mắn vì bạn đã không hoàn thành cuộc nổi loạn, vì vậy bạn vẫn có thể làm được git rebase --abort. Nếu bạn đã hoàn thành cuộc nổi loạn (nó viết lại lịch sử ), mọi thứ sẽ phức tạp hơn nhiều. Cân nhắc gắn thẻ các mẹo của các chi nhánh trước khi thực hiện các hoạt động có khả năng gây tổn hại (đặc biệt là viết lại lịch sử), theo cách đó bạn có thể tua lại nếu có gì đó nổ tung.


8

Nếu bạn đang "Rebasing" , "Đã bắt đầu rebase" mà bạn muốn hủy , chỉ cần nhận xét (#)tất cả các cam kết được liệt kê trong trình chỉnh sửa rebase.

Kết quả là bạn sẽ nhận được một thông báo dòng lệnh

Nothing to do
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.