Gitコマンド入門::clone(fetch,pull)「第四十三回」
みなさんこんにちは! 前回は、かなり長くなってしまいましたね。コマンド操作をしていても、私自身、やや混乱していましたよ~~ (^▽^;) とはいっても、こうなったら、トコトンやるしかありませんので、今回も引き続き学習して行きますね。
前回の記事は、こちら!
git本家本元の情報はこちらから!
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
久しぶりの作図ですけど、こういうことですね!
- git fetch で、リモートリポジトリから、ブランチを取得
- git merge origin/main ローカルにマージする。
- git pull は、fetch + merge の同時処理
早速!GitHubでファイルを追加して、コミット!
- Add file をクリックすると、ドロップリストが表示
- Create new file を選択
a.txt を追加して、テキスト編集は、add a.txt と入力
- ファイル名と、テキスト内容を入力する!
- 下にスクロールすると、以下のようになります!
Commit new file をクリック!
- コメント分は、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 |
- origin main <リモートリポジトリ mainブランチ>しっかり意識して置きましょう!
- remotes/origin/main 9a2a68d Create a.txt 新しいハッシュ値に更新!
- 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
- temp ブランチが選択されています。
- ハッシュ値も、9cbf01a ですね。
- 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 コマンド引数のポイント!
- origin/main ・・・は、リモート追跡ブランチを指す
- origin main ・・・は、リモートリポジトリのmainブランチを指す
git pull origin main は、fetch+mergeの合わせ技!
- git fetch origin main リモートリポジトリのmainブランチからコミット値を取得
- git merge origin/main リモート追跡ブランチとローカルブランチのマージ!
それでは、今回はここまで、お疲れ様でした!
-
.git の中のファイルを直接編集することは、基本、ご法度ですけど、まあ~、学習段階においては、なんでもあり! よろしければ、みなさんもお試しあれ~~! ↩︎
Discussion