修正をしてコミットの状態を元に戻す

ここまでで何度かコミットを行ってきましたね。作業を行っていると、間違えてコミットしてしまった等、以前のコミットの状態に戻したいときがあります。

吉田先生

以前のコミットの状態に戻したいときがあります。そのような時に使用するのが「git reset」コマンドです。


前のコミットの状態に戻す

ここまでで何度かコミットを行ってきましたね。作業を行っていると、間違えてコミットしてしまった等、以前のコミットの状態に戻したいときがあります。そのような時に使用するのが「git reset」コマンドです。

「git reset」で戻るには、戻り先のコミットのハッシュを指定します。ですので、まず「git log」でハッシュを調べましょう。では実際にやってみますね。

(master)$ git log --pretty=short
commit c9c12911ef40d5eb41962c8a6a531dc30863d1d4 (HEAD -> master, contact-form)
Author: sakurai <test@test.com>

    Create contact.html

commit 8fa5c53fba302355bff046abd3baa8bb93846703
Author: sakurai <test@test.com>

    Add contact to index

commit e36ac23ed4126611d739b00129abe5a6cd3e7aff
Author: sakurai <test@test.com>

    Change logo

commit 5795ead47112cad3ea75b1e1f75b835c26d65c4c
Author: sakurai <test@test.com>

    Add h1 and img to index

commit ac0c9422f8383f2b11f9ab101e9046b188919ffe
Author: sakurai <test@test.com>

    Create index.html

では「contact-form」ブランチの作成前の段階である「Chenge logo」まで戻してみましょう。

(master) $ git reset --hard e36ac23ed4126611d739b00129abe5a6cd3e7aff
HEAD is now at e36ac23 Change logo

「git rest」にはオプションがあります。よく使われるのは「--hard」や「--soft」などです。それぞれのオプションによって、何を元に戻すかが変わります。

たとえば「--hard」であれば、ワークツリー・インデックス・最新コミットが指定した履歴の状態に戻ります。「--soft」は最新コミットのみ戻ります。コミットの取り消しというイメージですね。

ですので、ファイルやインデックスの状態は現状のままで戻りません。これらのオプションを付けなければ、インデックスとコミットのみ取り消し、ワークツリーはそのままです。

今回は、全て「contact-form」ブランチ作成前に戻したいので「--hard」を使用しています。

現在地を進ませる

前セクションで「Chenge logo」コミットの状態に戻りました。では、新たに「info」ブランチを作成しましょう。そして、「contact-form」ブランチのマージ後に進ませます。これは、前セクションでの「git reset」を取り消すイメージですね。

では実際にやってみましょう。まず「info」ブランチを作成します。そして、進ませるにはマージなどの履歴を確認し、ハッシュを取得する必要があります。その為には「git reflog」というコマンドを実行します。

(master) $ git checkout -b info
Switched to a new branch 'info'
(info) $ git checkout -
Switched to branch 'master'
(master) $ git reflog
e36ac23 (HEAD -> master, info) HEAD@{0}: checkout: moving from info to master
e36ac23 (HEAD -> master, info) HEAD@{1}: checkout: moving from master to info
e36ac23 (HEAD -> master, info) HEAD@{2}: reset: moving to e36ac23ed4126611d739b00129abe5a6cd3e7aff
c9c1291 (contact-form) HEAD@{3}: merge contact-form: Fast-forward
e36ac23 (HEAD -> master, info) HEAD@{4}: checkout: moving from contact-form to master
c9c1291 (contact-form) HEAD@{5}: commit: Create contact.html
8fa5c53 HEAD@{6}: checkout: moving from master to contact-form
e36ac23 (HEAD -> master, info) HEAD@{7}: checkout: moving from contact-form to master
8fa5c53 HEAD@{8}: commit: Add contact to index
e36ac23 (HEAD -> master, info) HEAD@{9}: checkout: moving from master to contact-form
e36ac23 (HEAD -> master, info) HEAD@{10}: commit: Change logo
5795ead HEAD@{11}: commit: Add h1 and img to index
ac0c942 HEAD@{12}: commit (initial): Create index.html

「contact-form」ブランチをマージした直後に戻りましょう。その履歴は4つ目の履歴になります。「~merge contact-form~」という行ですね。では戻してみましょう。

(master) $ git reset --hard c9c1291
HEAD is now at c9c1291 Create contact.html
(master) $ git branch
  contact-form
  info
* master

これで現在地点はお問い合わせフォーム完成後のマージ直後になりました。そして、きちんと「info」ブランチも存在していますね。

コミットメッセージの変更

コミットメッセージを修正したい場合には「git commit --amend -m」というコマンドを実行します。では、新たに「info.html」を作成してコミットします。そして、そのコミットメッセージを修正してみましょう。

(master) $ git checkout info
Switched to branch 'info'
(info) $ touch info.html
(info) $ git add info.html
(info) $ git commit -m "Add info.html"
[info 847ebd7] Add info.html
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 info.html

コミットメッセージを「Add info.html」としていますね。しかし今までは、新しく「HTMLファイル」を作成しコミットする場合は「Create ファイル名」としてきました。ですので「Create info.html」というメッセージに変更してみましょう。

(info) $ git commit --amend -m "Create info.html"
[info 4558fa5] Create info.html
 Date: Thu May 24 10:38:36 2018 +0000
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 info.html

では変更されているか「git log」で確認してみますね。

(info) $ git log --oneline
4558fa5 (HEAD -> info) Create info.html
9873b26 (master, contact-form) Create contact.html
3aecb81 Add contact to index
36fc6d5 Change logo
646be74 Add h1 and img to index
14b2963 Create index.html

変更されていますね。

コミットをまとめる

コミットを何度も行っていると、本来分けずにまとめた方が分かりやすいようなコミットが出てくる場合もあります。

例えば、些細な誤字などで余計にコミットを増やしてしまった場合などです。そのような時には「git rebase -i」というコマンドを実行して、複数のコミットをまとめてしまいましょう。

では、「info」ブランチで「index.html」にインフォメーションへのリンクを追加してコミットします。そして、誤字を修正後にコミットをもう1度行ってみましょう。

*この時、次セクションでの作業の為に「お問い合わせフォーム」へのリンクを削除し、「インフォメーション」へのリンクを追加してください。

index.html(追加後)

<code class="language-html">&lt;h1>zooloppa ズーロッパ&lt;/h1>
&lt;img src="panda.jpg" alt="panda">
&lt;a href=#>インフォメーショ&lt;/a>
</code>
(info) $ git commit -am "Add info to index"
[info 064906b] Add info to index
 1 file changed, 1 insertion(+), 1 deletion(-)

この「git commit -am」というコマンドは、インデックスへの追加とコミットをまとめて行うためのコマンドです。では、リンクタグを修正してコミットします。

index.html(修正後)

<code class="language-html">&lt;h1>zooloppa ズーロッパ&lt;/h1>
&lt;img src="panda.jpg" alt="panda">
&lt;a href=#>インフォメーション&lt;/a>
</code>
(info) $ git commit -am "Fix info to index"                                                                                                                     
[info 5c25e72] Fix info to index
 1 file changed, 1 insertion(+), 1 deletion(-)

では、「git log」を確認の上これら2つのコミットを1つにまとめていきましょう。

(info) $ git log --oneline
5c25e72 (HEAD -> info) Fix info to index
064906b Add info to index
4558fa5 Create info.html
9873b26 (master, contact-form) Create contact.html
3aecb81 Add contact to index
36fc6d5 Change logo
646be74 Add h1 and img to index
14b2963 Create index.html
(info) $ git rebase -i HEAD~2
pick 064906b Add info to index
pick 5c25e72 Fix info to index

「git rebase -i」を実行するとエディタが立ち上がります。「HEAD~2」というのはHEAD(現在の最新コミット)から2つ目までのコミットをエディタに表示させる為です。エディタの中の、「pick~」という部分が対象のコミットです。

今回「Add info to index」に1つにまとめたいと思います。その場合は、「Fix info to index」の「pick」の部分を「fixup」に書き換えて保存します。

pick 064906b Add info to index
fixup 5c25e72 Fix info to index

では、ログを確認してみましょう。

(info) $ git log --oneline
b21b058 (HEAD -> info) Add info to index
4558fa5 Create info.html
9873b26 (master, contact-form) Create contact.html
3aecb81 Add contact to index
36fc6d5 Change logo
646be74 Add h1 and img to index
14b2963 Create index.html

「Fix info to index」の履歴がなくなっていますね。これでコミットをまとめることが出来ました。

コンフリクト

コンフリクトとは、別々のブランチでそれぞれ同じファイルの同じ場所に、異なった変更が加えられた状態でマージしようとした場合に起こります。マージする際にそれぞれの変更が衝突してしまうという事です。

先ほど、「info」ブランチで「index.html」の3行目のお問い合わせフォームのリンクをインフォメーションへのリンクに書き換えましたね。これで、「contact-form」ブランチと「info」ブランチで同じファイルの同じ場所に異なる変更が加えられている状態になりました。

では、「info」ブランチをマージしてみましょう。

(info) $ git checkout master
Switched to branch 'master'
(master) $ git merge info
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

衝突(コンフリクト)が起こっている為マージが出来ませんでした。では、ファイルの方を見てみましょう。

<code class="language-html">
&lt;h1>zooloppa ズーロッパ&lt;/h1>
&lt;img src="panda.jpg" alt="panda">
&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
&lt;a href=#>お問い合わせフォーム&lt;/a>
=======
&lt;a href=#>インフォメーション&lt;/a>
>>>>>>> info
</code>

コンフリクトを起こしている部分が囲まれていますね。では、ファイルを修正してマージしなおしてみましょう。

index.html

<code class="language-html">
&lt;h1>zooloppa ズーロッパ&lt;/h1>
&lt;img src="panda.jpg" alt="panda">
&lt;a href=#>お問い合わせフォーム&lt;/a>
&lt;a href=#>インフォメーション&lt;/a>
</code>
(master|MERGING) $ git commit -am "Fix conflict"
[master 179d4cf] fix conflict
(master) $ git merge info
Already up-to-date.

これで、コンフリクトは解決です。

まとめ

以前のコミットの状態に戻したいときは「git reset」を使用します。進ませることも可能です。「git reflog」でハッシュを取得する事も出来ます。

コミットメッセージの変更は「git commit --amend -m」で行います。不要なコミットは「git rebase -i」でまとめましょう。コンフリクトとは、同じファイルの同じ場所に異なる変更をすることです。

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×