2016-09-20 19 views
23

Tôi đã sau trong công việc phải làm văn bản của git rebase -i HEAD~2:Git: "không phải là 'bí' không có trước có thể cam kết" lỗi khi rebase

pick 56bcce7 Closes #2774 
pick e43ceba Lint.py: Replace deprecated link 

# Rebase 684f917..e43ceba onto 684f917 (2 command(s)) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# d, drop = remove commit 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

Bây giờ, khi tôi cố gắng dẹp một đầu tiên (56bcce7) và chọn một trong những thứ hai bằng cách thêm "s" trước khi là người đầu tiên, tôi nhận được lỗi sau:

Cannot 'squash' without a previous commit

ai đó có thể giải thích cho tôi ý nghĩa của nó, và làm thế nào để làm điều đó?

Tôi muốn dẹp cam kết đầu tiên (56bcce7) và "lựa chọn và xây dựng lại và" thứ hai (e43ceba) cam kết

+1

Thay đổi HEAD ~ 2 thành HEAD ~ 3 nếu bạn thực sự muốn bí. – ElpieKay

+0

Và có thể sử dụng --root, nếu HEAD ~ 2 là cam kết đầu tiên của bạn: https://stackoverflow.com/a/598788/2444812 – wirap

+0

Để loại bỏ lông tơ, bạn chỉ thực sự cần 4 dòng đầu tiên của ví dụ được dán. – wirap

Trả lời

28

Interactive rebase quà cam kết theo thứ tự ngược lại với những gì bạn đang sử dụng để khi sử dụng git log. git rebase -i phát lại các cam kết đã chọn theo thứ tự chính xác (từ trên xuống) chúng được liệt kê trong tệp hướng dẫn rebase đã lưu. Khi squashing, cam kết được chọn cho squashing được kết hợp với cam kết đứng trước nó trong danh sách (đã chỉnh sửa), tức là cam kết từ dòng trước đó. Trong trường hợp của bạn - không có cam kết trước đó cho 56bcce7. Bạn phải làm một trong những cách sau

  • git rebase -i HEAD~3 (nếu bạn muốn bí 56bcce7 vào 684f917)
  • Nếu bạn có ý nghĩa để kết hợp với 56bcce7e43ceba, và e43ceba không phụ thuộc vào 56bcce7, sau đó chỉ cần sắp xếp lại họ:

    r e43ceba Lint.py: Replace deprecated link 
    s 56bcce7 Closes #2774 
    

    CẬP NHẬT: Gus's answer dưới đây cho thấy một cách tốt hơn để làm như vậy, mà không sắp xếp lại hai cam kết:

    r 56bcce7 Closes #2774 
    s e43ceba Lint.py: Replace deprecated link 
    

    Điều này sẽ bí/hợp nhất hai cam kết thành một. Khi quá trình rebase tương tác yêu cầu thông báo cam kết được viết lại cho 56bcce7, hãy cung cấp thông báo cam kết mô tả sự kết hợp của 56bcce7e43ceba.

+0

Tôi muốn xóa '56bcce7' thành 'e43ceba'. Vậy, làm cách nào để thực hiện Bước 1 ở đây? – Dawny33

+0

@ Dawny33 Xem câu trả lời cập nhật – Leon

13

Tôi đã có một vấn đề tương tự mà tôi giải quyết như sau:

Đây là nhóm cam kết tôi muốn bí:

1 s 01cc5a08 Removes open div 
2 s a2b6eecf Restores old fonts 
3 s 603479ff Cleans left out div 
4 pick 5afdbc33 Update: show logo on landing page 
5 s 04c1cb13 change version of dev and prod from 1 to 2 
6 s bbe6a8f8 Update: show logo on landing page if they have one 
7 s c0d6008a Adds check for C users 

Như bạn thấy, tôi muốn không. 4, nhưng 1, 2 và 3 không có cam kết trước đó là bíp thành. Do đó, Không thể 'bíp' mà không có lỗi cam kết trước.

giải pháp của tôi là sử dụng tùy chọn r cho # r, reword = use commit, but edit the commit message

Vì vậy, danh sách các cam kết của tôi trông như thế này:

1 r 01cc5a08 Removes open div 
2 s a2b6eecf Restores old fonts 
3 s 603479ff Cleans left out div 
4 s 5afdbc33 Update: show logo on landing page 
5 s 04c1cb13 change version of dev and prod from 1 to 2 
6 s bbe6a8f8 Update: show logo on landing page if they have one 
7 s c0d6008a Adds check for C users 

Sau khi lưu, vỏ tương tác hỏi tôi cho rewording của lựa chọn cam kết.

Sau đó, nhật ký cam kết của tôi dẫn đến một cam kết duy nhất dẫn đến lịch sử cam kết rõ ràng hơn.

0

Tôi cũng đã gặp vấn đề này ngay bây giờ, đó chỉ là bất cẩn. Bạn có thể giải quyết vấn đề như tiếp theo: khi bạn cố gắng đánh bóng cái đầu tiên (56bcce7) và chọn thứ hai bạn nên thêm "s" trước dòng thứ hai nhưng không phải là dòng đầu tiên. bạn cũng có thể tham khảo trang web tiếp theo: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html

+0

Xin chào! Sẽ tốt hơn nếu bạn kiểm tra [Cách tạo một ví dụ tối thiểu, đầy đủ và có thể xác minh được] (http://stackoverflow.com/help/mcve) cho nỗ lực trong tương lai tại Stack overflow. -Cảm ơn bạn – Momin

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