前回は、導入したGitを利用し、Git Bash, VS Code, Git Hub Desktopからコミットしてみました。今回は、前のコミットに戻ったり、分岐させる操作をやってみます。
いよいよ、来歴管理らしさがでてきました。
前回の振り返り
はじめに、前回記事で作成した3件のコミットを振り返ります。

内容は、Test1.txtを作成(Commit 1)し、その内容を修正(Commit 2)、その後、Test 2を追加しました(Commit 3)。
MasterとHEAD
スライドの左上にMaster, HEADとあるのは、HEADがMasterブランチを指し示している事を意味しています。ブランチは、分岐バージョンを作成する時に登場します。現時点では、このMasterのみで、HEADもMasterを指し示してます。
一先ず、現時点でのtest-projectの中身を確認してみましょう。

上のスライドと同じで、test1.txtとtest2.txtがあります。
前のコミットに戻るには?
それでは、今のCommit 3からCommit 2に戻ってみます。
ハッシュ値を調べる
戻るには、戻り先の識別符号が必要になります。そこで、コミット来歴を表示させて、Commit 2のハッシュ値を調べます。
git log

ログには3件のコミットが記録されていて、行き先のCommit 2は上から二番目。Commitの右側にある数字の羅列がハッシュ値(識別符号)です。更に、ログをみると、3件目のコミットに(HEAD -> master)とあります。前述のHEADが Masterブランチを指し示していることを表しています。
ハッシュ値とは何ぞや?
Gitは、コミットを通じて、スナップショット(その時のワークディレクトリの状態)を記録してゆくのですが、この記録で、SHA-1(シャーワン)で生成した16進数40字の文字列を利用してます。
ログの1件1件についている数字の羅列は人間には謎数字ですが、ここに来歴が記録される。SHA-1は、元々はパスワード管理などの暗号用に利用されるアルゴルズム。
深い話は、この辺をどうぞ。
Checkoutする
話を戻し、上のログからCommit 2のハッシュ値が分かりました。
- 42c993fcfefa2a7b5caaa44a2758da24b831dde0
これを使って戻りたい場所を指定してやります。checkoutコマンド。ハッシュ値はgitが行き先を識別できればいいので、最初の4桁もあれば十分です。
git checkout 42c9

何やら色々メッセージがでてきました。要点は2点です。
- HEADが外れている(detached HEAD)
- 今のHEADはsecond commit (Commit 2)にいる
ワークディレクトリは?
確認してみると、Commit 2の状態に確かに戻っています(test2.txt)はありませんね。

ログは?
こちらも、Commit 2の状態に戻っています(text2 was createdが無い)。しかし、最新の Commit 2 に masterの表示もなく、(HEAD)とあるだけです。

どういう状態?
イメージ図です。Gitのレポジトリには全て残っていますが、checkoutコマンドにてHEADを移動しました。これにより、Test-project内には、Commit 2までの状態が再現されています。
Masterはブランチなので、最新のコミット。この場合は、Commit 3が引き続きMasterになります。

さらに、git statusコマンドからも、HEADが 42c993f (Commit 2)に居て、detachedであることが分かります。

元に戻そう
次のコマンドで戻れます。Masterブランチの最新状態(Commit 3)に帰ることができます。
git checkout master
分岐させてみよう
計画
再び、Commit 2に戻り、そこからCommit 3とは異なる変更。つまり、分岐させてみます。分岐後の変更内容をCommit 4とします。

Checkout
先ず、Commit 2へ戻ります。
git checkout 42c9
Commit 4.txtを作成し、

Commitします。ファイル名を" "で囲ったのはcommit 4.txt のファイル名にスペースがあるため。
git add "commit 4.txt" git commit -m "commit4"
ログ確認
Git logでHEADがCommit 4に来ていることがわかります。このように分岐させることができます。

ブランチ作成
分岐させる所まで来たので、ブランチを作成してやります。ブランチとは、上のスライドにあるMasterに相当するもので、分岐の最終コミットにつきます。
git switch -c new-branch
new-branchという名前にしました。HEADがnew-branchについてるのが確認できます。

イメージで表すとこのようになります。

ブランチ間の移動
checkoutコマンドで移動できます。
git checkout master
masterブランチの状態に戻りました。Commit 4で作成した commit 4.txt はありません。

ブランチの削除
new-branchでの作業を没に、つまりブランチを削除する場合は・・・
git branch -D new-branch
オプションのDは強制削除(マージされていなくても削除する)です。小文字のdオプションの場合は、マージされていないブランチは削除できません。
ブランチのマージ
逆にnew-branchでの作業を採用する場合は、masterブランチに戻り、mergeコマンドを打ちます。続いて、new-branchを -dオプションで削除しておきます。
git checkout master git merge new-branch git branch -d new-branch
masterブランチでもnew-branchで作成したcommit 4.txtを確認することができました。

まとめ
今回は、前回作成した3件のコミットをベースに以下の内容を記載しました。
- MasterとHEADの概念
- ハッシュの概念
- Checkoutによる操作(前のコミットに戻る)
- ブランチの概念
- ブランチの操作
ローカル側の操作は一通り記事にできたので、次からは Git Hubとの連携です。