🗝️

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

2021/03/12に公開

みなさんこんにちは! 前回は、かなり長くなってしまいましたね。コマンド操作をしていても、私自身、やや混乱していましたよ~~ (^▽^;) とはいっても、こうなったら、トコトンやるしかありませんので、今回も引き続き学習して行きますね。

前回の記事は、こちら!

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

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

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

pull = fetch + merge の一括処理!

git pull は、git fetch + git merge の一括処理コマンドということなんですね。

復習も兼ねて、毎度の学習環境の構築!

$ mkdir func0043 && cd $_
// フォルダー作成と移動を同時に!
// 今回は、func0043 の名称で作成!

$ echo "0043 pull = fetch + merge" > README.md
// READMEの中身は、こんな感じで!

$ git init
Initialized empty Git repository in /home/shiozumi/mygit/func0043/.git/
// 毎度のイニシャル!

$ ls -a
.  ..  .git  README.md
// .git ディレクトリーと、README.md があれば、準備OK!

$ git add README.md
$ git commit -m "1st"
[master (root-commit) 9cbf01a] 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
// いつもの、add + commmit です!

$ git remote add origin https://github.com/shiozumi-makoto/20210313.git
// リモートリポジトリーは、あらかじめ各自で作成してください。
// 今回私は、いつもの日付で作成しました。20210313.git
// 尚、public で作成してありますので、環境作成を省く場合は、
// こちらから、git clone してください! 

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

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

Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 242 bytes | 242.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/20210313.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

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

$ git branch -a
* main
  remotes/origin/main
// ローカルブランチ main と、リモート追跡用のブランチ、
// remotes/origin/main の2つがあることを確認!

$ git branch -vv -a
* main 9cbf01a [origin/main] 1st
// 上記の一行で、ローカルブランチmainと、
// リモート追跡用のブランチ、remotes/origin/main 紐づけが完了です!

毎度のローカルリポジトリの初期ですが、今回は少しだけ理解を深めてみましょう!

main こちらは、ローカルブランチですけど、remotes/origin/main もローカルに存在するブランチです。最初は私もあまり意識していませんでした。又、remotes/origin/ブランチ名 と表示されているので、remotes の文字の意味を取り違えて、すっかり、GitHub上のリモートリポジトリのmainブランチだと思い込んでいましたが、どうやらローカルにあるブランチで、リモート追跡ブランチと呼ばれています。従って、ブランチは、3つ存在していますよ~

| main | remotes/origin/main | origin main |
| ---- | ---- | ---- |---- |
| ローカルmainブランチ | リモート追跡ブランチ | リモートのmainブランチ |
| 9cbf01a | 9cbf01a | 9cbf01a |

初期状態では、3つのハッシュ値が、全て同じですね。9cbf01a
origin/main は、リモート追跡ブランチ
origin main は、GitHub、リモートリポジトリにあるmainブランチ

ローカルのブランチ確認! ハッシュ値:9cbf01a

$ git branch -vv -a
* main                9cbf01a [origin/main] 1st
  remotes/origin/main 9cbf01a 1st

ローカルmainブランチ main > 9cbf01a
リモート追跡ブランチ remotes/origin/main > 9cbf01a

リモートのブランチ確認! ハッシュ値:9cbf01a

久しぶりの作図ですけど、こういうことですね!

  1. git fetch で、リモートリポジトリから、ブランチを取得
  2. git merge origin/main ローカルにマージする。
  3. git pull は、fetch + merge の同時処理

早速!GitHubでファイルを追加して、コミット!

  1. Add file をクリックすると、ドロップリストが表示
  2. Create new file を選択

a.txt を追加して、テキスト編集は、add a.txt と入力

  1. ファイル名と、テキスト内容を入力する!
  2. 下にスクロールすると、以下のようになります!

Commit new file をクリック!

  1. コメント分は、Create a.txt デフォルトのままです!

ハッシュ値を確認! 9a2a68d に変更されました。

main remotes/origin/main origin main
ローカルmainブランチ リモート追跡ブランチ リモートのmainブランチ
9cbf01a 9cbf01a 9a2a68d

git fetch origin main

$ git fetch origin main
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/shiozumi-makoto/20210312
 * branch            main       -> FETCH_HEAD
   9cbf01a..9a2a68d  main       -> origin/main

$ git branch -a -vv
* main                9cbf01a [origin/main: behind 1] 1st
  remotes/origin/main 9a2a68d Create a.txt

| main | remotes/origin/main | origin main |
| ---- | ---- | ---- |--- |
| ローカルmainブランチ | リモート追跡ブランチ | リモートのmainブランチ |
| 9cbf01a | 9a2a68d | 9a2a68d |

  1. origin main <リモートリポジトリ mainブランチ>しっかり意識して置きましょう!
  2. remotes/origin/main 9a2a68d Create a.txt 新しいハッシュ値に更新!
  3. main ブランチは、9cbf01a のままですね!

git merge origin/main

$ git merge origin/main
Updating 9cbf01a..9a2a68d
Fast-forward
 a.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

// 最新コミット値の確認 --> 9a2a68d
$ git log --oneline
9a2a68d (HEAD -> main, origin/main) Create a.txt
9cbf01a 1st

// ファイルの存在を確認!
$ ls
README.md  a.txt

// ファイルの中身確認!
$ cat a.txt
add a.txt

git branch -a -vv

$ git branch -a -vv
* main                9a2a68d [origin/main] Create a.txt
  remotes/origin/main 9a2a68d Create a.txt
main remotes/origin/main origin main
ローカルmainブランチ リモート追跡ブランチ リモートのmainブランチ
9a2a68d 9a2a68d 9a2a68d

最後に、git pull を実行して復習!

まずは、git checkout -b temp 9cbf01aで、1st コミットのハッシュ値、9cbf01a から、temp ブランチを作成します。

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

$ git branch -a -vv
  main                9a2a68d [origin/main] Create a.txt
* temp                9cbf01a 1st
  remotes/origin/main 9a2a68d Create a.txt
  1. temp ブランチが選択されています。
  2. ハッシュ値も、9cbf01a ですね。
  3. git checkout したので、tempブランチを既に選択した状態です!

あちゃ、remotes/origin/main のハッシュ値が、9a2a68dに更新されていますね。

$ cat .git/refs/remotes/origin/main
9a2a68de7a402c3f7000a521747174d17350866f
// 前回の git fetch を実行したので、すでに更新された状態です。

// 今回だけ特別、強引にファイルを編集します!(苦笑)
$ echo "9cbf01a5967c295f6037216590b5caa78982b9b9" > .git/refs/remotes/origin/main
$ git branch -a -vv
  main                9a2a68d [origin/main: ahead 1] Create a.txt
* temp                9cbf01a 1st
  remotes/origin/main 9cbf01a 1st <!-- ちゃんと戻りました!(笑)

git pull origin main 最終実行(笑)

$ git pull origin main
From https://github.com/shiozumi-makoto/20210313
 * branch            main       -> FETCH_HEAD
   9cbf01a..9a2a68d  main       -> origin/main
Updating 9cbf01a..9a2a68d
Fast-forward
 a.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

$ git branch -a -vv
  main                9a2a68d [origin/main] Create a.txt
* temp                9a2a68d Create a.txt
  remotes/origin/main 9a2a68d Create a.txt

$ git log --oneline
9a2a68d (HEAD -> temp, origin/main, main) Create a.txt
9cbf01a 1st
main temp remotes/origin/main origin main
ローカルmain ローカルtemp リモート追跡ブランチ リモートのmainブランチ
9a2a68d 9a2a68d 9a2a68d 9a2a68d

git diff main temp で、差分確認!

$ git diff main temp
$
// 差がないので、なにも表示されません!

git pull が、git fetch + git merge ということが証明されましたね!

今回のまとめ

みなさん、いかがでしたか? 今回も、やや長めになってしまいましたけど、git fetch や、git pull コマンドが、どんな動作をするのか、少しだけ理解も深まったと思います。
又、私も今回で認識した、remotes/origin/ブランチ名、リモート追跡ブランチの理解が抜けてしまうと、コマンド操作において、煩雑になってしまうことも感じましたね~

fetch,pull コマンド引数のポイント!

  1. origin/main ・・・は、リモート追跡ブランチを指す
  2. origin main ・・・は、リモートリポジトリのmainブランチを指す

git pull origin main は、fetch+mergeの合わせ技!

  1. git fetch origin main リモートリポジトリのmainブランチからコミット値を取得
  2. git merge origin/main リモート追跡ブランチとローカルブランチのマージ!

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

https://zenn.dev/shiozumi/articles/931744e282399b
https://twitter.com/esmile2013

脚注
  1. .git の中のファイルを直接編集することは、基本、ご法度ですけど、まあ~、学習段階においては、なんでもあり! よろしければ、みなさんもお試しあれ~~! ↩︎

Discussion