ここまでで何度かコミットを行ってきましたね。作業を行っていると、間違えてコミットしてしまった等、以前のコミットの状態に戻したいときがあります。
以前のコミットの状態に戻したいときがあります。そのような時に使用するのが「git reset」コマンドです。
ここまでで何度かコミットを行ってきましたね。作業を行っていると、間違えてコミットしてしまった等、以前のコミットの状態に戻したいときがあります。
そのような時に使用するのが「git reset」コマンドです。
「git reset」で戻るには、戻り先のコミットのハッシュを指定します。
ですので、まず「git log」でハッシュを調べましょう。
では実際にやってみますね。
# git logでハッシュを調べる
(master)$ git log --pretty=short
実行すると、以下のようにこれまでに行ったコミットが表示されます。
それぞれ、commit の後ろに書いてある英数字がハッシュです。
(master)$ git log --pretty=short
commit c9c12911ef40d5eb41962c8a6a531dc30863d1d4 (HEAD -> master, contact-form)
Author: skillhub <test@test.com>
Create contact.html
commit 8fa5c53fba302355bff046abd3baa8bb93846703
Author: skillhub <test@test.com>
Add contact to index
commit e36ac23ed4126611d739b00129abe5a6cd3e7aff
Author: skillhub <test@test.com>
Change logo
commit 5795ead47112cad3ea75b1e1f75b835c26d65c4c
Author: skillhub <test@test.com>
Add h1 and img to index
commit ac0c9422f8383f2b11f9ab101e9046b188919ffe
Author: skillhub <test@test.com>
Create index.html
では「contact-form」ブランチの作成前の段階である「Chenge logo」まで戻してみましょう。
みなさんも、ご自身の「Change 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
c40f1aa (HEAD -> master, info) HEAD@{0}: checkout: moving from info to master
c40f1aa (HEAD -> master, info) HEAD@{1}: checkout: moving from master to info
c40f1aa (HEAD -> master, info) HEAD@{2}: reset: moving to c40f1aa1cbcd70e258a4e925685e3c777c79b6fa
717e47d (contact-form) HEAD@{3}: merge contact-form: Fast-forward
c40f1aa (HEAD -> master, info) HEAD@{4}: checkout: moving from contact-form to master
717e47d (contact-form) HEAD@{5}: commit: Create contact.html
f391ba3 HEAD@{6}: checkout: moving from master to contact-form
c40f1aa (HEAD -> master, info) HEAD@{7}: checkout: moving from contact-form to master
...
「contact-form」ブランチをマージした直後に戻りましょう。
上から4つ目の履歴になります。「~merge contact-form~」という行ですね。
では戻してみましょう。
(master) $ git reset --hard 717e47d
HEAD is now at c9c1291 Create contact.html
これで現在地点はお問い合わせフォーム完成後のマージ直後になりました。
そして、ブランチを確認してみると、きちんと「info」ブランチも存在していることがわかります。
(master) $ git branch
contact-form
info
* master
コミットメッセージを修正したい場合には「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 ファイル名」としてきました。ですので「git commit --amend -m」を使って、「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(追加後)
<h1>zooloppa ズーロッパ</h1>
<img src="panda.jpg" alt="panda">
<a href="#">インフォメーショ</a>
(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(修正後)
<h1>zooloppa ズーロッパ</h1>
<img src="panda.jpg" alt="panda">
<a href="#">インフォメーション</a>
(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
「git rebase -i」を実行して、エディタを立ち上げます。
「HEAD~2」というのはHEAD(現在の最新コミット)から2つ目までのコミットをエディタに表示させる為です。
(info) $ git rebase -i HEAD~2
pick 064906b Add info to index
pick 5c25e72 Fix info to index
エディタの中で、上部にある「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.
衝突(コンフリクト)が起こっている為マージが出来ませんでした。では、ファイルの方を見てみましょう。
<<<<<<< HEAD
<h1>zooloppa ズーロッパ</h1>
<img src=”panda.jpg” alt=”panda”>
<a href="#">お問い合わせフォームへ"></a>
=======
<a href="#">インフォメーション</a>
>>>>>>> info
コンフリクトを起こしている部分が囲まれていますね。
では、ファイルを修正してマージしなおしてみましょう。
index.html
<h1>zooloppa ズーロッパ</h1>
<img src="panda.jpg" alt="panda">
<a href="#">お問い合わせフォームへ"></a>
<a href="#">インフォメーション</a>
(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 [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。