Cách kết hợp N lần cam kết Git cuối cùng của bạn

Cách kết hợp N lần cam kết Git cuối cùng của bạn
Cách kết hợp N lần cam kết Git cuối cùng của bạn

Làm chủ việc nén cam kết trong Git:

Khi làm việc trên một dự án, lịch sử cam kết của bạn có thể trở nên lộn xộn với vô số cam kết nhỏ. Những cam kết nhỏ này có thể gây khó khăn cho việc xem xét các thay đổi và hiểu lịch sử dự án.

Trong Git, bạn có thể nén N cam kết cuối cùng của mình thành một cam kết duy nhất, tạo ra một lịch sử rõ ràng hơn và dễ quản lý hơn. Hướng dẫn này sẽ hướng dẫn bạn các bước để đạt được điều này, giúp việc kiểm soát phiên bản của bạn hiệu quả hơn.

Yêu cầu Sự miêu tả
git rebase -i HEAD~N Bắt đầu một cuộc khởi động lại tương tác của N lần xác nhận cuối cùng.
pick Duy trì cam kết nguyên trạng trong quá trình rebase tương tác.
squash Kết hợp một cam kết với cam kết trước đó trong quá trình rebase tương tác.
sed -i '1!s/pick/squash/' .git/rebase-merge/git-rebase-todo Tự động thay thế 'chọn' bằng 'bí' cho tất cả trừ lần xác nhận đầu tiên trong danh sách việc cần làm của rebase.
git rebase --continue Tiếp tục quá trình rebase sau khi giải quyết xung đột.
git rebase --abort Hủy bỏ quá trình rebase và trở về trạng thái trước khi bắt đầu rebase.
HEAD~N Đề cập đến N vị trí cam kết trước HEAD hiện tại.

Hiểu về Git Commit Squash

Kịch bản đầu tiên sử dụng git rebase -i HEAD~N để bắt đầu một cuộc khởi động lại tương tác của N lần xác nhận cuối cùng. Trong màn hình tương tác, bạn thay thế 'chọn' bằng 'bí' cho các cam kết bạn muốn kết hợp. Quá trình này giúp hợp nhất nhiều cam kết nhỏ hơn thành một, giúp lịch sử cam kết của bạn rõ ràng hơn và dễ quản lý hơn. Sau khi chỉnh sửa, lưu và đóng trình chỉnh sửa. Nếu có xung đột, bạn giải quyết chúng và tiếp tục với git rebase --continue.

Tập lệnh thứ hai là tập lệnh Bash tự động hóa quá trình nén. Nó bắt đầu bằng cách kiểm tra xem một số cam kết (N) có được cung cấp hay không. Sau đó, nó chạy git rebase -i HEAD~N và sử dụng sed để thay thế 'pick' bằng 'squash' cho tất cả trừ cam kết đầu tiên trong danh sách việc cần làm của rebase. Điều này giúp việc xóa nhiều lần xác nhận dễ dàng hơn mà không cần chỉnh sửa tệp theo cách thủ công. Cuối cùng, nó tiếp tục quá trình rebase với git rebase --continue, tự động xử lý mọi giải pháp xung đột cần thiết.

Nén nhiều cam kết thành một bằng cách sử dụng Git Rebase

Lệnh Git

git rebase -i HEAD~N
# Replace N with the number of commits you want to squash
# In the interactive rebase screen that appears, change 'pick' to 'squash' (or 's') for the commits you want to squash
# Save and close the editor
# Edit the commit message if needed, then save and close the editor again
# If there are conflicts, resolve them and then run
git rebase --continue
# Your last N commits are now squashed into one commit

Tự động nén cam kết bằng Shell Script

Tập lệnh Bash

#!/bin/bash
if [ -z "$1" ]
then
  echo "Usage: ./squash_commits.sh <N>"
  exit 1
fi
git rebase -i HEAD~$1
# Automatically replace 'pick' with 'squash' for all but the first commit
sed -i '1!s/pick/squash/' .git/rebase-merge/git-rebase-todo
git rebase --continue

Kỹ thuật nén Git nâng cao

Một khía cạnh quan trọng khác của việc loại bỏ các cam kết trong Git là xử lý các xung đột hợp nhất có thể phát sinh trong quá trình này. Khi kết hợp nhiều lần xác nhận, những thay đổi từ các lần xác nhận khác nhau có thể xung đột với nhau. Để giải quyết những xung đột này, Git cung cấp các lệnh như git status để xem tập tin nào đang xung đột và git add để đánh dấu chúng là đã giải quyết. Sau khi giải quyết xung đột, bạn tiếp tục rebase với git rebase --continue.

Việc biết cách hủy bỏ rebase nếu có sự cố xảy ra cũng rất hữu ích. Lệnh số 8 dừng quá trình rebase và đưa kho lưu trữ của bạn về trạng thái trước đó trước khi quá trình rebase bắt đầu. Điều này đảm bảo rằng bạn có thể hoàn tác an toàn mọi thay đổi được thực hiện trong quá trình rebase. Hiểu các lệnh này có thể cải thiện đáng kể khả năng quản lý lịch sử Git phức tạp một cách hiệu quả.

Câu hỏi thường gặp về Git Commit Squash

  1. Cam kết đè bẹp có nghĩa là gì?
  2. Xóa các cam kết có nghĩa là kết hợp nhiều cam kết thành một cam kết duy nhất để đơn giản hóa lịch sử cam kết.
  3. Tại sao tôi nên xóa cam kết?
  4. Việc xóa các cam kết có thể làm cho lịch sử dự án của bạn rõ ràng hơn và dễ đọc hơn, đặc biệt khi sử dụng nhiều cam kết nhỏ.
  5. Làm cách nào để bắt đầu một cuộc nổi loạn tương tác?
  6. Sử dụng lệnh git rebase -i HEAD~N, thay thế N bằng số lần xác nhận bạn muốn xóa.
  7. 'Chọn' và 'bí' có nghĩa là gì trong rebase tương tác?
  8. 'Pick' giữ nguyên cam kết, trong khi 'squash' kết hợp nó với cam kết trước đó.
  9. Làm cách nào để giải quyết xung đột trong quá trình rebase?
  10. Sử dụng git status để xác định xung đột, giải quyết chúng theo cách thủ công, sau đó sử dụng git addgit rebase --continue.
  11. Tôi có thể hủy bỏ rebase nếu có sự cố xảy ra không?
  12. Có, bạn có thể sử dụng số 8 để dừng rebase và trở về trạng thái trước đó.
  13. Lợi ích của việc sử dụng tập lệnh Bash để xóa các cam kết là gì?
  14. Tập lệnh Bash tự động hóa quy trình, tiết kiệm thời gian và giảm nguy cơ xảy ra lỗi thủ công.
  15. Có cách nào để tự động xóa các cam kết trong rebase không?
  16. Có, bằng cách sử dụng tập lệnh để sửa đổi danh sách việc cần làm của rebase với sed, bạn có thể tự động thay đổi 'chọn' thành 'bí'.

Kết thúc việc nén cam kết Git

Xóa cam kết trong Git là một kỹ thuật mạnh mẽ để duy trì lịch sử dự án rõ ràng và dễ đọc. Cho dù sử dụng rebase tương tác hay tự động hóa bằng tập lệnh Bash, bạn có thể kết hợp nhiều lần xác nhận thành một lần duy nhất, giúp quản lý nhật ký dễ dàng hơn. Hiểu cách giải quyết xung đột và hủy bỏ rebase sẽ nâng cao trình độ Git của bạn, đảm bảo bạn có thể xử lý mọi vấn đề phát sinh. Việc nắm vững các lệnh và phương pháp này sẽ cải thiện đáng kể việc thực hành kiểm soát phiên bản của bạn.