未来を変える日記

ETロボコンを目指して

Git & Git Hub (3) 作業を戻す、分岐させる

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

前回の振り返り

 はじめに、前回記事で作成した3件のコミットを振り返ります。

f:id:corgi-eric:20201205110622p:plain
3件のコミット

 内容は、Test1.txtを作成(Commit 1)し、その内容を修正(Commit 2)、その後、Test 2を追加しました(Commit 3)。

MasterとHEAD

 スライドの左上にMaster, HEADとあるのは、HEADがMasterブランチを指し示している事を意味しています。ブランチは、分岐バージョンを作成する時に登場します。現時点では、このMasterのみで、HEADもMasterを指し示してます。

 一先ず、現時点でのtest-projectの中身を確認してみましょう。

f:id:corgi-eric:20201205110858p:plain
test-projectの中身確認

 上のスライドと同じで、test1.txtとtest2.txtがあります。

前のコミットに戻るには?

 それでは、今のCommit 3からCommit 2に戻ってみます。

ハッシュ値を調べる

 戻るには、戻り先の識別符号が必要になります。そこで、コミット来歴を表示させて、Commit 2のハッシュ値を調べます。

git log
f:id:corgi-eric:20201205113222p:plain
コミット来歴を確認

 ログには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
f:id:corgi-eric:20201205115044p:plain
checkout実施

 何やら色々メッセージがでてきました。要点は2点です。

  • HEADが外れている(detached HEAD)
  • 今のHEADはsecond commit (Commit 2)にいる
ワークディレクトリは?

 確認してみると、Commit 2の状態に確かに戻っています(test2.txt)はありませんね。

f:id:corgi-eric:20201205115524p:plain
test2.txtが消えている
ログは?

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

f:id:corgi-eric:20201205115716p:plain
masterが消えている
どういう状態?

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

f:id:corgi-eric:20201205140738p:plain
HEAD detached

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

f:id:corgi-eric:20201205141115p:plain
git statusの確認

元に戻そう

 次のコマンドで戻れます。Masterブランチの最新状態(Commit 3)に帰ることができます。

git checkout master

分岐させてみよう

計画

 再び、Commit 2に戻り、そこからCommit 3とは異なる変更。つまり、分岐させてみます。分岐後の変更内容をCommit 4とします。

f:id:corgi-eric:20201205142830p:plain
Commit 2からCommit 4へ分岐

Checkout

 先ず、Commit 2へ戻ります。

git checkout 42c9

 Commit 4.txtを作成し、

f:id:corgi-eric:20201205143219p:plain
Commit 4.txtを作成

 Commitします。ファイル名を" "で囲ったのはcommit 4.txt のファイル名にスペースがあるため。

git add "commit 4.txt"
git commit -m "commit4"

ログ確認

 Git logでHEADがCommit 4に来ていることがわかります。このように分岐させることができます。

f:id:corgi-eric:20201205143528p:plain
git logでログ確認

ブランチ作成

 分岐させる所まで来たので、ブランチを作成してやります。ブランチとは、上のスライドにあるMasterに相当するもので、分岐の最終コミットにつきます。
 

git switch -c new-branch

 new-branchという名前にしました。HEADがnew-branchについてるのが確認できます。

f:id:corgi-eric:20201205143929p:plain
HEAD -> new-branchになる!

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

f:id:corgi-eric:20201205144144p:plain
HEADがNew-branchを指している

ブランチ間の移動

 checkoutコマンドで移動できます。

git checkout master

 masterブランチの状態に戻りました。Commit 4で作成した commit 4.txt はありません。

f:id:corgi-eric:20201205144341p:plain
masterに戻る

ブランチの削除

 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を確認することができました。

f:id:corgi-eric:20201205145307p:plain
ブランチのマージ

まとめ

 今回は、前回作成した3件のコミットをベースに以下の内容を記載しました。

  • MasterとHEADの概念
  • ハッシュの概念
  • Checkoutによる操作(前のコミットに戻る)
  • ブランチの概念
  • ブランチの操作

 ローカル側の操作は一通り記事にできたので、次からは Git Hubとの連携です。