Gitコマンド入門::clone(fetch,pull,push,--set-upstream-to)「第四十五回」
みなさんこんちは! 前回は、リモート追跡ブランチをいろいろ変更しながら、push コマンドの省略形とフルコマンドを学習しましたが、いかがでしょうか? ついついうっかりして、GitHubのリモートリポジトリーに間違ってpushしてしまったら、そりゃ~ 一大事ですからね。まあ~、実際の開発や運用面において、mainブランチにpushすることができる人は、限られた人だけにすると思います。また、そういった間違いが起こらないように、git コマンドも仕様で対応していて、リモート追跡ブランチとローカルブランチが異なる場合の省略形、git push を実行した場合は、しっかり警告文も出ていましたね。 それでは、今日も引き続き、学習を進めて行きましょう!
前回の記事はこちらから!
git本家本元の情報はこちらから!
それでは今日も、学習用のテスト環境構築!
$ 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 ですね。
前回の復習!
- git push -u origin main:main <ローカルブランチ名>:<リモートブランチ名>
- -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ブランチの削除!
git push --delete origin temp
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 と表示されました。
ここで、ひとまず状態を確認!
git config --list | grep branch.main
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 の文字が消えました!
これで、無事修正できたようです。次は、コマンド操作で解決してみましょう!
どちらのコマンドでも可能です!
git config branch.main.merge refs/heads/main
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ファイルがあり、それは、そのままリモート追跡ブランチの設定ファイルなんですよね。勿論、ファイルの中身はハッシュ値です!(笑)
それでは、今回はここまで、お疲れ様でした!
Discussion