Lưu ý: Bạn nên không thay đổi các cam kết đã được đẩy đến một repo khác theo bất kỳ cách nào trừ khi bạn biết số consequences.
git log --oneline -4
D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A
git rebase --interactive
pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
Loại i
(Đặt VIM trong chế độ chèn)
Thay đổi danh sách để trông như thế này (Bạn không cần phải loại bỏ hoặc bao gồm thông điệp cam kết). Đừng bỏ lỡ squash
!:
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D
Loại Esc sau đó ZZ
(Lưu và thoát VIM)
# This is a combination of 2 commits.
# The first commit's message is:
commit_message_for_D
# This is the 2nd commit message:
commit_message_for_A
Loại i
Thay đổi văn bản với những gì bạn muốn mới nhắn để trông giống như cam kết.Tôi khuyên bạn nên này là một mô tả về những thay đổi trong phạm A
và D
:
new_commit_message_for_A_and_D
Loại Esc sau đó ZZ
git log --oneline -4
E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B
git show E
(You should see a diff showing a combination of changes from A and D)
Bây giờ bạn đã tạo một cam kết mới E
. Cam kết A
và D
không còn trong lịch sử của bạn nhưng không bị mất. Bạn vẫn có thể khôi phục chúng tại thời điểm này và trong một thời gian bằng cách git rebase --hard D
(git rebase --hard
sẽ hủy mọi thay đổi cục bộ!).
Ban đầu, tôi đọc nó là "rebase D lên A, squash D thành A, sau đó rebase B lên DA". Nó không rõ ràng từ câu trả lời rằng điều này có thể được thực hiện bằng cách sắp xếp lại các dòng trong một trình soạn thảo văn bản. –