Git入門 part4 / タグ, コミット
本日もサルでもわかるGit入門の発展編の続きをやっていきます〜!
目次
1.発展編
1-1. タグ
コミットを参照しやすくするために、コミットに名前を付けることができます。
この名前をタグと言い、どのコミットかわかりやすいように任意の名前を付けることができます😊
Gitでは以下の2種類のタグが使用できます。
できること | 軽量タグ | 注釈付きタグ |
---|---|---|
名前を付ける | ○ | ○ |
コメントを付ける | × | ○ |
署名を付ける | × | ○ |
一般的には、軽量タグはローカルで一時的に使用するような、使い捨てタグとして使用されます。注釈付きタグは、リリース用のタグとして使われます💡
また、一度付けたタグは位置が移動することがなく、固定されます。
1-2. チュートリアル タグ
前準備
タグを作るチュートリアルをやっていきます💪
まずはtutorial
というディレクトリを作って、リポジトリを作成するところから!
このあたりはGit入門 part1で解説しているとおりです。
リポジトリを作成し、myfile.txt
の中に以下の1文を書いてコミットしました😊
サルでもわかるGit入門
軽量タグを追加する
まずは簡単な軽量タグから!🔖
現在のHEADが指しているコミットに軽量タグを追加するには、tag
コマンドを使用します。
$ git tag タグ名
今回はapple
というタグを付けます🍎
ちなみに、タグ名を指定せずにtag
コマンドを実行することで、タグの一覧を表示できます。
また、履歴の一覧を表示するlog
コマンドに--decorate
オプションを付けて実行すると、タグ情報を含めた履歴を表示することができます😇
注釈付きタグを追加する
現在のHEADが指しているコミットに注釈付きタグを追加するには、tag
コマンドに-a
オプションを指定します。
実行するとテキストエディタが起動するので、タグに設定するコメントを入力します✍️
-m
オプションを指定して、直接コメントを与えることもできます。
また、tag
コマンドに-n
オプションを指定すると、タグの一覧とコメントを表示できます🔍
$ git tag -a タグ名
ここではbanana
という注釈付きタグを付けます🍌
タグを削除する
作成したタグを削除するには、tag
コマンドに-d
オプションを指定します!
タグは簡単でしたね〜🥳🥳🥳
1-3. コミットの書き換え
コミットを書き換える方法として、以下のようなものが挙げられます。
コマンド | 用途 |
---|---|
commit --amend | 同じブランチの直前のコミットに対し、内容の追加やコメントの修正を行う ※amend は commit コマンドのオプション |
revert | 指定したコミットの内容を打ち消すコミットを作成する コミットが公開済みで削除できない場合にrevertが使われる |
reset | 不要なコミットを削除する ※詳細は下記 |
cherry-pick | 別のブランチにある指定したコミットをコピーし、現在のブランチに取り込む |
rebase -i | コミットの書き換え、入れ替え、削除、統合を行う ※ i はrebase コマンドのオプション |
merge --squash | 指定のブランチのコミット全てをまとめたコミットを追加する ※ squash は merge コマンドのオプション |
reset
コマンドについては前回の記事でかなり雑に扱ってしまいましたが、改めて学習します!
参考にしたのはこちらのサイトです🙋♀️
reset
コマンドの用途は以下の2つです。
- 用途1:インデックスを任意の状態にリセットする
- 用途2:ブランチの先頭`HEAD`を指定したコミットに強制移動する
また、reset
コマンドのオプションには、--soft
と--hard
があります。内容は以下のとおりです😊
モード | オプション | 解説 |
---|---|---|
mixed | 無し(default) | HEADの位置を戻したい場所に移動してインデックスを更新するが、作業ツリーはそのままにする |
soft | --soft | HEADの位置を戻したい場所に移動するが、インデックスと作業ツリーはそのままにする |
hard | --hard | HEADの位置を戻し、インデックスも作業ツリーも丸ごとリセットする |
1-4. チュートリアル コミットの書き換え
以上を踏まえ、チュートリアルを進めます🏃♂️
commit --amend
予め履歴が用意されているローカルリポジトリを使ってチュートリアルを行います。
ダウンロードはチュートリアルページの始めのほうにリンクがあります✨
stepup-tutorial
というファイルがダウンロードされるので、私はデスクトップに置いてアクセスすることにします。(もちろんどこでもいいです)
キャプチャのように、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 インデックスの状態を記録する
一連の流れを以下に貼り付けます。
最後のgit commit --amend
を実行すると、エディタが起動し、コメントの編集ができます。
キャプチャはこちら👇
1行目のadd
をaddとcommit
に書き換えます!😆
これでエディタを閉じると、コミットの書き換えが行われます🙃
そして再度log
コマンドで履歴を確認すると、最初に現れた内容と変わっているため、前回のコミットが書き換えられていることが確認できますね🎉🎉
revert
次に、コミットの内容を打ち消すコミットを作成するrevert
コマンドを使います。
ディレクトリはtutorial2
に移動します👣
ひとまずtutorial2
の中身と履歴を確認していきます。
tutorial2
の中身はsample.txt
ですね👀
コミットは4つあることと、sample.txt
の中身は3行であることがわかります。
最初のコミットの後、1行ずつ追加してコミットしていったのですね〜🧚♀️
revert
コマンドを使って打ち消すコミットの内容は「pullの説明の追加」にします。
最新のコミットなので、HEADが指しているところにあたりますね😊
revert
コマンドを実行すると、エディタが起動します。キャプチャは以下のとおりです📷
これは特に修正する必要がないので、このまま閉じました🙂
log
コマンドで履歴を確認すると、revert
の履歴が追加されました!
sample.txt
を開くと、pullの説明がなくなっています。
これが「コミットの内容を打ち消すコミットを作成する」ということなんですね💪
reset
今度はtutorial3
のディレクトリを使って、reset
コマンドをやってみます!
最初はtutorial3
の中身と履歴を確認します。
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~~
になります💪
sample.txt
の中身は、commit と pull の説明がなくなっていますね👌
log
コマンドで履歴を確認すると、コミットが削除されていることが一目瞭然です。
--head
オプションなので、ツリーごと削除してしまいました😊
ちなみに、間違えてresetしてしまった場合などは、reset
コマンドでORIG_HEAD
という名前のブランチに reset することで、 reset 前の状態に戻すことができます。
cherry-pick
次にtutorial4
のディレクトリを使って、cherry-pick
コマンドをやります。
cherry-pick
とは、別のブランチにある指定したコミットをコピーし、現在のブランチに取り込むコマンドでしたね🍒
これまでと同様、まずtutorial4
の中身と履歴を確認します。
tutorial4
も中身はsample.txt
だけです。
コミットは3つあり、sample.txt
の中身は3行です。
また、最後にbranch
コマンドで確認したとおり、今はissue1
というブランチにいます!
このissue1
ブランチで行った「commitの説明の追加」という変更をmaster
ブランチに取り込みます。
まずmaster
ブランチにチェックアウトします。
次に「commitの説明を追加」したコミットのコミットIDを指定してcherry-pick
コマンドを使うことで、コミットを取り出し、master
に追加します。
コミットIDは上のキャプチャでいう99daed25b45fcae2ce9d707a3434951cf69f253a
ですね🧐
長すぎるのですが、全部入力しなくても、最初の数文字だけで大丈夫みたいです✨
cherry-pick
コマンドを行ったときに競合が発生したため、sample.txt
を修正してからコミットしました😆
また、最後にコミットした時に表示されたエディタでは、コメントを編集できました。
このあたりはcommit --amend
のときと同じなので割愛します。
rebase -i でコミットをまとめる
今度はtutorial5
でrebase -i
のチュートリアルを進めます。
rebase -i
は、コミットの書き換え、入れ替え、削除、統合を行うコマンドでした。
tutorial5
ではsample.txt
の中身は触らないため、中身の確認はしません🙃
log
コマンドで履歴の確認をします。
コミットが4つありますね👀
ここでrebase -i
コマンドを使って、HEADから2つめ(HEAD~~)の「pullの説明を追加」以降の変更をひとつのコミットに統合します!
rebase -i
を実行すると、HEADからHEAD~~までのコミットがエディタで表示されます。
この2行目先頭のpick
をsquash
に書き換えます🖋押し込めるという意味ですね💡
この状態で保存すると、統合した後のコミットに設定するメッセージがエディタで表示されます。
必要に応じて編集し、保存します。私は編集せずそのまま保存しました🙂
以上で、2つのコミットが1つのコミットに統合されました🎉🎉
log
コマンドで履歴を確認します。
3つめのコミットに、元々2つだったコミットが統合されていますね☀️
rebase -i でコミットを修正する
先程と同じくrebase -i
コマンドですが、今度はコミットを修正する方法です。
tutorial6
を使います。
既にコミットが4つあります。
ここでは、HEADから2つめの「commitの説明を追加」で行った変更内容を修正します✍️
手順は途中まで先程のtutorial5
と同様で、まずはrebase -i HEAD~~
を実行します。
途中で現れる別画面エディタはこちらです。
rebase -i HEAD~~
コマンドを実行すると、エディタに HEAD から HEAD~~ までのコミットが表示されます。
先程と異なるのは、今度は1行目先頭のpick
をedit
に変更して保存するところです😊
エディタを終了すると、修正したいコミットがチェックアウトされた状態になります。
その状態でsample.txt
を修正します\(^^)/
ここからは少しだけチュートリアルと進みが異なるのですが、
私は文章の一番最後に顔文字\(^^)/
を付け足しました。
rebase -i HEAD~~
を実行したときに現れるエディタは以下のとおりです。
※私が\(^^)/
を書き加えています💡
チュートリアルと違うのは、私の場合HEAD~~
を編集してHEAD~
(Pullの説明)と競合してしまうところです。
チュートリアルでは競合が発生しないようにHEAD~
の内容を書き足しているのですが、私にはちょっとわかりにくかったので自分なりにやってみます笑
私の場合だと、rebase --continue
実行時に競合が発生していますね🙂
ここからはチュートリアルから少し逸れてしまいますが、競合が発生したら、sample.txt
に書かれているコンフリクトを見て修正し、再度add
とrebase --continue
を実行します。
この際、commit --amend
は行いません✋
競合を解消した後には必要ないですね😊
最後のrebase --continue
で現れるエディタの内容はこちらです。
これはそのまま編集せずに保存・終了しました😎
ちなみに途中で出てくるstatus
コマンドは、前回のコミットと比較してどのファイルが変更されたか表示されます。
競合発生時にもやっておけば見比べられて良かったのですが、競合解消後と最後しかやってなくてすみません…笑
merge --squash
最後はtutorial7を使って
merge --squash`コマンドをやってみます!
これは「指定のブランチのコミット全てをまとめたコミットを追加する」というものでした。
まずtutorial7
に移動し、現状の履歴をlog
コマンドで確認します。
3つのコミットがあることが分かりますね🙂それから、今はissue1
ブランチにいます。
ここからmaster
ブランチにチェックアウトし、merge --squash
コマンドを実行することで、issue1
のコミットを全てまとめてmaster
の新規コミットを作成できます✨✨
競合が発生したため、sample.txt
を開いて競合を解消しました💡
競合を解消したら、コミットしていきます。
issue1
ブランチのすべてのコミットを1つにまとめたコミットがmaster
ブランチに追加されましたね😆😆
発展編は以上です〜!次回はPull request編!😊