🗝️

Gitコマンド入門::clone(fetch,pull)「第四十四回」

8 min read

みなさん、こんにちは! 今日も前回からの引き続きで、clone, fetch, pull を、学習していきますね。今回は、リモート追跡リポジトリの設定を変えながら、git push , --set-upstream-to アップストリームブランチの設定コマンドなどに挑戦です!

前回の記事は、こちら!

https://zenn.dev/shiozumi/articles/9a4af51632798d

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

毎度の環境構築。GitHubのリモートリポジトリーは、先に作成して置きましょう![1]

$ mkdir func0044 && cd $_
// フォルダー作成と移動を同時に実行、func0044の名称を指定!

$ echo "0044 pull push" > README.md
// READMEの中身は、こんな感じで!

$ git init
// 毎度のイニシャル!

git add README.md
git commit -m "1st"
// いつもの、add + commmit です!

git branch -M main
// ブランチ名を、master から、main に変更

git remote add origin https://github.com/shiozumi-makoto/20210315.git
// リモートリポジトリーは、あらかじめ各自で作成してください。
// 今回私は、いつもの日付で作成しました。20210315.git

$ git push -u origin main
// 初回だけ、-u オプションを付けて実行ですね。
//二回目以降は、-u は不要です!

$ git log  --oneline
0b248f4 (HEAD -> main, origin/main) 1st
// コミットのハッシュ値は、ba23c8a
// HEAD、mainブランチ、origin/main 追跡ブランチ、
// 3つとも同じハッシュ値、ba23c8a ですね。

$ git branch -vv -a
* main                0b248f4 [origin/main] 1st
  remotes/origin/main 0b248f4 1st
// ローカルブランチmainと、リモート追跡用のブランチ
// remotes/origin/main との紐づけが確認できました!

git branch temp main ブランチ作成!

まずは、最初の第一歩、ローカルブランチを作成して、GitHubのリモートリポジトリにpushしてみましょう!

$ git branch temp main
// ローカルのmainから、tempブランチを作成しました。
// origin/mainと、main の差も、しっかり意識して置きましょう!

$ git branch -vv -a
* main                0b248f4 [origin/main] 1st
  temp                0b248f4 1st
  remotes/origin/main 0b248f4 1st
// temp が無事作成できました。ハッシュ値が同じです!

git push -u origin temp リモートへpush!

$ git push -u origin temp
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'temp' on GitHub by visiting:
remote:      https://github.com/shiozumi-makoto/20210315/pull/new/temp
remote:
To https://github.com/shiozumi-makoto/20210315.git
 * [new branch]      temp -> temp
Branch 'temp' set up to track remote branch 'temp' from 'origin'.

$ git branch -vv -a
* main                0b248f4 [origin/main] 1st
  temp                0b248f4 [origin/temp] 1st
  remotes/origin/main 0b248f4 1st
  remotes/origin/temp 0b248f4 1st
// ローカルブランチtempと、リモート追跡用のブランチ
// remotes/origin/temp との紐づけが確認できました!
  1. ローカルのmainブランチから、tempブランチを作成
  2. tempブランチを、リモートリポジトリーにpush

ここまでは、特に問題がないと思いますので、次は、リモートのmainから、ブランチを作成してみましょう!

git branch temp_1 origin/main

$ git branch temp_1 origin/main
Branch 'temp_1' set up to track remote branch 'main' from 'origin'.
$ git branch -vv -a
* main                ba23c8a [origin/main] 1st
  temp                ba23c8a [origin/temp] 1st
  temp_1              ba23c8a [origin/main] 1st <!-- 追加箇所!
  remotes/origin/main ba23c8a 1st
  remotes/origin/temp ba23c8a 1st

さあ、どうでしょうか? temp_1 ba23c8a [origin/main] 1st が追加されましたね!
そして、今度はなんと、temp_1 と、origin/main が紐づけされています。このまま、push すると、GitHubのリモートリポジトリーのmainが更新されるのかな? それとも、リモートリポジトリーのtemp_1 のどちらになるのか、ちょっと試したくなりますね。

git push origin temp_1

$ git switch temp_1

$ git branch -a
  main
  temp
* temp_1 <!-- temp_1 のブランチに切り替えて!
  remotes/origin/main
  remotes/origin/temp
  
$ echo "git push origin temp_1" > temp_1.txt
$ git add temp_1.txt
$ git commit -m "add temp_1.txt"
[temp_1 e56bb8b] add temp_1.txt
 1 file changed, 1 insertion(+)
 create mode 100644 temp_1.txt
 
$ git push origin temp_1
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'temp_1' on GitHub by visiting:
remote:      https://github.com/shiozumi-makoto/20210315/pull/new/temp_1
remote:
To https://github.com/shiozumi-makoto/20210315.git
 * [new branch]      temp_1 -> temp_1

$ git branch -a -vv
  main                  0b248f4 [origin/main] 1st
  temp                  0b248f4 [origin/temp] 1st
* temp_1                e56bb8b [origin/main: ahead 1] add temp_1.txt
  remotes/origin/main   0b248f4 1st
  remotes/origin/temp   0b248f4 1st
  remotes/origin/temp_1 e56bb8b add temp_1.txt
// ローカルブランチのtemp_1のハッシュ値 e56bb8b の更新先は、
// リモートブランチのtemp_1となりましたね。

ローカルブランチのtemp_1のハッシュ値 e56bb8b の更新先は、origin/temp_1 でしたね。
どうやら想定していたのとは、異なった動作となりました。

git push の省略形 or フルコマンドは?

git pushのフルコマンドは、git push origin ローカルブランチ名:リモートブランチ名
従って以下のようになります。3つ設定してみましょう!

  1. origin ・・・ git remote add で設定したGitのリポジトリ名
  2. ローカルブランチ名 ・・・転送元のローカルブランチ名
  3. リモートブランチ名 ・・・転送先のリモートブランチ名
origin ローカルブランチ リモートブランチ 補足
origin temp_1 main ローカルtemp_1 から、リモートmain
origin temp_1 省略 ローカルtemp_1 から、リモートtemp_1
origin ---- ---- ローカルtemp_1 から、リモートtemp_1

git push origin temp_1:main を実行!


$ git push origin temp_1:main
// 出力メッセージは中略~

$ git branch -a -vv
  main                  0b248f4 [origin/main] 1st
  temp                  0b248f4 [origin/temp] 1st
* temp_1                e56bb8b [origin/main] add temp_1.txt
  remotes/origin/main   e56bb8b add temp_1.txt <!-- 成功!
  remotes/origin/temp   0b248f4 1st
  remotes/origin/temp_1 e56bb8b add temp_1.txt
// リモートブランチのmainも、e56bb8bとなりましたね。

ローカルブランチのtemp_1のハッシュ値 e56bb8b の更新先は、無事、origin/main となりました。これで目的通りになりました。では、最後に完全省略形で、git push を実行してみましょう!

git push 完全省略形!

$ git push 

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:main

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.

Google翻訳
致命的:現在のブランチのアップストリームブランチが一致しません
現在のブランチの名前。 アップストリームブランチにプッシュするには
リモートでは、

 git push origin HEAD:main

リモートで同じ名前のブランチにプッシュするには、次を使用します。

 git push origin HEAD

なるほど、エラーとなりましたが、そういう事なんですね。ローカルブラントと、リモートブランチの名前が異なるときは、間違った操作を実行しないように、コマンド動作の仕様が決まっていましたね。

  1. git push origin HEAD:main ここでのHEADは、ローカルのtemp_1ブランチ!
  2. git push origin HEAD mainを省略すると、リモートブランチもtemp_1になる。

それでは、今回の最後の最後に、リモート追跡ブランチも、ローカルブランチ名に合わせて、みましょう。git branch temp_1 -u origin/temp_1

アップストリームブランチの設定コマンド

  1. git branch ローカルブランチ名 --set-upstream-to origin/ブランチ名
  2. git branch ローカルブランチ名 -u origin/ブランチ名
  3. git config branch.temp_1.merge refs/heads/temp_1 と、git config branch.temp_1.remote origin の2つを実行
  4. git push -u origin temp_1

追跡を中止するときは、git branch temp_1 --unset-upstream となります。

git branch temp_1 -u origin/temp_1

$ git branch temp_1 -u origin/temp_1
Branch 'temp_1' set up to track remote branch 'temp_1' from 'origin'.

$ git status
On branch temp_1
Your branch is up to date with 'origin/temp_1'.
// origin/temp_1 となりましたね。

$ git branch -avv
  main                  0b248f4 [origin/main] 1st
  temp                  0b248f4 [origin/temp] 1st
* temp_1                e56bb8b [origin/temp_1] add temp_1.txt
// origin/temp_1 となりましたね。
// 以下、省略

git push ※temp_1ブランチを選択した状態で!

$ git push
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Everything up-to-date
// 既に更新済なので、結果はこのように!

今度は、エラーも出ませんね。そして、既に最初にpushしましたから、ハッシュ値も同じで、e56bb8b ですから、Everything up-to-date ですね!

今回のまとめ

さあ、みなさんどうでしたか? 私もついついミスをしてしまいますけど、コマンドの省略形には気を付けないと、理解も浅くなってしまいますね。前回からの続きとして、リモート追跡リポジトリの役目は、ローカルブランチとリモートブランチの紐づけ関連付けです。尚、自由に変更できますので、pull時とpush時のリモートリポジトリーとローカルリポジトリを一致させないことも可能です。実際の運用面に置いて、どう使い分けるのかは解りませんけどね。(苦笑)

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/1e689acef3d2dd
https://twitter.com/esmile2013
脚注
  1. 第一回をご覧ください。https://zenn.dev/shiozumi/articles/b682aef41e8d8a ↩︎

Discussion

ログインするとコメントできます