Chính xác thì git rebase --skip làm gì?


107

Tôi chỉ làm một git pull --rebase origin mastervà có một xung đột.

Thứ nhất, xung đột này nằm trong một tệp mà tôi chưa chạm vào, và có khoảng 10 lần cam kết trở lại. Lý do tại sao điều này xảy ra?

Sau đó tôi vô tình gõ git rebase --skipvà nó 'bỏ qua bản vá đó'.

Lo lắng rằng tôi đã bỏ qua một cam kết, tôi đã kiểm tra một phiên bản mới của nhánh chính và tạo ra sự khác biệt giữa nhánh mà tôi đã làm cơ sở lại và nhánh chính mới. Những thay đổi duy nhất hiển thị trong sự khác biệt là cam kết mới nhất và nhìn vào nhật ký, bản vá đã được 'bỏ qua', hiển thị trong lịch sử cam kết.

Bất cứ ai có thể giải thích những gì đang xảy ra ở đây?


11
Làm thế nào để bạn vô tình gõ git rebase --skip. Có thể sai? :)
manojlds

3
Ha! Có nghĩa là gõ --abort, nhưng không hiểu vì lý do gì mà nó lại xuất hiện dưới dạng --skip. Không thực sự nghĩ. :)
mrwooster

9
shell history rất tốt trong việc này (để khiến bạn thực thi điều gì đó mà bạn không muốn).
Florian Klein

Câu trả lời:


60

Nó thực hiện những gì nó nói, nó bỏ qua một cam kết. Nếu bạn chạy rebase --abortxung đột sau đó trong cùng một rebase, tất nhiên, cam kết bị bỏ qua cũng sẽ được hoàn nguyên.

Nếu thay đổi của bạn đã tồn tại ngược dòng, Git sẽ không thể áp dụng cam kết của bạn (nhưng thường sẽ tự động bỏ qua, nếu bản vá hoàn toàn giống nhau). Cam kết của chính bạn sẽ bị bỏ qua, nhưng thay đổi sẽ vẫn tồn tại trong HEAD hiện tại, vì nó đã được áp dụng ngược dòng.

Bạn thực sự nên đảm bảo rằng bạn đã không xóa một thay đổi quan trọng của mình;) (sử dụng reflog để quay lại trạng thái trước rebase)


4
Vậy tại sao cam kết vẫn hiển thị trong nhật ký? Và tại sao cam kết bị thiếu bây giờ lại hiển thị trong khác biệt?
mrwooster

3
Có, xung đột đã được giải quyết ngược dòng ... vì lý do nào đó git rebase tạo ra các xung đột hợp nhất cũ ... một điều khác khiến tôi bối rối? ... điều này có nghĩa là nó đã bỏ qua xung đột, nhưng áp dụng bản vá đã giải quyết cuộc xung đột?
mrwooster

3
Bạn đã bỏ qua cam kết của chính mình, điều này có thay đổi giống như cam kết ngược dòng. Bạn bỏ qua cam kết của mình, nhưng sự thay đổi vẫn thực hiện (vì nó đã tồn tại thượng nguồn)
knittl

1
@mittal không, tôi không nghĩ --skiplà cách để đi. Skip sẽ bỏ qua hoàn toàn một cam kết, bỏ tất cả các thay đổi được thực hiện trong cam kết này.
đan

3
@mittal: git rebasegiống như việc sao chép các cam kết từ một nhánh này sang một nhánh khác. Vì vậy, khi bạn bỏ qua một cam kết, nội dung gốc của cam kết sẽ bị bỏ qua và bản vá không được áp dụng (vì vậy tất cả các thay đổi được thực hiện cho bất kỳ tệp nào sẽ không đưa nó vào nhánh mục tiêu của bạn). Cách đơn giản nhất là để thiết lập một kho git đơn giản với hai chi nhánh, một số cam kết trên mỗi trong số họ và sau đó cố gắng rebase và bỏ qua một cam kết (bạn có thể sử dụng git rebase --interactiveđể xác định các cam kết sẽ được sao chép ( pick) hoặc bỏ qua ( skip)
knittl
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.