🗝️

Gitコマンド入門::clone(fetch,pull,push,--set-upstream-to)「第四十五回」

2021/03/16に公開

みなさんこんちは! 前回は、リモート追跡ブランチをいろいろ変更しながら、push コマンドの省略形とフルコマンドを学習しましたが、いかがでしょうか? ついついうっかりして、GitHubのリモートリポジトリーに間違ってpushしてしまったら、そりゃ~ 一大事ですからね。まあ~、実際の開発や運用面において、mainブランチにpushすることができる人は、限られた人だけにすると思います。また、そういった間違いが起こらないように、git コマンドも仕様で対応していて、リモート追跡ブランチとローカルブランチが異なる場合の省略形、git push を実行した場合は、しっかり警告文も出ていましたね。 それでは、今日も引き続き、学習を進めて行きましょう!

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/931744e282399b

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

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

それでは今日も、学習用のテスト環境構築!

$ mkdir func0045 && cd $_
// フォルダー作成と移動を同時に実行、
// 第45回なので、func0045のと命名!

$ echo "0045 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/20210316.git
// リモートリポジトリーは、あらかじめ各自で作成してください。
// 今回私は、いつもの日付で作成しました。20210316.git

$ git push -u origin main:main
// 初回のみ、-u オプションを付けて実行すると、リモート追跡ブランチを作成
// -u = --set-upstream-to です。勿論二回目以降は、-u は不要。
// main:main は、<ローカルブランチ名>:<リモートブランチ名>


To https://github.com/shiozumi-makoto/20210316.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

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

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

前回の復習!

  1. git push -u origin main:main <ローカルブランチ名>:<リモートブランチ名>
  2. -u or --set-upstream-to リモート追跡ブランチの設定

今回の初期では、git push にて、main:main と指定、省略しないで、push してみましたよ! ということで、早速、main:temp を試してみましょう!

git push -u origin main:temp

$ git push -u origin main:temp

// 出力メッセージは、省略~

 * [new branch]      main -> temp
Branch 'main' set up to track remote branch 'temp' from 'origin'.
// 無事に、リモートtempブランチが作成
// ローカルmainブランチのリモート追跡ブランチは、
// origin/main から、origin/temp に切り替わりました。

$ git branch -avv
* main                3abef4b [origin/temp] 1st <!-- 変更された!
  remotes/origin/main 3abef4b 1st
  remotes/origin/temp 3abef4b 1st <!-- 追加されました!

リモートtempブランチの削除!

  1. git push --delete origin temp
  2. git push origin :temp

どちらのコマンドでも大丈夫ですから、まずは、リモートtempブランチ、origin temp を削除してみましょう! 前回もお伝えしましたが、origin temp と、origin/temp の違いは、しっかり意識して置きましょう!

$ git push origin :temp
// 出力メッセージは、省略~

 - [deleted]         temp  // <!-- 削除完了!

$ git branch -avv
* main                3abef4b [origin/temp: gone] 1st <!-- gone?
  remotes/origin/main 3abef4b 1st
// リモート追跡ブランチが削除されてしまうと、gone と表示されました。

ここで、ひとまず状態を確認!

  1. git config --list | grep branch.main
  2. ls -a .git/refs/heads/
$  git config --list | grep branch.main
branch.main.remote=origin
branch.main.merge=refs/heads/temp

$ ls -a .git/refs/heads/
.  ..  main
// ヘッダーブランチのファイル存在確認

$ cat .git/refs/heads/main
3abef4bdbbdb4455453d226965e7dd7b6cf771ef
// 念のため残ったHEAD,mainのハッシュ値の確認!

$ ls -a .git/refs/remotes/origin/
.  ..  main
// リモート追跡ブランチのファイル存在確認
// tempを削除したので、今は、mainしか残っていませんね。

$ cat .git/refs/remotes/origin/main
3abef4bdbbdb4455453d226965e7dd7b6cf771ef
// 念のため残ったorigin/mainのハッシュ値の確認も!

configファイル .git/configを、viで直接編集!

$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/shiozumi-makoto/20210316.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
        remote = origin
        merge = refs/heads/temp  <!-- ここを、tempから、mainに変更!
	
$ vi .git/config
// vi エディターを起動して、ファイル編集!
// merge = refs/heads/temp を、main に変更!
// Esc + wq で保存終了! 

refs/heads/temp -> refs/heads/main に修正!

HEAD,ヘッダーの参照先を、viなどのテキストエディターで、tempからmainに変更してください!

git config --list で確認!

$ git config --list | grep branch.main
branch.main.remote=origin
branch.main.merge=refs/heads/main
// config ファイルを直接編集して、
// refs/heads/temp から、refs/heads/main に切り替わりましたね!

$ git branch -avv
* main                3abef4b [origin/main] 1st
  remotes/origin/main 3abef4b 1st
// [origin/temp: gone] の gone の文字が消えました!

これで、無事修正できたようです。次は、コマンド操作で解決してみましょう!

どちらのコマンドでも可能です!

  1. git config branch.main.merge refs/heads/main
  2. git branch --set-upstream-to=origin/main
git config branch.main.merge refs/heads/temp
// まずは、tempに変更して!

$  git branch -avv
* main                3abef4b [origin/temp: gone] 1st
  remotes/origin/main 3abef4b 1st
// gone になりましたね!

$ git branch --set-upstream-to=origin/main
Branch 'main' set up to track remote branch 'main' from 'origin'.

$  git branch -avv
* main                3abef4b [origin/main] 1st
  remotes/origin/main 3abef4b 1st
// gone の文字が消えました!

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

$ git branch main --unset-upstream
$ git branch -avv
* main                3abef4b 1st <!-- [origin/main] が消えました!
  remotes/origin/main 3abef4b 1st

-u を着けずに! git push origin main:temp

$ git push origin main:temp
// 出力メッセージは、省略~

* main                3abef4b [origin/main] 1st <!-- 変わらずですね!
  remotes/origin/main 3abef4b 1st
  remotes/origin/temp 3abef4b 1st <!-- リモートtempブランチは作成されました!

そもそも、一番最初に、-u or --set-upstream-to を着けずに、リモートtempブランチを作成して置けば、git push --delete origin temp でも、こんなことにはならなかった訳ですが、いろいろと失敗したときのリカバリーを体験するためにも、このような内容にしています!

今回のまとめ

さあ、いかがでしょうか? リモート追跡ブランチについては、これでかなり理解も深まったと思います。.git/config ファイルを直接編集したり、.git/refs/remotes/origin/ フォルダーの中身を除けば、そこには、maim、tempファイルがあり、それは、そのままリモート追跡ブランチの設定ファイルなんですよね。勿論、ファイルの中身はハッシュ値です!(笑)

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

https://zenn.dev/shiozumi/articles/d19268dc797db7
https://twitter.com/esmile2013

Discussion