どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Git入門 part4 / タグ, コミット

本日もサルでもわかるGit入門の発展編の続きをやっていきます〜!

目次

1.発展編

1-1. タグ

コミットを参照しやすくするために、コミットに名前を付けることができます。
この名前をタグと言い、どのコミットかわかりやすいように任意の名前を付けることができます😊

Gitでは以下の2種類のタグが使用できます。

できること 軽量タグ 注釈付きタグ
名前を付ける
コメントを付ける ×
署名を付ける ×

一般的には、軽量タグはローカルで一時的に使用するような、使い捨てタグとして使用されます。注釈付きタグは、リリース用のタグとして使われます💡
また、一度付けたタグは位置が移動することがなく、固定されます。

1-2. チュートリアル タグ

前準備

タグを作るチュートリアルをやっていきます💪
まずはtutorialというディレクトリを作って、リポジトリを作成するところから!
このあたりはGit入門 part1で解説しているとおりです。
f:id:mistyrinth:20190108151617p:plain
リポジトリを作成し、myfile.txtの中に以下の1文を書いてコミットしました😊

サルでもわかるGit入門

軽量タグを追加する

まずは簡単な軽量タグから!🔖
現在のHEADが指しているコミットに軽量タグを追加するには、tagコマンドを使用します。

$ git tag タグ名

今回はappleというタグを付けます🍎
ちなみに、タグ名を指定せずにtagコマンドを実行することで、タグの一覧を表示できます。
また、履歴の一覧を表示するlogコマンドに--decorateオプションを付けて実行すると、タグ情報を含めた履歴を表示することができます😇
f:id:mistyrinth:20190108153408p:plain

注釈付きタグを追加する

現在のHEADが指しているコミットに注釈付きタグを追加するには、tagコマンドに-aオプションを指定します。
実行するとテキストエディタが起動するので、タグに設定するコメントを入力します✍️
-mオプションを指定して、直接コメントを与えることもできます。
また、tagコマンドに-nオプションを指定すると、タグの一覧とコメントを表示できます🔍

$ git tag -a タグ名

ここではbananaという注釈付きタグを付けます🍌
f:id:mistyrinth:20190108153559p:plain

タグを削除する

作成したタグを削除するには、tagコマンドに-dオプションを指定します!
f:id:mistyrinth:20190108153858p:plain

タグは簡単でしたね〜🥳🥳🥳

1-3. コミットの書き換え

コミットを書き換える方法として、以下のようなものが挙げられます。

コマンド 用途
commit --amend 同じブランチの直前のコミットに対し、内容の追加やコメントの修正を行う
※amend は commit コマンドのオプション
revert 指定したコミットの内容を打ち消すコミットを作成する
コミットが公開済みで削除できない場合にrevertが使われる
reset 不要なコミットを削除する
※詳細は下記
cherry-pick 別のブランチにある指定したコミットをコピーし、現在のブランチに取り込む
rebase -i コミットの書き換え、入れ替え、削除、統合を行う
※ i はrebase コマンドのオプション
merge --squash 指定のブランチのコミット全てをまとめたコミットを追加する
※ squash は merge コマンドのオプション

resetコマンドについては前回の記事でかなり雑に扱ってしまいましたが、改めて学習します!
参考にしたのはこちらのサイトです🙋‍♀️

www-creators.com

resetコマンドの用途は以下の2つです。

- 用途1:インデックスを任意の状態にリセットする
- 用途2:ブランチの先頭`HEAD`を指定したコミットに強制移動する

また、resetコマンドのオプションには、--soft--hardがあります。内容は以下のとおりです😊

モード オプション 解説
mixed 無し(default) HEADの位置を戻したい場所に移動してインデックスを更新するが、作業ツリーはそのままにする
soft --soft HEADの位置を戻したい場所に移動するが、インデックスと作業ツリーはそのままにする
hard --hard HEADの位置を戻し、インデックスも作業ツリーも丸ごとリセットする

1-4. チュートリアル コミットの書き換え

以上を踏まえ、チュートリアルを進めます🏃‍♂️

commit --amend

予め履歴が用意されているローカルリポジトリを使ってチュートリアルを行います。
ダウンロードはチュートリアルページの始めのほうにリンクがあります✨
stepup-tutorialというファイルがダウンロードされるので、私はデスクトップに置いてアクセスすることにします。(もちろんどこでもいいです)
f:id:mistyrinth:20190108160502p:plain
キャプチャのように、stepup-tutorialの中にはtutorial1からtutorial7までのディレクトリが保存されています。
まずはtutorial1に移動し、リポジトリの履歴をチェックしたところ、既に2回コミットがされていますね👀
1回目がfirst commit、2回目がaddの説明を追加と書いてある部分です。

早速commit --amendを行います!これは直前のコミットの内容の追加やコメントの修正を行うオプションですよ🙌

tutorial1には予めsample.txtが保存されているので、中身を確認すると、以下の2行が書かれています。

サルでもわかるGitコマンド
add 変更をインデックスに登録する

前回のコミットでは、addコマンドの説明(2行目)を追加したことがわかりましたね。
ここに3行目を記載するのですが、commit --amendを使って、前回のコミットで2〜3行目を同時に追加したことにします😎
3行目の内容は以下のとおりです。

commit インデックスの状態を記録する 

一連の流れを以下に貼り付けます。
f:id:mistyrinth:20190108161757p:plain

最後のgit commit --amendを実行すると、エディタが起動し、コメントの編集ができます。
キャプチャはこちら👇
f:id:mistyrinth:20190108162336p:plain
1行目のaddaddとcommitに書き換えます!😆
f:id:mistyrinth:20190108162551p:plain
これでエディタを閉じると、コミットの書き換えが行われます🙃
そして再度logコマンドで履歴を確認すると、最初に現れた内容と変わっているため、前回のコミットが書き換えられていることが確認できますね🎉🎉

revert

次に、コミットの内容を打ち消すコミットを作成するrevertコマンドを使います。
ディレクトリはtutorial2に移動します👣
ひとまずtutorial2の中身と履歴を確認していきます。

f:id:mistyrinth:20190108163757p:plain

tutorial2の中身はsample.txtですね👀
コミットは4つあることと、sample.txtの中身は3行であることがわかります。
最初のコミットの後、1行ずつ追加してコミットしていったのですね〜🧚‍♀️

revertコマンドを使って打ち消すコミットの内容は「pullの説明の追加」にします。
最新のコミットなので、HEADが指しているところにあたりますね😊

f:id:mistyrinth:20190108164900p:plain

revertコマンドを実行すると、エディタが起動します。キャプチャは以下のとおりです📷
f:id:mistyrinth:20190108164949p:plain
これは特に修正する必要がないので、このまま閉じました🙂
logコマンドで履歴を確認すると、revertの履歴が追加されました!
sample.txtを開くと、pullの説明がなくなっています。
これが「コミットの内容を打ち消すコミットを作成する」ということなんですね💪

reset

今度はtutorial3ディレクトリを使って、resetコマンドをやってみます!
最初はtutorial3の中身と履歴を確認します。

f:id:mistyrinth:20190108200943p:plain

tutorial2と同様、tutorial3の中身はsample.txtだけですね。
コミットは4つあることと、sample.txtの中身は4行であることがわかります。

チュートリアルでは、resetコマンドを使ってmasterブランチの先頭から2つ分のコミットを削除します。

先程挙げたresetコマンドのオプションをおさらいします👀

モード オプション 解説
mixed 無し(default) HEADの位置を戻したい場所に移動してインデックスを更新するが、作業ツリーはそのままにする
soft --soft HEADの位置を戻したい場所に移動するが、インデックスと作業ツリーはそのままにする
hard --hard HEADの位置を戻し、インデックスも作業ツリーも丸ごとリセットする

masterブランチの先頭から2つ分のコミットを削除」ということは、--hardオプションがつきます!
また、HEAD(masterブランチの先頭)から2つ前はHEAD~~と書いて表すことができます。
参考記事:Git入門 pert3 / ブランチ

つまり実行するコマンドはgit reset --hard HEAD~~になります💪

f:id:mistyrinth:20190108202847p:plain

sample.txtの中身は、commit と pull の説明がなくなっていますね👌 logコマンドで履歴を確認すると、コミットが削除されていることが一目瞭然です。
--headオプションなので、ツリーごと削除してしまいました😊

ちなみに、間違えてresetしてしまった場合などは、resetコマンドでORIG_HEADという名前のブランチに reset することで、 reset 前の状態に戻すことができます。

cherry-pick

次にtutorial4ディレクトリを使って、cherry-pickコマンドをやります。
cherry-pickとは、別のブランチにある指定したコミットをコピーし、現在のブランチに取り込むコマンドでしたね🍒
これまでと同様、まずtutorial4の中身と履歴を確認します。

f:id:mistyrinth:20190108205500p:plain

tutorial4も中身はsample.txtだけです。
コミットは3つあり、sample.txtの中身は3行です。
また、最後にbranchコマンドで確認したとおり、今はissue1というブランチにいます!
このissue1ブランチで行った「commitの説明の追加」という変更をmasterブランチに取り込みます。

まずmasterブランチにチェックアウトします。
次に「commitの説明を追加」したコミットのコミットIDを指定してcherry-pickコマンドを使うことで、コミットを取り出し、masterに追加します。

コミットIDは上のキャプチャでいう99daed25b45fcae2ce9d707a3434951cf69f253aですね🧐
長すぎるのですが、全部入力しなくても、最初の数文字だけで大丈夫みたいです✨

f:id:mistyrinth:20190108214430p:plain

cherry-pickコマンドを行ったときに競合が発生したため、sample.txtを修正してからコミットしました😆
また、最後にコミットした時に表示されたエディタでは、コメントを編集できました。
このあたりはcommit --amendのときと同じなので割愛します。

rebase -i でコミットをまとめる

今度はtutorial5rebase -iチュートリアルを進めます。
rebase -iは、コミットの書き換え、入れ替え、削除、統合を行うコマンドでした。
tutorial5ではsample.txtの中身は触らないため、中身の確認はしません🙃
logコマンドで履歴の確認をします。

f:id:mistyrinth:20190108215337p:plain

コミットが4つありますね👀
ここでrebase -iコマンドを使って、HEADから2つめ(HEAD~~)の「pullの説明を追加」以降の変更をひとつのコミットに統合します!

f:id:mistyrinth:20190108220659p:plain

rebase -iを実行すると、HEADからHEAD~~までのコミットがエディタで表示されます。
f:id:mistyrinth:20190108220749p:plain
この2行目先頭のpicksquashに書き換えます🖋押し込めるという意味ですね💡
f:id:mistyrinth:20190108220923p:plain
この状態で保存すると、統合した後のコミットに設定するメッセージがエディタで表示されます。
必要に応じて編集し、保存します。私は編集せずそのまま保存しました🙂
f:id:mistyrinth:20190108221148p:plain

以上で、2つのコミットが1つのコミットに統合されました🎉🎉
logコマンドで履歴を確認します。
f:id:mistyrinth:20190108221517p:plain
3つめのコミットに、元々2つだったコミットが統合されていますね☀️

rebase -i でコミットを修正する

先程と同じくrebase -iコマンドですが、今度はコミットを修正する方法です。
tutorial6を使います。

f:id:mistyrinth:20190108221847p:plain

既にコミットが4つあります。
ここでは、HEADから2つめの「commitの説明を追加」で行った変更内容を修正します✍️
手順は途中まで先程のtutorial5と同様で、まずはrebase -i HEAD~~を実行します。

f:id:mistyrinth:20190108223356p:plain

途中で現れる別画面エディタはこちらです。
f:id:mistyrinth:20190108222529p:plain

rebase -i HEAD~~コマンドを実行すると、エディタに HEAD から HEAD~~ までのコミットが表示されます。
先程と異なるのは、今度は1行目先頭のpickeditに変更して保存するところです😊
エディタを終了すると、修正したいコミットがチェックアウトされた状態になります。
その状態でsample.txtを修正します\(^^)/
ここからは少しだけチュートリアルと進みが異なるのですが、 私は文章の一番最後に顔文字\(^^)/を付け足しました。

f:id:mistyrinth:20190109195858p:plain

rebase -i HEAD~~を実行したときに現れるエディタは以下のとおりです。
※私が\(^^)/を書き加えています💡
f:id:mistyrinth:20190109195450p:plain

チュートリアルと違うのは、私の場合HEAD~~を編集してHEAD~(Pullの説明)と競合してしまうところです。
チュートリアルでは競合が発生しないようにHEAD~の内容を書き足しているのですが、私にはちょっとわかりにくかったので自分なりにやってみます笑
私の場合だと、rebase --continue実行時に競合が発生していますね🙂

ここからはチュートリアルから少し逸れてしまいますが、競合が発生したら、sample.txtに書かれているコンフリクトを見て修正し、再度addrebase --continueを実行します。
この際、commit --amendは行いません✋
競合を解消した後には必要ないですね😊

f:id:mistyrinth:20190109200747p:plain

最後のrebase --continueで現れるエディタの内容はこちらです。
f:id:mistyrinth:20190109201126p:plain
これはそのまま編集せずに保存・終了しました😎

ちなみに途中で出てくるstatusコマンドは、前回のコミットと比較してどのファイルが変更されたか表示されます。
競合発生時にもやっておけば見比べられて良かったのですが、競合解消後と最後しかやってなくてすみません…笑

merge --squash

最後はtutorial7を使ってmerge --squash`コマンドをやってみます!
これは「指定のブランチのコミット全てをまとめたコミットを追加する」というものでした。

まずtutorial7に移動し、現状の履歴をlogコマンドで確認します。 f:id:mistyrinth:20190108233726p:plain

3つのコミットがあることが分かりますね🙂それから、今はissue1ブランチにいます。
ここからmasterブランチにチェックアウトし、merge --squashコマンドを実行することで、issue1のコミットを全てまとめてmasterの新規コミットを作成できます✨✨

f:id:mistyrinth:20190108235150p:plain
競合が発生したため、sample.txtを開いて競合を解消しました💡
競合を解消したら、コミットしていきます。
f:id:mistyrinth:20190108235544p:plain

issue1ブランチのすべてのコミットを1つにまとめたコミットがmasterブランチに追加されましたね😆😆

発展編は以上です〜!次回はPull request編!😊