Sửa đổi lịch sử commit Git bằng rebase

Trong quá trình làm việc với Git, đôi khi bạn cần chỉnh sửa nội dung của một commit đã có trong lịch sử, đặc biệt là khi commit đó chứa thông tin sai hoặc cần được cập nhật trước khi phát hành phiên bản mới. Lệnh git rebase cung cấp một cách mạnh mẽ để thực hiện điều này, cho phép bạn viết lại lịch sử commit.

Giả sử bạn có một lịch sử commit như sau, trong đó commit C chứa nội dung cần chỉnh sửa:

      A --- B ---- C ---- D ---- E  ----- F ------
                  |        \              \
                 Có lỗi      \----- Phát hành      \---- Phát hành

Bạn cần sửa đổi nội dung của commit C.

Quy trình sửa đổi commit

Bạn có thể sử dụng chế độ interactive rebase để chỉnh sửa các commit cũ. Dưới đây là các bước chi tiết:

1. Kiểm tra lịch sử commit

Trước tiên, xem lại lịch sử commit để xác định chính xác commit bạn muốn sửa đổi.


git log

2. Lưu trữ các thay đổi hiện tại (tùy chọn)

Nếu bạn có các thay đổi chưa commit, hãy lưu trữ chúng bằng git stash để tránh mất mát. Bạn sẽ khôi phục chúng sau khi hoàn tất việc sửa đổi lịch sử.


git stash

3. Bắt đầu rebase tương tác

Sử dụng lệnh git rebase -i, chỉ định commit mà bạn muốn bắt đầu chỉnh sửa. Thông thường, bạn sẽ chỉ đến commit ngay trước commit bạn muốn sửa đổi. Ký hiệu ^ sau hash commit sẽ chỉ đến commit trước đó.


# Giả sử commit bạn muốn sửa có hash là 'commit_hash_old'
# và bạn muốn sửa đổi chính commit đó.
# Bạn cần rebase từ commit ngay trước nó.
git rebase -i <commit_hash_old>^

Lệnh này sẽ mở một trình soạn thảo văn bản hiển thị danh sách các commit từ điểm rebase trở đi.

4. Chỉnh sửa lệnh rebase

Trong trình soạn thảo, tìm dòng commit bạn muốn sửa đổi và thay đổi từ khóa pick thành edit. Lưu và thoát trình soạn thảo.

Các tùy chọn phổ biến trong rebase tương tác bao gồm:

  • p, pick: Sử dụng commit.
  • r, reword: Sử dụng commit nhưng sửa đổi thông điệp commit.
  • e, edit: Sử dụng commit nhưng dừng lại để sửa đổi nội dung commit.
  • s, squash: Sử dụng commit nhưng gộp nó vào commit trước đó.
  • f, fixup: Tương tự squash nhưng loại bỏ thông điệp commit này.
  • x, exec: Chạy lệnh shell.
  • d, drop: Xóa commit.

5. Sửa đổi nội dung commit

Sau khi rebase dừng lại ở commit bạn đã đánh dấu là edit, hãy thực hiện các thay đổi đối với các tệp cần thiết.


# Sửa đổi tệp
vim ten_file_can_sua.cpp

# Thêm các thay đổi đã sửa vào staging area
git add ten_file_can_sua.cpp

# Sử dụng --amend để cập nhật commit hiện tại
git commit --amend

Sau khi hoàn thành, thông điệp commit ban đầu sẽ được thay thế bằng thông điệp mới (hoặc bạn có thể sửa đổi nó nếu cần).

6. Tiếp tục quá trình rebase

Khi bạn đã sửa đổi xong commit đó, hãy tiếp tục quá trình rebase để áp dụng các commit tiếp theo.


git rebase --continue

Nếu có xung đột xảy ra (do các commit sau đó cũng thay đổi trên cùng một phần mã), bạn cần giải quyết xung đột, thêm các tệp đã sửa vào staging area, và sau đó tiếp tục rebase.


# Giải quyết xung đột
vim ten_file_bi_xung_dot.cpp

# Thêm các tệp đã giải quyết xung đột
git add ten_file_bi_xung_dot.cpp

# Tiếp tục rebase
git rebase --continue

Lặp lại bước này cho đến khi tất cả các commit được áp dụng thành công.

7. Khôi phục các thay đổi đã lưu (nếu có)

Nếu bạn đã sử dụng git stash ở bước 2, hãy khôi phục lại các thay đổi đã lưu.


git stash pop

Bạn có thể cần giải quyết xung đột nếu các thay đổi trong stash xung đột với lịch sử đã được viết lại.

Thẻ: git rebase interactive rebase git commit lịch sử Git

Đăng vào ngày 3 tháng 9 lúc 05:16