3130


Gitでmasterブランチで作業しています。  
下図の1〜3の順番にコミットをした後、2をチェックアウトして新しく「bugifx」ブランチを切って4をコミットしました。

さて、ここで **3の内容をなかったことにして** masterを1→2→4という状態にしたいのですが、どのようにすれば良いのでしょうか？

![Flow](https://i.stack.imgur.com/VuLna.png)


CC BY-SA 3.0
2015-01-05T10:35:58.390
3128
2015-01-05T11:35:47.000
450
question
git
Gitでコミットをなかったことにしたい


リモートへのプッシュはまだ行われていないとして・・・

下記で bugfix ブランチの位置に master ブランチを移動させられます。

[code]

    git branch -f master bugfix
    
[/code]

bugfix ブランチは 4 の位置にあると思いますので、master も 4 に移ります。

例えばこのようになります。

[code]

    $ git log --graph --decorate --oneline --all
    * 161f88b (HEAD, bugfix) 4
    | * d087a50 (master) 3
    |/
    * bde8c9a 2
    * e635ec8 1
    
    $ git branch -f master bugfix
    
    $ git log --graph --decorate --oneline --all
    * 161f88b (HEAD, master, bugfix) 4
    * bde8c9a 2
    * e635ec8 1
    
[/code]


CC BY-SA 3.0
2015-01-05T10:49:13.577
3130
2015-01-05T10:49:13.577
2494
3128
answer


`master`ブランチをチェックアウトしている状態であれば、

[code]

    $ git reset --hard bugfix
    
[/code]

で行うことができます。これにより、`master`ブランチは`bugfix`ブランチと同じブランチを指すようになり、それによりコミット３を辿れるブランチが無くなるのでコミット３は消失します。

`\--hard`オプションで、作業ディレクトリやインデックスの内容も書き換えて完全にコミット４の状態になります。これを付けないと作業ディレクトリはコミット３の内容のままとなり、それはコミット４の内容と異なるので`modified`状態になります。


CC BY-SA 3.0
2015-01-05T11:23:03.150
3132
2015-01-05T11:35:47.000
2015-01-05T11:35:47.000
2988
2988
3128
answer