Lưu ý: Bạn không nên thay đổi các cam kết đã được đẩy sang một repo khác bằng bất kỳ cách nào trừ khi bạn biết hậu quả .
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
Nhập i
(Đặt VIM ở chế độ chèn)
Thay đổi danh sách thành như thế này (Bạn không phải xóa hoặc bao gồm thông báo cam kết). Đừng viết sai chính tả squash
! :
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D
Nhập Escrồi 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
Kiểu i
Thay đổi văn bản thành những gì bạn muốn thông điệp cam kết mới trông như thế nào. Tôi khuyên bạn nên mô tả về các thay đổi trong cam kết A
và D
:
new_commit_message_for_A_and_D
Nhập EscrồiZZ
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 biến 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ẽ phá hủy mọi thay đổi cục bộ! ).