🗝️

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

2021/03/11に公開

みなさんこんにちは、今日からは、checkoutから、cloneにタイトルが変わりましたけど、基本的にはブランチ関連の操作を学習して行きたいと思います。
GitHubのリモートリポジトリと、ローカルリポジトリとのマージ方法も、私自身がまだまだ経験不足で申し訳ないと重いのですが、こうやって私と一緒に学んでいただき、少しでもお役に立てれば幸いです!

前回の記事は、こちら!

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

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

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

git fetch と git pull の違い!

まずは、私もしっかり理解していませんでしたが、fetch は、リモートリポジトリの最新情報を取得する動作ですね。pull は、fetch を実行してから、リモートリポジトリの内容を実際にダウンロードして、ローカルのリポジトリにマージするところまで行います。従って自分のローカルリポジトリを更新している場合は、マージコンフィクトが起こる可能性があります。

まずは、いつもの環境作りから! その前に、GitHubサイトにて、リモートリポジトリを、各自で作成して置いてくださいね。

$ echo "git clone fetch pull" > README.md
$ git init
Initialized empty Git repository in /home/shiozumi/mygit/temp0042/.git/
// これで、.git フォルダが作成されます!

$ git add README.md
$ git commit -m "1st"
[master (root-commit) d7d9b7f] 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
// add して、commit 

$ git branch -M main // <!-- master から、mainにブランチ名を変更!
$ git remote add origin https://github.com/shiozumi-makoto/20210311.git
// shiozumi-makoto/20210311.git この部分は、
// 各自が、GitHubサイトで作成した、リモートリポジトリとなります。
// <user-name>/リポジトリ名.git

$ git push -u origin main
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), 235 bytes | 235.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/20210311.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

// これで、無事にpush完了です!
// push -u オプションは、しっかり覚えて置きましょう!

// コミットは、1st のみですね。
$ git log
commit d7d9b7fe91d5357c2273b3637654605513d7e25c (HEAD -> main, origin/main)
Author: Makoto Shiozumi <shiozumi@esmile-hd.com>
Date:   Thu Mar 11 08:24:11 2021 +0900

    1st

// ローカルブランチは、main、リモートブランチは、origin/main となります。
$ git branch -a
* main
  remotes/origin/main

次は、subブランチを作成して、push します!

// 次に、sub ブランチを、mainから作成
$ git branch sub
$ git branch -a
* main
  sub
  remotes/origin/main

// コミット値は、まだ同じですね。当然ですけど・・・(笑)
$ git branch -v
* main d7d9b7f 1st
  sub  d7d9b7f 1st

// sub ブランチに切り替えて!
$ git switch sub
Switched to branch 'sub'

// sub.txtを追加して、add,commit します!
$ echo "sub.txt" > sub.txt
$ git add sub.txt
$ git commit -m "2nd add sub.txt"
[sub 73c2e50] 2nd add sub.txt
 1 file changed, 1 insertion(+)
 create mode 100644 sub.txt
 
$ git push -u origin sub
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 292 bytes | 292.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'sub' on GitHub by visiting:
remote:      https://github.com/shiozumi-makoto/20210311/pull/new/sub
remote:
To https://github.com/shiozumi-makoto/20210311.git
 * [new branch]      sub -> sub
Branch 'sub' set up to track remote branch 'sub' from 'origin'.

// これで、subブランチも、GitHubにpushされました!

もう一度、mainブランチに戻って、main.txt を追加して、2度目の、push を実行します。

// もう一度、mainブランチに戻り、main.txtを追加!
$ git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

$ echo "main.txt" > main.txt
$ git add main.txt
$ git commit -m "2nd add main.txt"

[main c4ebd4f] 2nd add main.txt
 1 file changed, 1 insertion(+)
 create mode 100644 main.txt

$ git push origin main // <!-- 今度は、-u 無しでOKです!
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 298 bytes | 298.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/20210311.git
   d7d9b7f..c4ebd4f  main -> main

では、現在のブランチ状態の最終確認です!

// ブランチの確認 その1
$ git branch -a
* main
  sub
  remotes/origin/main
  remotes/origin/sub

// ブランチの確認 その2
$ git branch -vv
* main c4ebd4f [origin/main] 2nd add main.txt
  sub  73c2e50 [origin/sub] 2nd add sub.txt

// mainブランチのlogを確認
$ git log --oneline main
c4ebd4f (HEAD -> main, origin/main) 2nd add main.txt
d7d9b7f 1st

// subブランチのlogを確認
$ git log --oneline sub
73c2e50 (origin/sub, sub) 2nd add sub.txt
d7d9b7f 1st

// リモートリポジトリと、origin のエイリアス確認
$ git remote -v
origin  https://github.com/shiozumi-makoto/20210311.git (fetch)
origin  https://github.com/shiozumi-makoto/20210311.git (push)
  1. 1st コミットは、main,sub ブランチともに同じですね。d7d9b7f 1st
  2. 2nd コミットは、main では、"2nd add main.txt" subは、"2nd add sub.txt"
  3. branch -vv オプションでは、ローカルとリモートの紐づけ、関連付けを確認
  4. remote -v では、origin のエイリアスを確認できます。勿論、origin 以外に設定することも可能ですよ![1]

更に、タグも付け加えます。git tag

$ git tag
$
// 一覧表示しても、当然、まだ何もありませんね。

$ git tag v.0042 -m "2021/03/11 0042"

$ git tag
v.0042
// これで、v.0042が作成されました!

// リモートリポジトリに、push します!
$ git push origin v.0042
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 169 bytes | 169.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/20210311.git
 * [new tag]         v.0042 -> v.0042
// これで、無事完了ですね。

ここまで、かなり長くなってしまいましたけど、慣れていない方は、是非、コマンドの理解を深めるためにも、自分で打ち込んでください!

GitHubの画面は、こんな感じです!

  1. main,sub ブランチがあります!
  2. tag も、一つありますね!

Tagをクリックして詳細を確認!

コミットのハッシュ値、c4ebd4f を確認して置きましょう!

では、ほんとの最終確認!(笑)

$ git log main --oneline
c4ebd4f (HEAD -> main, tag: v.0042, origin/main) 2nd add main.txt
d7d9b7f 1st

$ git log sub --oneline
73c2e50 (origin/sub, sub) 2nd add sub.txt
d7d9b7f 1st
  1. c4ebd4f のコミットと、tag: v.0042 が一致しています。
  2. GitHubのタグページの画像でも、同じように、c4ebd4f のコミット値が確認できます。

これで無事にタグも追加されましたね! 今回は、subブランチにタグを追加していませんが、お好みで、ご自由にどうぞ追加してください。

では、git clone を、タグ付きで実行!

$ git clone https://github.com/shiozumi-makoto/20210311.git -b v.0042
Cloning into '20210311'...

// ~ 以下、中略(いろいろメッセージが出ま~す!)

// 20210311 フォルダーが作成されます!
$ ls -a
.  ..  .git 20210311  README.md  main.txt

$ ls -a 20210311/
.  ..  .git  README.md  main.txt

// 20210311 に移動して!
$ cd 20210311

$ git branch -a
* (no branch)
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sub

// * (no branch) となっていますので、main ブランチを作成
$ git switch -c main
   
$ git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sub

// 無事、mainブランチが出来ました!

前回学習した、git checkout -b sub origin/sub

$ git checkout -b sub origin/sub
Branch 'sub' set up to track remote branch 'sub' from 'origin'.
Switched to a new branch 'sub'

$ git branch -a
  main
* sub // <!-- これで無事、subも取得できました!
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sub
 
$ git switch main

$ git branch -vv
* main c4ebd4f [origin/main] 2nd add main.txt
  sub  73c2e50 [origin/sub] 2nd add sub.txt

これで、無事、main,sub 両方のブランチを、GitHubのリモートリポジトリから取得できましたね。それでは、また、最初の環境に戻って、何かコミットを更新してみましょう!

ちなみに私の環境は、こんな感じです!

$ cd ..

$ ls -a
.  ..  .git  20210311  README.md  main.txt  
  1. 初期環境を作成したフォルダで、git clone を実行したので、そのなかに、20210311 フォルダーが作成されてしまいました。(苦笑)

git status で確認すると、、、あちゃ><;;

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        20210311/

// Untracked files: で、20210311を追跡し始めますね。><;;
nothing added to commit but untracked files present (use "git add" to track)

こんなときに、追跡させたくないファイルを登録できる機能があるんですよね。
.gitignore ファイルにファイル名やフォルダー名を追記すると無視されます。

$ echo "20210311" > .gitignore

$ ls -a
.  ..  .git  .gitignore  20210311 README.md  main.txt  
// はい、できました!

$ git status -s
?? .gitignore
// <!-- なんと、設定ファイルそのものが、今度は追跡されましたね。(爆笑)

でも、本来なら、これでOKです。というのも追跡を除外するファイルリストも、本来ならリポジトリに含めて置くのが筋ですからね。では、これを学習の教材に流用しましょう!

では、.gitignore を、add,commit,push します!

$ git add . // <!-- ピリオドは、ファイル全てを、add します!

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitignore
	
// new file に、追跡されました!

$ git commit -m "3rd add .gitignore"
[main 6ab4753] 3rd add .gitignore
 1 file changed, 3 insertions(+)
 create mode 100644 .gitignore

// コミット完了! リモートリポジトリに、push します!
$ git push origin main
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 342 bytes | 342.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/20210311.git
   c4ebd4f..6ab4753  main -> main

$ git log --oneline
6ab4753 (HEAD -> main, origin/main) 3rd add .gitignore
c4ebd4f (tag: v.0042) 2nd add main.txt
d7d9b7f 1st
// これで、完了です!

それでは、20210311に移動して、git pull しましょう!


$ git pull 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 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

From https://github.com/shiozumi-makoto/20210311
 * branch            main       -> FETCH_HEAD
   c4ebd4f..6ab4753  main       -> origin/main
Updating c4ebd4f..6ab4753

Fast-forward
 .gitignore | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 .gitignore

// mainブランチが更新されて、先ほどと同じになりましたね。
$ git log --oneline
6ab4753 (HEAD -> main, origin/main, origin/HEAD) 3rd add .gitignore
c4ebd4f (tag: v.0042) 2nd add main.txt
d7d9b7f 1st

// ファイルの存在確認も念のため!
$ ls -a
.  ..  .git  .gitignore  README.md  main.txt

// .gitignore ありましたね!(笑)

$ git branch -vv
* main 6ab4753 [origin/main] 3rd add .gitignore
  sub  73c2e50 [origin/sub] 2nd add sub.txt
// ブランチの状態も、ついでに確認して置きましょう!  

今回は、かなり長くなってしまいましたけど、いかがでしょうか? git pull は、git fetch と、git merge の組み合わせコマンドですから、とても便利ではあるのですが、操作が慣れていない学習段階では、間違ったブランチとマージしてしまったりすることもありますので、どうぞ、お気をつけください。でも、そんな失敗体験も重要ですから、怖がらず、慌てずに!

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

https://zenn.dev/shiozumi/articles/9a4af51632798d
https://twitter.com/esmile2013

脚注
  1. git remote add TEMP <githubのURL> このようにすると、origin ではなく、TEMPのエイリアス名が設定されます。 ↩︎

Discussion