Pernah punya PR yang nge-stuck karena ada status check belum lewat? Atau butuh merge cepat untuk CI/CD? Nah, skrip gh-force-merge.sh
ini bisa jadi penyelamat. ๐
Skrip ini menggunakan GitHub CLI (gh) untuk mendeteksi PR dari branch lokal, mencoba merge biasa, lalu otomatis fallback ke mode admin-squash kalau merge normal gagal.
๐งฉ Fitur Utama
- ๐ Deteksi otomatis PR dari branch lokal aktif
- ๐ Merge otomatis dengan
gh pr merge
- ๐ช Fallback otomatis ke
--admin --squash
kalau merge normal gagal - ๐งฑ Opsi
--dry-run
(simulasi saja) - ๐ค Opsi
--auto
(non-interaktif, cocok untuk CI/CD) - ๐งน Hapus branch setelah merge berhasil
โ๏ธ Isi Skrip: gh-force-merge.sh
#!/usr/bin/env bash
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[1;33m'; RESET='\033[0m'
DRY_RUN=false; AUTO=false
for arg in "$@"; do
case $arg in
--dry-run) DRY_RUN=true ;;
--auto) AUTO=true ;;
-h|--help)
echo "Gunakan: $0 [--dry-run] [--auto]"
exit 0 ;;
esac
done
echo -e "${CYAN}๐ Mengecek branch aktif...${RESET}"
BRANCH=$(git branch --show-current || true)
[[ -z "$BRANCH" ]] && { echo -e "${RED}โ Tidak ada branch aktif.${RESET}"; exit 1; }
echo -e "Branch aktif: ${YELLOW}$BRANCH${RESET}"
if ! gh auth status &>/dev/null; then
echo -e "${RED}โ Belum login ke GitHub CLI.${RESET}"
exit 1
fi
echo -e "${CYAN}๐ Mendeteksi PR...${RESET}"
PR_NUMBER=$(gh pr list --head "$BRANCH" --state open --json number --jq '.[0].number')
PR_URL=$(gh pr list --head "$BRANCH" --state open --json url --jq '.[0].url')
if [[ -z "$PR_NUMBER" ]]; then
echo -e "${YELLOW}โ ๏ธ Tidak ditemukan PR, membuat baru...${RESET}"
gh pr create --base main --head "$BRANCH" --title "Auto Merge: $BRANCH" --body "PR otomatis via gh-force-merge.sh"
PR_NUMBER=$(gh pr list --head "$BRANCH" --state open --json number --jq '.[0].number')
PR_URL=$(gh pr list --head "$BRANCH" --state open --json url --jq '.[0].url')
fi
echo -e "${GREEN}โ
PR #${PR_NUMBER}${RESET} โ ${PR_URL}"
if [[ "$AUTO" == false ]]; then
read -rp "Merge sekarang? [y/N]: " CONFIRM
[[ ! "$CONFIRM" =~ ^[Yy]$ ]] && { echo -e "${YELLOW}๐ซ Dibatalkan.${RESET}"; exit 0; }
fi
CMD_NORMAL="gh pr merge $PR_NUMBER --merge --delete-branch"
if [[ "$DRY_RUN" == true ]]; then
echo "[DRY RUN] $CMD_NORMAL"
else
if ! $CMD_NORMAL; then
echo -e "${YELLOW}โ ๏ธ Merge normal gagal, mencoba admin-squash...${RESET}"
CMD_ADMIN="gh pr merge $PR_NUMBER --admin --squash --delete-branch"
[[ "$DRY_RUN" == true ]] && echo "[DRY RUN] $CMD_ADMIN" || $CMD_ADMIN
fi
fi
echo -e "${GREEN}๐ Merge branch '$BRANCH' selesai.${RESET}"
๐ก Cara Menggunakan
chmod +x gh-force-merge.sh
# Mode interaktif
./gh-force-merge.sh
# Mode simulasi (tidak eksekusi merge)
./gh-force-merge.sh --dry-run
# Mode otomatis (tanpa konfirmasi, cocok untuk CI)
./gh-force-merge.sh --auto
๐ง Catatan Aman
- Pastikan kamu punya hak admin di repo sebelum memakai opsi
--admin
. - Gunakan
--dry-run
untuk memastikan branch yang akan di-merge benar. - Sebaiknya merge biasa dulu; fallback admin hanya untuk keadaan darurat.