0
0
Lập trình
Admin Team
Admin Teamtechmely

Xóa tất cả nhánh git đã squash-merge bằng lệnh terminal

Đăng vào 2 ngày trước

• 5 phút đọc

Chủ đề:

#github#git#bash

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:

  1. Bạn muốn giữ cho lịch sử commit của nhánh chính gọn gàng.
  2. Bạn đang kết hợp những thay đổi nhỏ từ các nhánh ngắn hạn.
  3. 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 Copy
# 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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào