HOWTO · Git
Git Push Origin と Git Push Origin Master の違い
この記事では、git push origin と git push origin master コマンドの違いについて概説します。
このページの内容
git push origin master は、リモート origin にプッシュするローカルブランチ master を指定します。一方、git push origin はブランチ名を省略するため、プッシュされる参照は push.default の設定によって変わります。simple は必要な追跡設定とブランチ名の確認を満たす場合に現在のブランチを upstream へプッシュし、matching は origin に同名のブランチがあるローカルブランチを複数プッシュすることがあります。master を指定したい場合はブランチ名を含むコマンドを使い、ブランチ名を省略する場合は、設定されたモードと、そのモードが選択するブランチを事前に確認してください。
名前を指定したブランチを git push origin master でプッシュする
git push origin master は、ローカルの master ブランチを明示的に選び、origin に送信します。現在チェックアウトしているブランチは選択に影響しません。たとえば feature にいるときに実行しても、指定されるのは master です。リモートブランチはプッシュの refspec に従って更新されます。このコマンドは master がプロジェクトの主要ブランチであることを意味せず、ブランチ名は別のローカルブランチ名に置き換えられます。
たとえば、git push origin feature は feature を明示的に選びます。リモートにその名前のブランチがない場合、リモート側でプッシュが受け入れられれば、プッシュ時に Git がリモート参照を作成できます。送信元ブランチの選択に、現在のブランチの upstream は使われません。
現在のブランチを git push origin でプッシュする
ブランチを引数に指定しない場合、Git は設定された push.default の動作を使います。このコマンドがチェックアウト中のブランチだけを対象にするとは限らず、そのブランチの upstream が常に必要というわけでもありません。simple モードでは、upstream が設定され、ブランチ名の確認を通過すると、Git は現在のブランチをその upstream にプッシュします。matching モードでは、リモートに同じ名前のブランチがすでにあるローカルブランチをプッシュします。そのため、1 回の git push origin で複数のブランチが更新されることがあり、現在のブランチの upstream を基準に選ばれるわけではありません。ブランチ名を省略したプッシュを使う前に、git config --get push.default で設定モードを確認し、git branch -vv でブランチの追跡状態を調べてください。
この自己完結型の例では、ローカルの bare リモートと作業用リポジトリを作成し、名前を指定して master をプッシュしたあと、追跡設定のある現在のブランチを git push origin でプッシュします。設定は一時リポジトリ内だけに適用します。例はローカルで実行できますが、ここでは出力を示していません。
set -eu
root=$(mktemp -d)
trap 'rm -rf "$root"' EXIT
remote="$root/origin.git"
repo="$root/work"
git init --bare -q "$remote"
git init -q -b master "$repo"
git -C "$repo" config user.name "Example User"
git -C "$repo" config user.email "example@example.com"
git -C "$repo" config push.default simple
git -C "$repo" remote add origin "$remote"
printf 'first commit\n' > "$repo/README.md"
git -C "$repo" add README.md
git -C "$repo" commit -q -m "Add README"
git -C "$repo" push -q origin master
git -C "$repo" switch -q -c feature
printf 'feature work\n' > "$repo/feature.txt"
git -C "$repo" add feature.txt
git -C "$repo" commit -q -m "Add feature"
git -C "$repo" push -q --set-upstream origin feature
git -C "$repo" push -q origin
git --git-dir="$remote" for-each-ref --format='%(refname:short)' refs/heads | sort
適切なコマンドを選ぶ
| コマンド | ブランチの選択方法 | 確認すること |
|---|---|---|
git push origin master |
名前を指定したローカルブランチ master |
送信したいブランチが master であることを確認します。 |
push.default=simple の場合の git push origin |
追跡設定とブランチ名の確認を通過すれば、現在のブランチをその upstream へ送信 | upstream、ブランチ名の確認、設定モードを確認します。 |
push.default=matching の場合の git push origin |
origin に同名のブランチがあるローカルブランチすべて。複数のブランチが対象になることがあります。 |
プッシュ前に、リモートにある同名ブランチをすべて確認します。 |
特定のブランチを1つ選びたい場合は、ブランチ名を指定する形式を使います。ブランチ名を省略する形式は、push.default を確認してから使ってください。simple は現在のブランチを選び、その upstream との関係を確認します。一方、matching は名前に基づいて複数のブランチを選ぶことがあります。結果がはっきりしない場合は、プッシュする前に git branch --show-current で現在のブランチを、git branch -vv でブランチの追跡状態を、git config --get push.default でプッシュモードを確認してください。