見出し画像

本を1冊勉強する~独習Git

独習シリーズ「独習 Git」(著:Rick Umali)を1冊勉強します。
勉強するごとに追記していきます。

演習(※1)と課題(※2)があり、実際にPCで動かしつつ勉強できるようです。また、1か月で勉強できるように編成してくれているようなので、2021年4月以内で読み切るのを目標にやっていきます。

この本の良いところ:
・章ごとに使ったコマンドがまとめられている

第1章 はじめに

Gitのインストールについてがメイン。
Windows、Linux、MacにGitをインストールする方法を説明されていました。

第2章 Gitとバージョン管理の概要

バージョン管理の簡単な説明とGitのさわり。
バージョン管理の説明の部分はGitの用語を使って説明されているので、Gitが初めての人はこちらから読むといいのかも。

第3章 Gitに馴染む

初期設定、コマンドライン操作、Gitのヘルプの説明。
コマンドラインは、Windowsの場合はGit Bashを使用することが説明されていて、本と同じことができるので安心です。

Git BashではなくWindowsのコマンドラインはシェルと動作が違うことがあります。
本に出てきたコマンドラインのコマンドと編集を試して、下記にまとめてみました。

コマンドラインのコマンド
・cd        :カレントディレクトリを変更
・pwd    :現在のカレントディレクトリを表示(*1)
                  ≒Windowsコマンドプロンプトの場合、@cdで表示
                  参考:コマンドプロンプトで、pwd 的なことをしたい。
・ls         :カレントディレクトリ内のファイル一覧を表示(*1)
                  ≒Windowsコマンド「dir」
・touch  :空のファイルを作成 / タイムスタンを変更(*2)
・mkdir  :ディレクトリを作成
・rm       :ファイル、ディレクトリを削除(*1)
                  ≒Windowsコマンド「del」「rd(またはrmdir)」

コマンドラインの編集
・タブ保管
・↑ または ↓ キーでのコマンド履歴呼び出し
・Ctrl+A:行の先頭に移動(*2)
・Ctrl+E:行の末尾に移動(*2)
・Ctrl+H:カーソルの左の文字を削除(*2)
・Ctrl+D:カーソルの右の文字を削除(*2)
・Ctrl+U:カーソルの左側を全部削除(*2)
・Ctrl+K:カーソルの右側を全部削除(*2)

*1 …Windowsコマンドプロンプトではできません
*2 …Windowsコマンドプロンプト、PowerShellではできません

第4章 リポジトリの作り方と使い方

CUIでリポジトリの作成、ファイルをコミット対象にする、コミットする、ログを確認する、を勉強しました。

難しかったのは2点。
1.git ls-filesコマンドがわかりにくかった
2.改行コードの取り扱いについて

lsとgit ls-filesは両方ともファイルを表示するけれど、lsは今の中身、git ls-filesはリポジトリの中身を表示します。
lsとの違いは難しくないのだけど、どういう風に使うかの例がなく、どういう使い方をしたら効率的なのかよく理解できなかった。

改行コードは、WindowsとLinux/Macでは改行を表すデータが違うというもの。(改行コードや文字エンコードは他記事に譲ります)
Windowsで勉強してたので、Git for Windowsを使用しています。このGit for Windowsをインストール時に改行コードの設定があるのですが、どの設定でどうなってどれがおすすめなのかは本書ではわからなかった。
ネットの記事でも古いGit for Windowsで説明されていたりしてピンポイントの情報を見つけられていません。

第5章 GUIでGitを使う

4章と同じことをGUIで行う方法を勉強できます。

この章でつまづいたのはTlc/Tkの部分が本の通り再現できなかったとう点です。
訳者注釈にスクリプトをタイプしてみたら動いたと書いてあったので、やってみたら動きました。

・スクリプト(button.wishとか適当な名前で保存してください)

button .submit -text "git" -command { catch { exec git --version} results; puts $results }
pack .submit


・コマンド

> wish <保存したファイル>


第6章 ファイルの追跡と更新

git addや、ステージングエリアについて勉強できます。

差分(diff)とシェルスクリプトの話題が出てきます。

差分とは、違いのこと。⇒IT用語辞典
(ネットの国語辞典などは高校数学などにでてくる差分などしか載ってなかった…)
その中で、unified formatまたはunififfは差分の表示形式・出力形式。⇒Wikipedia
手持ちの環境で出力させると、大体こんな感じで表示されました。

--- 1個目のファイル名
+++ 2個目のファイル名
@@ -[1個目スタート位置],[1個目表示行数] +-[2個目スタート位置],[2個目表示行数] @@
 変更されていない行
-1個目のファイル(変更された箇所)
+2個目のファイル(変更された場所)

シェルスクリプトとは、コマンドをまとめたもの。
(ここでいうコマンドとはgit guiなど)
コマンドまとめなので、何のコマンドがまとめられているのかでことなり、呼び方も違います。
正確ではないかもしれないけど、コマンドプロンプトのコマンドまとめはバッチファイル、Git for WindowsやLinuxやMacで動くコマンドまとめはシェルスクリプト。

第7章 変更箇所をコミットする

この章ではファイルの削除、変更箇所を指定してコミットするなどを学べます。

この章は課題の文が難しかったです。

git statusの出力に従ってそのファイルを元に戻そう。

という、課題があるのですが、git statusを確認したときに、~してと出てきます。その方法が課題の正着となっているようです。

和訳者の解答では、1回目のステータスでは、

(use "git reset HEAD ..." to unstage)

と表示されて、

git reset HEAD lorem-ipsum.txt

を実行。その後さらにstatusすると、

(use "git checkout -- ..." to discard changes in working directory)

が出てくるので、

git checkout -- lorem-ipsum.txt

とした。と解説されていたのですが、私の使っていたgitではメッセージが更新されていた様子。(参考:Git 2.23.0でswitchとrestoreコマンドが追加!git checkoutから乗り換え
下の2つのメッセージがでてたので、それで進めました。
※私の使用したgit:git version 2.31.1.windows.1

(use "git restore --staged <file>..." to unstage)
(use "git restore <file>..." to discard changes in working directory

第8章 Gitというタイムマシン

この章では、コミットのメッセージの書き方、特定のバージョンをチェックアウトする方法、タグのつけ方などを学べます。

この章は課題が充実していてログの表示やSHA1 IDの表示方法を実際に入力することができます。
ただ、この章はブランチはまだ説明されていないので、複雑な分岐の話題はありません。
しかし、前のバージョンに戻ることができるようになりました。
この章まで学ぶと、シンプルなバージョン管理は入門できたことになるのではないでしょうか。

第9章 ブランチ(支線)を辿る

主にbranch周りを学べ、stach(スタッシュ)もでてきます。

この章自体は難しくありませんが、この章を読み終われば8章までの一直線な管理ではなく、途中でソースを分岐させることができます。(branch)
また、stachは作業を一時停止できる良い方法です。
branchが増えたときに、git guiとgitkでどうやってみるかもこの章に含まれています。
分岐がわかる章という感じです。

課題で分からなかったのが、「9.5.4 複数のブランチを見る」の4番。
・あるタグを含むbranchは何か
という問題です。
gitkで見つけることもできるし、以下のコマンドで検索することもできます。
わからなかったところは「タグを正規表現で検索できるか」。
git rev-parseコマンドは、指定の文字列をログメッセージに含むコミットのSHA1 IDを調べることができます。
しかし、試してみたところこのコマンドは完全一致らしいです。
タグの検索方法は機会があれば調べてみたいと思います。

git branch --contains <調べたいタグ>

章末のおまけ「さらなる探求」ではコマンドラインのカスタマイズの話題がでてきていました。
たとえば、Git for Windowsではそのままだと次のようになります。

user@DESKTOP-PC ~/git (master)
$(ここにコマンドを書く)

この表示を変えることができます。
変え方はコマンドラインによりますが、Git for WindowsはBASHの設定が使えます。
BASHの設定は例えば次のような記事がありました。

Bashプロンプトの変更

第10章 ブランチをマージ(統合)する

この章ではmergeについて学べます。

mergeで競合(conflict/コンフリクト)が起きたとき、解決する方法も学べます。

競合を解決する方法で、gvimdiff(あるいは他のマージツール)を使うところが難しかったです。
mergeで競合が起きると、下記のメッセージが出ます。
この場合、bazを確認すると競合の内容が確認できます。
また、bazを修正するとmerge完了になります。
方法としては、エディタで普通に書き直す方法と、ツールを使って書き直しを手助けしてもらう方法があります。

$ git mergetool
Merging:
baz

Normal merge conflict for 'baz':
 {local}: modified file
 {remote}: modified file
4 files to edit

このエラーがでた状態で下記のようにツールを呼び出すことができます。

git mergetool

ただし、この呼び出しでは、ツールが設定されていないと起動しません。
よって、下記のようにツールの設定したり(または直接configを編集)、2個目のコマンドのように呼び出すことができます。

git config --global merge.tool vimdiff
git mergetool -t vimdiff

注意として、ツールがインストールされていないと、意味がありません。
たとえば、gvimdiffと本に書かれていましたが、私の環境ではgvimdiffは無いみたいでした。vimdiffはありました。
ですので、使いやすいツールを見つけて使うほうが良いと思います。
下記のサイトを参考にしました。

「さらなる探求」に出てきたオクトパスマージですが、私は次のようにやりました。

$ git merge --strategy=octopus <ブランチ1> <ブランチ2> ...

この章を読んでもちょっとわからなかったのは、競合したファイルを見つける方法。
mergetoolしたら最初は競合したファイルを自動的に編集しはじめると思います。
では、編集を中途半端に終了した場合は?
その場合、mergetoolしても競合したファイルを開いてくれませんでした。
競合した、していないはどこで判断してるのか調べたいと思います。

第11章 クローン(複製)を作る

この章ではgit cloneについて学ぶことができます。

mergeよりは難しくありませんでした。
ベアリポジトリ(bare repository)が出てきます。
ベアリポジトリはリポジトリしか入れられないリポジトリです(ソースなどは入れあれません)
cloneしたときにブランチがどう見えるのかも説明されていました。

未読

第12章 リモートとの共同作業
第13章 変更をプッシュ(送出)する
第14章 同期を保つ(プル)
第15章 ソフトウェア考古学
第16章 {git rebase}を理解する
第17章 ワークフローとブランチの規約
第18章 GitHubを使う
第19章 サードパーティ製ツールとGit
第20章 Gitを研ぎすませる

リンク

SE Book「独習Git」
原著「Learn Git in a Month of Lunches」のDLページ
Qiita「『独習Git』課題の解答およびヒント」
コマンドプロンプトで利用できるショートカットキー

おまけ:コミット時間を指定するシェルスクリプト

8章を参考に時刻部分だけをまとめたスクリプトです。
time.shとかの名前で保存して動かしてください。
スクリプトによってPC時間と異なるコミット時間で git commit されます。

#!/bin/bash

#
# 時刻を変えて git commit するサンプル
# ※このシェルスクリプトは何も入っていないディレクトリで行ってください
# このシェルスクリプトを実行すると
# ディレクトリが作成され、その中にgitリポジトリが作成されます
# うち、1回目のコミットは時間が異なるように作られています
#
# 実行方法:
# $ bash time.sh

# 時間を秒の形式で取得
# dateは日付のコマンド、+%sは「秒単位で取得」という指定
NOW=$(date +%s)

# 1日(秒形式)をDAYに代入
DAY=$((60 * 60 * 24))

# コミットに記録される時間
#   下記の例だと3日前の時間が記録される
#   ADJUSTED_DATE=$((NOW - (DAY * 3))) 
ADJUSTED_DATE=$((NOW - (DAY * 3))) 

# ディレクトリ、ファイル名の設定
file_name="mytext.txt"
directory_name="sample"

##### ディレクトリ移動 #####
mkdir $directory_name
cd ./$directory_name

##### 確認ログ出力 #####
# コミット時間を出力
echo "commit time:" $(date -d @$ADJUSTED_DATE "+%Y/%m/%d %H:%M")
echo "########## git ##########"

##### git処理 ##### 

# gitリポジトリを初期化
git init


### 1回目の処理

# 仮のデータを作る
touch $file_name
cat >> $file_name <<EOF
 Sample.
EOF

# git add
git add $file_name

# git commit
#   このコミットの時刻はADJUSTED_DATEで指定した値で記録される
#   GIT_AUTHOR_DATEとGIT_COMMITTER_DATEがgitの環境変数
env GIT_AUTHOR_DATE=$ADJUSTED_DATE GIT_COMMITTER_DATE=$ADJUSTED_DATE git commit -m "No1."


### 2回目の処理

# データを変更する(追記する)
cat >> $file_name <<EOF
 New line.
EOF

# git add
git add $file_name

# git commit
git commit -m "No2."

##### 確認ログ出力 #####
echo "########## END ##########"

この記事が気に入ったらサポートをしてみませんか?