Help us understand the problem. What is going on with this article?

git revertとresetの違いと使い方 〜間違ったコミットの修正・消してしまったコミットの復活方法~

git revertとresetの違いと使い方 〜間違ったコミットの修正・消してしまったコミットの復活方法~

間違ったコミットを修正するコマンドに、git revertとgit resetがある。

git revertは指定したコミットの内容を打ち消して、新しいコミットを作成する。(ポインタを前に進める)

git resetは指定したコミットを削除する。(ポインタを過去に戻す)

いずれも、マージした処理の取り消しにも使える。

目次

  1. git revertの使い方
    1. エディタを立ち上げない (--no-edit)
    2. conflictの発生要因と対処法
    3. mergeコミットを打ち消す(-m)
    4. mergeコミットrevert時の注意点
  2. git resetの使い方
    1. resetの重要なオプション
  3. 削除したコミットを復活させる


git revertの使い方

指定したコミットの内容を打ち消して、新しいコミットを作成する処理。

git revert <打ち消したいコミット>
実行後にエディタが立ち上がるので、コミットメッセージを入力する。

revertのイメージ
#コミット履歴(A〜D)
A---B---C---D
          master

#コミットBの作業を打ち消して、新しいコミットD'を作る
$git revert B

A---B---C---D---D'
              master


エディタを立ち上げない

git revert --no-edit
エディタをひらきたくない場合は「--no-edit」オプションをつける。

コミットメッセージなしで、revertを実行する。


conflictの発生要因と対処法

現在のコミットと指定したコミットで同じ内容を修正している場合、conflictが発生する。

conflictの例
$ git revert @@{12} --no-edit
Auto-merging style.css
CONFLICT (content): Merge conflict in style.css
error: could not revert 9390048... add line3
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
  1. --abortオプション
  2. 手動で修正

--abort

git revert --abortで処理をキャンセルする。revertコマンドを実行していない状態に戻す。

手動で修正

#conflictが発生しているファイルを確認する
$ git st
On branch ft2
You are currently reverting commit 2767830.
  (fix conflicts and run "git revert --continue")
  (use "git revert --skip" to skip this patch)
  (use "git revert --abort" to cancel the revert operation)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
    both modified:   style.css

#vimエディタで修正する
vi style.css


#add & commit
git add <対象ファイル> && git commit -m "メッセージ"


mergeコミットを打ち消す

-mオプションを使い、現在いるブランチかトピックブランチのどちらかを番号で指定する。

git revert -m <パターン番号> <マージコミット>
 ┗「-m」: --mainline
 ┗ パターン番号は2つ(1or 2)
  ┗ 1: 現在のブランチ
  ┗ 2: 派生しているブランチ

merge後のrevertイメージ
#コミット履歴(Hがマージコミット)
      A---B---C 
     /         \
D---E---F---G---H 
              master


#コミットHの作業を打ち消して、新しいコミットを作る
$git revert -m 1 H

      A---B---C 
     /         \
D---E---F---G---H---H'
                  master

パターン番号に1を指定しているので、H'の内容はGと同じになる。

2を指定した場合はCと同じになる。


mergeコミットrevert時の注意点

mergeコミットをrevertした場合、revertしたブランチはmerge済みの認識のままなので、git mergeしようとすると、updatedと表示される。

$ git merge topic
Already up-to-date.


git resetの使い方

指定したコミットを無き物にする強力コマンド。

ログが変わってしまうため、複数人で開発している場合は基本的に使わない

git reset <コミット>
 ┗ 指定したコミットまでポインタを戻す。

resetの重要なオプション

git resetには3つの重要なオプションがある。

  1. --soft
  2. --mixed
  3. --hard
項目 --soft --mixed --hard
インデックスファイル 残す 削除 削除
ワークツリー 残す 残す 削除

インデックスファイルやワークツリーなどすべてを消去し、真っさらな過去に戻る場合は--hard、

現在のファイルを修正したい場合は、--mixedか--softを選択する。

--mixedと--softの違いはインデックスファイルの扱い。

resetの実例

以下のようなログで、0193c66 add h1以降のコミットをごっそり削除する。(v1.1まで戻る)

$ git log --oneline
* ac23875 (HEAD -> ft1, tag: D-E-F) add main.js
* 4af9f09 add h3
* 69d15eb add h2
* 0193c66 add h1
* 494777f (tag: v1.1) second ci
* 5eeac88 (tag: v1.0) first ci
#resetでv1.1まで戻る
$ git reset v1.1
Unstaged changes after reset:
M   index.html


#履歴を確認
$ git log --oneline
* 494777f (HEAD -> ft1, tag: v1.1) second ci
* 5eeac88 (tag: v1.0) first ci

コミットがごっそり削除された。

削除したコミットを復活させる

resetで削除したコミットも復活させることが可能。

resetを含め、実行してきたコマンドの履歴をみるにはgit reflogを使う。

直近のリセットしたコミットも表示されるので、その手前のコミットを指定してgit reset --hard <コミット>を実行する。

▼実例

#reflogでコマンドのログを確認
$ git reflog

494777f (HEAD -> ft1, tag: v1.1) HEAD@{0}: reset: moving to v1.1
ac23875 (tag: D-E-F) HEAD@{1}: checkout: moving from ft2 to ft1
e76d8cb (ft2) HEAD@{2}: commit: revised css
f90bf08 HEAD@{3}: commit: create aaa.txt
5d8ba72 HEAD@{4}: reset: moving to 5d8ba7253189740df0cfcf47ba19c5e7afc8b7dd
5d8ba72 HEAD@{5}: commit: add line4
52ee140 HEAD@{6}: commit: add line3
2767830 HEAD@{7}: revert: Revert "add line3"
7f6da97 HEAD@{8}: reset: moving to HEAD^

先ほどのリセットが1番上に表示される。過去に戻るので、resetで戻りたい場所のコミットを指定する。

$ git reset --hard e76d8cb
HEAD is now at 5eeac88 first ci


#ログを確認
$ git log --oneline

e76d8cb (HEAD -> ft1, ft2) revised css
f90bf08 create aaa.txt
5d8ba72 add line4
52ee140 add line3
2767830 Revert "add line3"
7f6da97 Revert "create aaa.txt"
9daedcc create bbb.txt
ceebb7a create aaa.txt

復活完了。

git resetも処理をキャンセルしたい場合はgit reset --abortで可能。

yuta-38
メモとして活用してます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした