Githubでレポジトリを作成するとコードの中に「git push -u origin main
」があります。
「git push origin main
」は良く使うし、やっていることの意味もわかる。でもオプションの「-u」って何?という方もいるかと思います。
ここでは、git push
のオプション「-u」が何をしているかについて実例でまとめています。
git pushの使い方
git pushの使い方と処理内容
初めにgit pushについて簡単におさらいしておきます。そんなの知ってるよという人は読み飛ばしてください。
git push
はローカルレポジトリのGitのコード履歴をリモートレポジトリ(Github)にプッシュする処理です。
リモートレポジトリ(Github)
↑ push ← ココ
ローカルレポジトリ
↑ commit
ステージ(インデックス)
↑ add
作業中のディレクトリ
git pushは最も頻繁に使用するコードの一つです。
git pushは以下のように使います。
git push [オプション] <リモートレポジトリ名> <ブランチ名>
ブランチ名の省略
git push origin main
という記述はよく使いますが、一つ知っておくべき重要なことがあります。それはブランチ名が省略されているということです。
git pushは本来次のように使います。
$ git push <リモートレポジトリ名> <ローカルブランチ名>:<プッシュ先のリモートレポジトリ名>
ブランチ名はローカルレポジトリのブランチ名と、push先のリモートレポジトリ名を記述します。
ローカルレポジトリのブランチ名と、push先のリモートレポジトリ名が同じ場合に、「:リモートレポジトリ名」の記述を省略することができます。
git push origin main
↓↑ 同じ
git push origin main:main
仮に、ローカルレポジトリのmainブランチの内容を、リモートレポジトリのtestブランチに送りたい場合は以下のように記述します。
git push origin master:test
「-u」オプションとは何か?
「-u」は、指定したリモートレポジトリのブランチを上流ブランチ(upstream)として設定するオプションです。
上流ブランチとして設定すると、git push するときにリモートレポジトリ名とブランチ名を省略できます。
すなわちgit push
だけでプッシュできるようになるということです。
コードの実行例
「-u」つきのgit push -u origin main
を実行すると以下のようになります。
$ git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 228 bytes | 228.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/〜/レポジトリ名.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
*[new branch] main -> mainとは?
ローカルブランチmainのデータを、リモートブランチmainにプッシュしていることを示しています。
その際、リモートブランチに新たにブランチを作成してことを明示しています。
Branch ‘main’ set up to track remote branch ‘main’ from ‘origin’.
「Branch ‘main’ set up to track remote branch ‘main’ from ‘origin’.」が「-u」オプションを追加したことで実行された内容です。
ローカルレポジトリのmainブランチに、リモートレポジトリ名originのmainブランチを上流ブランチとしてセットしたことを示してます。
上流ブランチがある場合とない場合のpushの違い
上流ブランチを指定していない場合はpushは以下のようになります。
git push <リモートレポジトリ名> <ブランチ名>
↓ 上流ブランチが設定してある場合
git push
コードがかなりシンプルになることがわかります。
コードの実行例
上流ブランチが設定してあるローカルレポジトリのブランチでgit push を実行するとプッシュが行われます。
$ git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 545 bytes | 545.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (4/4), completed with 4 local objects.
To https://github.com/xxxx/リモートレポジトリ名.git
b80abcb..0adba46 main -> main
上流ブランチの確認方法
上流ブランチが設定してあるかどうかはgit branch -vv
コマンドを実行することで確認できます。
#上流ブランチがない場合
$ git branch -vv
* main dc53f35 first commit
#上流ブランチある場合
$ git branch -vv
* main dc53f35 [origin/main] first commit
上流ブランチがある場合は、[リモートレポジトリ名/リモートレポジトリのブランチ名] が表示されます。
よって、このローカルレポジトリのmainブランチでgit push
を実行すると、リモートレポジトリ名originのmainブランチにpushを行います。
なお、ブランチ名の横の 数値(例 dc54f35)は最新のコミット番号、末尾の「first commit」はコミットメッセージです。
-uと--set-upstreamの違い
「-u」オプションと同じ処理をするものに「
」があります。--set-upstream
「-u」オプションは 「
」 の省略表記です。--set-upstream
オプションの前にハイフンが2つ「--
」つくものをロングオプションと呼びます。冗長な書き方でオプションの実行内容が記載されている場合がほとんどです。
オプションの前にハイフンが1つ「-」つくものをショートオプションと呼びます。ハイフンの後にアルファベット1文字が続く、省略形の記述方法です。
git push -u origin main
↓↑ 同じ
git push --set-upstream origin main
同じ処理でも人によってショートオプションとロングオプションのどちらを使うかが分かれたりしますが、驚く必要はありません。焦らず行きましょう。
上流ブランチの設定方法
なお、上流ブランチは、git pull, git fetch, git push, git branchなどのコマンドでも設定可能です。
コマンドのオプション以外にも、コマンドでconfigファイルに追記したり、configファイル自体を書き換えする方法もあります。
オプションで指定する方法
--set-upstream
オプション
pull, fetch, pushのいずれでも使用可能です。
・git pull --set-upstream <リモートレポジトリ名> <リモートのブランチ名>
・git fetch --set-upstream <リモートレポジトリ名> <リモートのブランチ名>
・git push --set-upstream <リモートレポジトリ名> <リモートのブランチ名>
-uオプション(git pushのみ)
git pushのみショートオプションの「-u」が使えます。
git push -u <リモートレポジトリ名> <リモートのブランチ名>
--set-upstream-to
オプション(git pushのみ)
git branchコマンドにも上流ブランチを設定するコマンドがあります。
設定ファイルを編集する方法(コマンドで.git/configファイルに追記)
configファイルに追記する場合は、対象のリモートブランチの(1)remote、(2)mergeの2つの値を設定する必要があります。
(1) $ git config branch.<ローカルブランチ名>.remote <リモートブランチ名>
(2)$ git config branch.<ローカルブランチ名>.merge refs/heads/<リモートブランチ名>
実例
$ git config branch.topic.remote origin
$ git config branch.topic.merge refs/heads/master
configファイルの確認
#configファイルの中身を見る
cat .git/config
エディタでファイルの中身を見ると以下のようにtopicブランチに対して、上流となる、リモートレポジトリ名とブランチ名が登録されていることがわかります。
[branch "topic"]
remote = origin
merge = refs/heads/master
設定ファイルを直接編集する方法(.git/configファイルに追記)
configファイルの中身を直接編集することもできます。
#エディタで開く
vim .git/config
vimエディタが起動するので、以下のように追加すれば完了です。
[branch "ローカルのブランチ名"]
remote = リモートレポジトリ名
merge = refs/heads/リモートのブランチ名
上流ブランチを活用するコマンド
現在のローカルブランチに上流ブランチの設定ができれば、git pull, fetch, push時に引数を省略して実行することができます。
使うときは、どのブランチでコマンドを実行しているかに注意してください。