Initial commit
This commit is contained in:
126
commands/branch-switch.md
Normal file
126
commands/branch-switch.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# Branch Switch
|
||||
|
||||
指定したブランチに切り替えるカスタムコマンド。PR番号を指定することも可能。
|
||||
|
||||
```bash
|
||||
# 引数チェック
|
||||
if [ -z "$1" ]; then
|
||||
echo "📋 利用可能なブランチ一覧:"
|
||||
echo "=========================="
|
||||
|
||||
# ローカルブランチ一覧を表示
|
||||
echo ""
|
||||
echo "🏠 ローカルブランチ:"
|
||||
git branch --format=' %(if)%(HEAD)%(then)* %(else) %(end)%(refname:short) %(upstream:track)'
|
||||
|
||||
echo ""
|
||||
echo "☁️ リモートブランチ:"
|
||||
git branch -r --format=' %(refname:short)' | grep -v 'HEAD'
|
||||
|
||||
echo ""
|
||||
echo "使用方法: /branch-switch <ブランチ名 | PR番号>"
|
||||
echo "例: /branch-switch feature/new-feature"
|
||||
echo " /branch-switch main"
|
||||
echo " /branch-switch 123 (PR #123のブランチに切り替え)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
INPUT="$1"
|
||||
|
||||
# PR番号かどうかをチェック(数字のみの場合)
|
||||
if [[ "$INPUT" =~ ^[0-9]+$ ]]; then
|
||||
PR_NUMBER="$INPUT"
|
||||
echo "🔍 PR #$PR_NUMBER の情報を取得中..."
|
||||
|
||||
# GitHub CLIを使ってPR情報を取得
|
||||
if ! command -v gh &> /dev/null; then
|
||||
echo "❌ Error: GitHub CLI (gh) がインストールされていません"
|
||||
echo "インストール方法: https://cli.github.com/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# PR情報を取得
|
||||
PR_INFO=$(gh pr view "$PR_NUMBER" --json headRefName,state,mergeable 2>/dev/null)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "❌ Error: PR #$PR_NUMBER が見つかりません"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ブランチ名を抽出
|
||||
BRANCH_NAME=$(echo "$PR_INFO" | jq -r '.headRefName')
|
||||
PR_STATE=$(echo "$PR_INFO" | jq -r '.state')
|
||||
|
||||
if [ "$PR_STATE" = "CLOSED" ] || [ "$PR_STATE" = "MERGED" ]; then
|
||||
echo "⚠️ 警告: PR #$PR_NUMBER は既に $PR_STATE されています"
|
||||
echo "ブランチ '$BRANCH_NAME' に切り替えます..."
|
||||
fi
|
||||
|
||||
echo "📋 PR #$PR_NUMBER のブランチ: $BRANCH_NAME"
|
||||
else
|
||||
BRANCH_NAME="$INPUT"
|
||||
fi
|
||||
|
||||
# 現在のブランチを取得
|
||||
CURRENT_BRANCH=$(git branch --show-current)
|
||||
|
||||
if [ "$CURRENT_BRANCH" = "$BRANCH_NAME" ]; then
|
||||
echo "✅ すでに '$BRANCH_NAME' ブランチにいます"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 未コミットの変更をチェック
|
||||
if ! git diff --quiet || ! git diff --staged --quiet; then
|
||||
echo "⚠️ 未コミットの変更があります:"
|
||||
git status --short
|
||||
echo ""
|
||||
echo "📦 変更をstashに自動保存して切り替えます..."
|
||||
git stash push -m "Auto-stash before switching to $BRANCH_NAME"
|
||||
STASHED=true
|
||||
fi
|
||||
|
||||
# ブランチが存在するかチェック
|
||||
if git show-ref --verify --quiet "refs/heads/$BRANCH_NAME"; then
|
||||
# ローカルブランチが存在する場合
|
||||
echo "🔄 ローカルブランチ '$BRANCH_NAME' に切り替え中..."
|
||||
git checkout "$BRANCH_NAME"
|
||||
elif git show-ref --verify --quiet "refs/remotes/origin/$BRANCH_NAME"; then
|
||||
# リモートブランチのみ存在する場合
|
||||
echo "📥 リモートブランチ 'origin/$BRANCH_NAME' をチェックアウト中..."
|
||||
git checkout -b "$BRANCH_NAME" "origin/$BRANCH_NAME"
|
||||
else
|
||||
# ブランチが存在しない場合
|
||||
echo "❌ Error: ブランチ '$BRANCH_NAME' が見つかりません"
|
||||
echo ""
|
||||
echo "🌱 新しいブランチ '$BRANCH_NAME' を作成中..."
|
||||
git checkout -b "$BRANCH_NAME"
|
||||
fi
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ ブランチ '$BRANCH_NAME' に切り替えました"
|
||||
|
||||
# リモートの最新情報を取得
|
||||
if git show-ref --verify --quiet "refs/remotes/origin/$BRANCH_NAME"; then
|
||||
echo ""
|
||||
echo "🔄 リモートとの差分をチェック中..."
|
||||
git fetch origin "$BRANCH_NAME" --quiet
|
||||
|
||||
LOCAL=$(git rev-parse HEAD)
|
||||
REMOTE=$(git rev-parse "origin/$BRANCH_NAME" 2>/dev/null)
|
||||
|
||||
if [ "$LOCAL" != "$REMOTE" ]; then
|
||||
echo "⚠️ リモートブランチとの差分があります"
|
||||
echo " 最新の変更を取得するには: git pull"
|
||||
fi
|
||||
fi
|
||||
|
||||
# stashがある場合は通知
|
||||
if [ "$STASHED" = "true" ]; then
|
||||
echo ""
|
||||
echo "💡 stashに保存した変更を復元するには: git stash pop"
|
||||
fi
|
||||
else
|
||||
echo "❌ ブランチの切り替えに失敗しました"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
Reference in New Issue
Block a user