Xóa tất cả nhánh git đã squash-merge bằng một lệnh terminal
Trong bài viết này, tôi sẽ hướng dẫn bạn cách xóa tất cả các nhánh git đã được squash-merge với một lệnh terminal duy nhất. Việc quản lý nhánh trong git rất quan trọng, đặc biệt là khi làm việc với các dự án lớn. Đặc biệt, nếu nhóm của bạn thường xuyên sử dụng phương pháp squash-merge trên GitHub, thì việc dọn dẹp các nhánh này là cần thiết để duy trì môi trường phát triển sạch sẽ.
Sự khác biệt giữa "merge" và "squash and merge"
Merge
Khi bạn thực hiện merge một pull request trên GitHub, tất cả các commit từ nhánh tính năng sẽ được thêm vào nhánh chính thông qua một merge commit. Merge commit này sẽ giữ lại toàn bộ lịch sử các thay đổi, cho phép bạn theo dõi được quá trình phát triển của nhánh tính năng.
Squash and Merge
Ngược lại, khi bạn sử dụng squash and merge, tất cả các commit trên nhánh tính năng sẽ được gộp lại thành một commit duy nhất. Phương pháp này rất hữu ích khi:
- Bạn muốn giữ cho lịch sử commit của nhánh chính gọn gàng.
- Bạn đang kết hợp những thay đổi nhỏ từ các nhánh ngắn hạn.
- Bạn không cần lưu giữ lịch sử của nhánh tính năng.
Tại sao script bash ban đầu không hoạt động với các nhánh đã squash
Dưới đây là script bash mà tôi đã viết để xóa tất cả các nhánh đã được merge. Tuy nhiên, nó không hoạt động với các nhánh đã squash. Bởi vì khi thực hiện squash merge, Git sẽ không giữ lại lịch sử của nhánh đó, khiến lệnh git branch --merged
không thể tìm thấy nhánh để xóa.
bash
# Xóa tất cả nhánh đã được merge vào nhánh chính
dam() {
echo "=== Đang xóa tất cả các nhánh đã merge ==="
git checkout main && git branch --merged | grep -vE "(^\*|main)" | xargs git branch -d
echo "☑️ Xong rồi!"
}
Script tìm và xóa nhánh đã squash
Để xóa tất cả nhánh đã squash, chúng ta cần một cách tiếp cận khác. Dưới đây là script dams()
, viết tắt cho "delete all merged squashed". Để sử dụng script này:
- Thêm mã dưới đây vào tệp
.bashrc
hoặc.zshrc
của bạn. - Lưu tệp lại.
- Thực hiện lệnh
source
để cập nhật thay đổi hoặc khởi động lại terminal. - Chạy
dams
trong thư mục dự án git của bạn. - Thỏa sức dọn dẹp!
bash
dams() {
echo "=== Đang xóa nhánh đã merge và squash-merge ==="
# Đảm bảo nhánh chính được checkout và cập nhật
git checkout main &&
git pull &&
# Lặp qua tất cả các nhánh địa phương ngoại trừ nhánh chính
for branch in $(git for-each-ref --format='%(refname:short)' --exclude=refs/heads/main refs/heads/); do
# Bỏ qua nếu nhánh không tồn tại trên remote
if ! git ls-remote --exit-code --heads origin "$branch" >/dev/null 2>&1; then
echo "Bỏ qua $branch (không tồn tại trên remote)"
continue
fi
# Xóa chỉ khi nội dung hoàn toàn ở nhánh chính
if git diff --quiet "$branch" main; then
git branch -D "$branch"
echo "Đã xóa $branch"
else
echo "Giữ lại $branch (có thay đổi chưa merge)"
fi
done
echo "☑️ Xong rồi!"
}
Phân tích script
Kiểm tra nhánh chính và cập nhật
Đầu tiên, script sẽ checkout nhánh chính và cập nhật các thay đổi mới nhất:
bash
git checkout main && git pull &&
Lặp qua các nhánh địa phương
Script sẽ lặp qua các nhánh địa phương, ngoại trừ nhánh chính:
bash
for branch in $(git for-each-ref --format='%(refname:short)' --exclude=refs/heads/main refs/heads/); do
Kiểm tra nhánh đã được push lên remote
Đoạn mã này kiểm tra xem nhánh có tồn tại trên remote hay không nhằm tránh việc xóa nhánh chưa được push:
bash
if ! git ls-remote --exit-code --heads origin "$branch" >/dev/null 2>&1; then
echo "Bỏ qua $branch (không tồn tại trên remote)"
continue
fi
Kiểm tra sự khác biệt và xóa nhánh
Cuối cùng, script kiểm tra sự khác biệt giữa nhánh và nhánh chính, và xóa nhánh nếu không có sự khác biệt:
bash
if git diff --quiet "$branch" main; then
git branch -D "$branch"
echo "Đã xóa $branch"
else
echo "Giữ lại $branch (có thay đổi chưa merge)"
fi
Lời khuyên và lưu ý
- Sử dụng script này với sự cẩn trọng: Bạn nên kiểm tra kỹ lưỡng trước khi thực hiện bất kỳ thao tác xóa nào trên nhánh git của mình.
- Sao lưu dữ liệu quan trọng: Đảm bảo rằng bạn đã sao lưu tất cả các dữ liệu quan trọng của dự án trước khi thực hiện dọn dẹp.
FAQ
1. Tôi có thể sử dụng script này trên bất kỳ dự án git nào không?
Có, nhưng hãy chắc chắn rằng bạn hiểu rõ về lịch sử nhánh và các thay đổi trước khi xóa.
2. Có cách nào khác để xóa nhánh đã squash không?
Bạn có thể sử dụng các lệnh git khác như git branch -d
hoặc git branch -D
nhưng cần phải kiểm tra lịch sử nhánh trước để tránh mất dữ liệu.
3. Có cần thiết phải giữ lịch sử nhánh không?
Nếu dự án của bạn yêu cầu theo dõi lịch sử thay đổi, bạn nên cân nhắc kỹ trước khi xóa các nhánh đã squash.
Kết luận
Việc quản lý các nhánh git là rất quan trọng trong quá trình phát triển phần mềm. Sử dụng script dams()
giúp bạn xóa nhanh chóng các nhánh đã được squash-merge, giúp môi trường phát triển của bạn luôn gọn gàng. Hãy thử nghiệm và áp dụng vào quy trình làm việc của bạn!
Hãy chia sẻ bài viết này với đồng nghiệp của bạn để cùng nhau tối ưu hóa quy trình làm việc với git!