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

8 min read読了の目安(約7800字

みなさんこんにちは! 今日は、先日に引き続き、ローカルブランチ、リモートブランチをマージしながら、さらにブランチ整理整頓してみたいと思います。そして、clone 関連は、今回で、一応、最終回として置きますね。

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

https://zenn.dev/shiozumi/articles/a257df583f197a

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

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

git branch -avv 前回の環境を使いまわしま~す!

$ git branch -avv
  main                   1bd77d3 [origin/main] 1st
* temp_1                 37607ba [origin/temp_1: ahead 2] merge
  temp_2                 1bd77d3 [origin/temp_1] 1st
  remotes/Rep0045/main   3abef4b 1st
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 3abef4b 1st
  remotes/origin/main    1bd77d3 1st
  remotes/origin/temp_1  1bd77d3 1st

$ git remote -v
Rep0045 https://github.com/shiozumi-makoto/20210316.git (fetch)
Rep0045 https://github.com/shiozumi-makoto/20210316.git (push)
origin  https://github.com/shiozumi-makoto/20210316_2.git (fetch)
origin  https://github.com/shiozumi-makoto/20210316_2.git (push)

前回は、Rep0045 リポジトリーのリモートtemp_1ブランチと、ローカルのtemp_1を、マージしまいたね。temp_1の最新コミットのハッシュ値は、37607ba となりました。又、先祖の異なるブランチ同士を、--allow-unrelated-histories のオプションスイッチを付けて、強制的にマージしましたね。

origin = https://github.com/shiozumi-makoto/20210316_2.git
Rep0045 = https://github.com/shiozumi-makoto/20210316.git
それぞれのエイリアス設定は、GitHubのリモートリポジトリのアドレスが登録されてます。

git log temp_1 --oneline --graph

$ git log temp_1 --oneline --graph
*   37607ba (HEAD -> temp_1) merge
|\
| * 3abef4b (Rep0045/temp_1, Rep0045/temp, Rep0045/main) 1st
* 1bd77d3 (origin/temp_1, origin/main, temp_2, main) 1st

ということで、まずは、さっそく、temp_1 を、push してみましょう!
gitコマンドは、git push origin temp_1:temp_1 省略なしのフルコマンドで!

git push origin temp_1:temp_1

$ git push origin temp_1:temp_1

// 中略~

To https://github.com/shiozumi-makoto/20210316_2.git
   1bd77d3..37607ba  temp_1 -> temp_1

$ git branch -avv
  main                   1bd77d3 [origin/main] 1st
* temp_1                 37607ba [origin/temp_1] merge
  temp_2                 1bd77d3 [origin/temp_1: behind 2] 1st
  remotes/Rep0045/main   3abef4b 1st
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 3abef4b 1st
  remotes/origin/main    1bd77d3 1st
  remotes/origin/temp_1  37607ba merge // <!-- temp_1 と同じハッシュ値!!!

次は、Rep0045 の temp_1 に push してみましょう!
gitコマンドは、git push Rep0045 temp_1:temp_1 省略なしのフルコマンドで!

git push Rep0045 temp_1:temp_1

$ git push Rep0045 temp_1:temp_1

// 中略~
  
To https://github.com/shiozumi-makoto/20210316.git
   1bd77d3..37607ba  temp_1 -> temp_1

$ git branch -avv
  main                   1bd77d3 [origin/main] 1st
* temp_1                 37607ba [origin/temp_1] merge
  temp_2                 1bd77d3 [origin/temp_1: behind 2] 1st
  remotes/Rep0045/main   3abef4b 1st
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 37607ba merge // <!-- temp_1 と同じハッシュ値!!!
  remotes/origin/main    1bd77d3 1st
  remotes/origin/temp_1  37607ba merge // <!-- temp_1 更新済

これで、Rep0045リポジトリのリモートtemp_1ブランチも更新されました!

次は、Rep0045 の main に push してみましょう!
gitコマンドは、git push Rep0045 temp_1:main 省略なしのフルコマンドで!

$ git push Rep0045 temp_1:main

// 中略~

To https://github.com/shiozumi-makoto/20210316.git
   3abef4b..37607ba  temp_1 -> main

$ git branch -avv
  main                   1bd77d3 [origin/main] 1st
* temp_1                 37607ba [origin/temp_1] merge
  temp_2                 1bd77d3 [origin/temp_1: behind 2] 1st
  remotes/Rep0045/main   37607ba merge // <!-- temp_1 と同じハッシュ値!!!
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 37607ba merge // <!-- temp_1 更新済
  remotes/origin/main    1bd77d3 1st
  remotes/origin/temp_1  37607ba merge // <!-- temp_1 更新済

これで、Rep0045リポジトリのリモートmainブランチも更新されました!

次は、origin の main に push してみましょう!
gitコマンドは、git push origin temp_1:main 省略なしのフルコマンドで!

$ git push origin temp_1:main

// 中略~

To https://github.com/shiozumi-makoto/20210316_2.git
   1bd77d3..37607ba  temp_1 -> main

$ git branch -avv
  main                   1bd77d3 [origin/main: behind 2] 1st
* temp_1                 37607ba [origin/temp_1] merge
  temp_2                 1bd77d3 [origin/temp_1: behind 2] 1st
  remotes/Rep0045/main   37607ba merge // <!-- temp_1 更新済
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 37607ba merge // <!-- temp_1 更新済
  remotes/origin/main    37607ba merge // <!-- temp_1 と同じハッシュ値!!!
  remotes/origin/temp_1  37607ba merge // <!-- temp_1 更新済

これで、originリポジトリのリモートmainブランチも更新されました!

次は、ローカルmainブランチを、origin の main に push してみましょう!
gitコマンドは、git push origin main:main 省略なしのフルコマンドで!

$ git push origin main:main

 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/shiozumi-makoto/20210316_2.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

はい! しっかりエラーになりましたね。先ほど、ロカールtemp_1ブランチを、origin main に、push しましたから、[origin/main: behind 2] となり、基本、先祖返りは出来ません。

main 1bd77d3 [origin/main: behind 2] 1st

ということで、ローカルmainブランチに、リモートリポジトリoriginのリモートmainブランチから、 pull してみましょう!
gitコマンドは、git pull origin main:main 省略なしのフルコマンドで!

git pull origin main:main

git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

git pull origin main:main
From https://github.com/shiozumi-makoto/20210316_2
 * branch            main       -> FETCH_HEAD
Updating 1bd77d3..37607ba
Fast-forward

$ git branch -avv
* main                   37607ba [origin/main] merge <!-- behind 2が消えました! 
  temp_1                 37607ba [origin/temp_1] merge
  temp_2                 1bd77d3 [origin/temp_1: behind 2] 1st
  remotes/Rep0045/main   37607ba merge
  remotes/Rep0045/temp   3abef4b 1st
  remotes/Rep0045/temp_1 37607ba merge
  remotes/origin/main    37607ba merge
  remotes/origin/temp_1  37607ba merge

これで無事に、ローカルmainブランチも、マージできましたね。
尚、git pull origin main:main のフルコマンドは、origin main の部分が、リモートリポジトリoriginのリモートリmainブランチを指していて、:main は、ローカルmainブランチとなります。従って、:main を、:temp_3 などに設定すると、新しくローカルtemp_3ブランチを作成してくれますよ!

では、最後に大掃除!(笑)

まずは、Rep0045 のリモートブランチを削除してします!

git push Rep0045 :main :temp :temp_1

To https://github.com/shiozumi-makoto/20210316.git
 - [deleted]         temp
 - [deleted]         temp_1
 ! [remote rejected] main (refusing to delete the current branch: refs/heads/main)
error: failed to push some refs to 'https://github.com/shiozumi-makoto/20210316.git'

さすがに、mainは消去できませんでしたね。(苦笑)
ということで、のこりは、origin temp_1 を削除!

git push origin :temp_1

Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
To https://github.com/shiozumi-makoto/20210316_2.git
 - [deleted]         temp_1

そして、次は、Rep0045 のエイリアス解除します!

git remote remove Rep0045

$ git remote remove Rep0045
$ git remote -v
origin  https://github.com/shiozumi-makoto/20210316_2.git (fetch)
origin  https://github.com/shiozumi-makoto/20210316_2.git (push)

$ git branch -avv
* main                37607ba [origin/main] merge
  temp_1              37607ba [origin/temp_1: gone] merge
  temp_2              1bd77d3 [origin/temp_1: gone] 1st
  remotes/origin/main 37607ba merge

これで、後は、gone となっているローカルtemp_1,temp_2ブランチを削除して完了!

git branch -D temp_1 temp_2

$ git branch -D temp_1 temp_2
Deleted branch temp_1 (was 37607ba).
Deleted branch temp_2 (was 1bd77d3).

$ git branch -avv
* main                37607ba [origin/main] merge
  remotes/origin/main 37607ba merge

さあ、ここまで、いかがでしょうか? こういった、ちょっと勇気のいるコマンドは、適当なテスト用のリポジトリを作成して、そこでいろいろ試すぐらいなら、いくらでもできますけど、いざ、本番になると、、、結構、緊張するものです。とはとはいうものの、複数人数で開発することになると思いますので、マメに、git pull しているならば、だれかのパソコンには、最新のリポジトリも残っていると思いますよ~(笑)

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

https://zenn.dev/shiozumi/articles/462cb3430dfa19
https://twitter.com/esmile2013