HOWTO · Git
1つのコマンドで git add、git commit、および git push
Git では、1つのコマンドでファイルを追加、コミット、およびプッシュできます。
このページの内容
git add、git commit、git pushを1つのショートカットから実行できます。ただし、ショートカットの中でもGitの操作は別々に行われます。選択した変更をステージし、ローカルコミットを作成してから、そのコミットをリモートに送信します。Bash関数またはGitエイリアスを設定し、コミットメッセージを渡して使えます。
どちらのショートカットを使う場合も、実行前にステージ済みの変更を確認し、現在のブランチとリモートが正しいことを確かめてください。以下の例では、どちらもoriginを使い、HEADをプッシュします。リモートが設定済みであること、ブランチへのプッシュが許可されていること、認証情報にプッシュ権限があることが必要です。プッシュに失敗しても、すでに作成されたローカルコミットは取り消されません。
1つのコマンドで追加、コミット、プッシュ
一連の操作を自動化する前に、ショートカットで何をステージするか決めておきましょう。git add .は、現在のディレクトリとそのサブディレクトリ内の変更をステージします。git add -Aは、作業ツリー全体の追加、変更、削除をステージします。どちらのコマンドも、コミットするつもりのない作業を含めてしまうことがあります。対象範囲がはっきりしない場合は、コミット前にgit diff --cachedでステージ済みの差分を確認してください。
例ではgit push origin HEADを使い、現在のコミットをoriginに送信します。これは、リモートが設定されていて、リモート側がそのブランチへのプッシュを受け入れることを前提としています。プッシュに失敗してもコミットはローカルに残ります。再試行する前に、リモートURL、ブランチのポリシー、認証、ネットワーク接続を確認してください。
Bash関数を作成する
シェルから短いコマンドを使えるようにしたい場合は、Bash関数が便利です。関数を~/.bashrcに追加し、現在のBashセッションでsource ~/.bashrcを実行して読み込みます。次回以降のセッションでどの起動ファイルが読み込まれるかは、シェルの起動方法や設定によって異なります。Gitが.bashrcを読み込むわけではありません。関数が使えない場合は、現在のBashセッションでそのファイルが読み込まれているか確認するか、直接読み込んでください。
次の自己完結型の例では、一時的なローカルリポジトリとリモートを作成し、acpを定義して、任意のメッセージを渡して呼び出します。自分の環境で使う場合は、関数の定義を~/.bashrcにコピーしてください。この例には単独で実行できるよう、一時リポジトリを準備するコマンドも含まれています。
set -e
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
git init --bare -q "$tmp_dir/remote.git"
git init -q -b main "$tmp_dir/work"
cd "$tmp_dir/work"
git config user.name "Example User"
git config user.email "example@example.com"
git remote add origin "$tmp_dir/remote.git"
printf 'Initial content\n' > README.md
git add README.md
git commit -qm "Initial commit"
push_output=$(git push -q -u origin HEAD 2>&1) || {
printf '%s\n' "$push_output" >&2
exit 1
}
printf 'Updated content\n' > README.md
acp() {
git add -A && git commit -qm "$1" && {
push_output=$(git push -q origin HEAD 2>&1) || {
printf '%s\n' "$push_output" >&2
return 1
}
}
}
acp "Update README.md"
ここでは"$1"で最初の引数をコミットメッセージとして渡します。この関数はgit add -Aを使うため、コミット前に作業ツリー全体の変更をステージします。リポジトリに今回のコミットへ含めたくない作業がある場合は、先にステージ済みの差分を確認してください。関数を~/.bashrcに保存したら、現在のセッションで一度source ~/.bashrcを実行してから、acp "Update README.md"のようにメッセージを引用符で囲んで呼び出します。
Gitエイリアスを作成する
Gitエイリアスは、シェルの起動ファイルに依存せず、リポジトリから使えます。git config --global alias.lazygit '!f() { git add -A && git commit -m "$@" && git push origin HEAD; }; f'で設定し、git lazygit "Update LICENSE.md"のように実行します。--globalを付けると、すべてのリポジトリでエイリアスを使えます。省略すると、現在のリポジトリだけに保存されます。
実行可能な次の例では、関数の例と同じ一時的なローカル環境を使い、リポジトリ単位のエイリアスを定義します。エイリアス内の各操作は&&でつながれているため、前の操作が成功した場合にだけ次へ進みます。
set -e
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
git init --bare -q "$tmp_dir/remote.git"
git init -q -b main "$tmp_dir/work"
cd "$tmp_dir/work"
git config user.name "Example User"
git config user.email "example@example.com"
git remote add origin "$tmp_dir/remote.git"
printf 'Initial content\n' > LICENSE.md
git add LICENSE.md
git commit -qm "Initial commit"
push_output=$(git push -q -u origin HEAD 2>&1) || {
printf '%s\n' "$push_output" >&2
exit 1
}
git config alias.lazygit '!f() { git add -A && git commit -qm "$@" && git push -q origin HEAD; }; f'
printf 'Updated content\n' > LICENSE.md
if ! alias_output=$(git lazygit "Update LICENSE.md" 2>&1); then
printf '%s\n' "$alias_output" >&2
exit 1
fi
エイリアス内の"$@"は、git lazygitの後に指定した引数を渡します。複数の単語からなるメッセージを引用符で囲むと、1つのコミットメッセージとして扱われます。このエイリアスもgit add -Aですべての変更をステージするため、対象範囲を確認したい場合はコミット前にgit diff --cachedを確認してください。この例ではエイリアスを一時リポジトリに保存しています。上記の--globalコマンドを使うと、ユーザーのGit設定に保存されます。
適切な方法を選んで使う
シェルのロジックを含めたり、Bashの設定に合わせて調整したりしたい場合は、Bash関数を使います。Gitにショートカットを関連付け、git <alias>で使いたい場合は、Gitエイリアスを選びます。どちらの方法でも、git add、git commit、git pushはそれぞれ別の操作です。コミットに成功しても、プッシュまで成功するとは限りません。
ショートカットを実行する前に、意図したリポジトリとブランチにいること、originが目的のリモートを指していること、必要な変更だけがステージされることを確認してください。ここで紹介した関数とエイリアスは、どちらもgit add -Aを使い、作業ツリー全体の追加、変更、削除をステージします。特定のディレクトリだけを対象にするには、ステージングのコマンドを意図的に変更し、その結果を確認してください。コミットメッセージに書いたファイルだけが選ばれるわけではありません。
関数が使えない場合は、現在のBashセッションで~/.bashrcが読み込まれているか確認してください。エイリアスが使えない場合は、保存先にしたリポジトリまたはグローバルのGit設定を確認します。プッシュが拒否されてもローカルコミットは残っています。リモートまたはブランチの問題を解決し、リポジトリで通常使っている手順に従って、意図したコミットをプッシュしてください。