🗝️

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

2021/03/16に公開

みなさん、こんにちは! 前回はリモートtempブランチを作成し削除、それに伴ってリモート追跡ブランチが、gone となってしまうのを修正しましたね。恐らくこれで、ローカルブランチの作成、リモートブランチの作成、リモート追跡ブランチも編集可能となり、割と自由自在にブランチ周りの操作が出来るようになったことでしょう。ということで、今日も引き続き、コマンド操作をしながら、復習をしていきましょう!

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

https://zenn.dev/shiozumi/articles/1e689acef3d2dd

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

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

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

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

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

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

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

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

git checkout -b temp main

それでは今回は、正しくロ-カルのtempブランチを作成して、push しましょう!

$ git checkout -b temp main
Switched to a new branch 'temp'

$ git branch -avv
  main                1bd77d3 [origin/main] 1st
* temp                1bd77d3 1st
  remotes/origin/main 1bd77d3 1st

$ git push -u origin temp:temp
// -u = --set-upstream-to です。勿論二回目以降は、-u は不要。
// temp:temp は、<ローカルブランチ名>:<リモートブランチ名>

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

$ git branch -avv
  main                1bd77d3 [origin/main] 1st
* temp                1bd77d3 [origin/temp] 1st <!-- これが正統派!
  remotes/origin/main 1bd77d3 1st
  remotes/origin/temp 1bd77d3 1st

temp = [origin/temp] = remotes/origin/temp

まあ~いままでは、技とエラーを出すために、よじれた設定を試していましたけどね。本来なら、ローカルブランチ、リモート追跡ブランチ、リモートブランチの名前は、3つとも同じにするのが、標準的な使い方ですね。(笑)

今回は、4つのブランチを作成し、それぞれ、push!

$ git branch -avv
* main                  1bd77d3 [origin/main] 1st
  temp                  1bd77d3 [origin/temp] 1st
  temp_1                1bd77d3 [origin/temp_1] 1st
  temp_2                1bd77d3 [origin/temp_2] 1st
  remotes/origin/main   1bd77d3 1st
  remotes/origin/temp   1bd77d3 1st
  remotes/origin/temp_1 1bd77d3 1st
  remotes/origin/temp_2 1bd77d3 1st

そろそろ慣れてきたと思いますので、結果画面だけです。コマンドは、それぞれ各自、練習だと思って、がんばって自力で打ち込んでみましょう!

GitHub上で、いきなりリモートブランチを削除!

今回は、temp と、temp_2 を削除します! 右側の赤いゴミ箱アイコンをクリック!

クリック後は、こんな感じですね! この時点では、リストアー可能ですけど・・・

git fetch --prune

$ git fetch --prune
From https://github.com/shiozumi-makoto/20210316_2
 - [deleted]         (none)     -> origin/temp
 - [deleted]         (none)     -> origin/temp_2

$ git branch -avv
* main                  1bd77d3 [origin/main] 1st
  temp                  1bd77d3 [origin/temp: gone] 1st <!-- goneと表記
  temp_1                1bd77d3 [origin/temp_1] 1st
  temp_2                1bd77d3 [origin/temp_2: gone] 1st <!-- goneと表記
  remotes/origin/main   1bd77d3 1st
  remotes/origin/temp_1 1bd77d3 1st
// temp と、temp_2 が削除されました!

-p or --prune の引数を付けると、リモート追跡ブランチを削除します。

git branch -D で、ロカールブランチを一括削除

$ git branch --format "%(refname:short) %(upstream:track)" | grep "\[gone\]" | awk '{print $1}' | xargs -IXXX git branch -D XXX

Deleted branch temp (was 1bd77d3).
Deleted branch temp_2 (was 1bd77d3).

$ git branch -avv
* main                  1bd77d3 [origin/main] 1st
  temp_1                1bd77d3 [origin/temp_1] 1st
  remotes/origin/main   1bd77d3 1st
  remotes/origin/temp_1 1bd77d3 1st

これで、temp,temp_2のローカルブランチも一括削除されましたね。

まとめ

今回は、GitHub画面から、リモートブランチを削除しましたが、おそらく通常では、複数人数で開発していて、他の人のリモートブランチを取り入れて、それが削除されたときに、使うシーンとなりそうです。まあ、何はともあれ、git fetch で、最新のコミット値を取得して、git merge で、ブランチをマージするのが、fetch と、pull の日常的な使い方ですね。

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

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

Discussion