73
79

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

git 上のいろんなことをなかったことにする

Last updated at Posted at 2014-04-29

前置き

自分用覚書なので適当です。

注意

この記事は、git でやらかしたあれこれを『人知れず「なかったことにする」』ための方法が主になっているので、リモートに push したあとには絶対しないように。push したあとに reset して、あらたに別の commit をしてからの push -f などは、間違ってもしてはいけません。

注意2 (2020-08-06追記)

なにぶん古い記事なので、一部コマンドが最新の形態とは異なる部分があります。(後方互換性があるから大丈夫ですが。)
気が向いたら修正していこうかと思っています。

なかったことにする

add をなかったことにする

すでに git の管理下にあるファイルの場合

$ git reset HEAD <file>

git の管理下にまだなかったファイルを add した場合

$ git rm --cached <file>

管理下になかったファイルの場合、よくよく考えてみれば当然だが、戻るべきコミットが存在しないから reset では戻れない。しかたがないので rm で直接管理外とする。

commit をなかったことにする

commit したことをなかったことにする(編集内容はそのまま)

$ git reset --soft HEAD^

--soft は HEAD の位置だけが移動する

commit をまるごとなかったことにする(編集内容もなかったことにする)

$ git reset --hard HEAD^

commit をやり直す

足りないファイルを追加するとか

不足していたファイルを add した後

$ git commit --amend

コメントを書きなおす(直前のコミットに対して)

コミットした直後にコメントが間違っていたことに気づいた場合

$ git commit --amend 

すかさず --amend 付けてコミットすればよい。

コメントを書き直す(履歴をさかのぼって)

いくつかコミットをしたあとに、過去のコミットのコメントが間違っていたことに気づいた場合

$ git log --oneline
aaaaaaa (HEAD -> main) 正しいコメント
bbbbbbb 間違ったコメント
ccccccc 正しいコメント

rebaseで間違っているコミットの一つ前に戻り

$ git rebase -i ccccccc

pick aaaaaaa 正しいコメント
pick bbbbbbb 間違ったコメント

pickをeditに書き換えてエディタを終了

pick aaaaaaa 正しいコメント
edit bbbbbbb 間違ったコメント

amendでコメントを修正して

$ git rebase -i ccccccc
Stopped at bbbbbbb...  間違ったコメント
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue
$ git commit --amend

continueでrebaseを完了させる

$ git commit --continue

付けてはいけないのにうっかり --amend をつけてコミットしてしまった

$ git reset HEAD@{1}

コマンド実行履歴などを使っていると、うっかり amend を付けてはいけない時に付けてしまうことがたまにある。そのような場合、単に git reset --hard HEAD^ では前のコミットは戻ってこない。すでに amend でコミットそのものが編集されてしまっているので。
そこで reflog を使用して元に戻す。
ちなみにreflogを使うと、単純なコマンド使用では回復できない状態でも、よほど致命的なことがない限りログをさかのぼることができて、いざというときに有用。

merge をなかったことにする

$ git reset --hard ORIG_HEAD

ファイルの編集をなかったことにする

$ git checkout HEAD -- <file>

編集したファイルを、元あった場所から取り直してくるということ。
なお、うっかりファイルを削除した場合でもこれで取り直せる。

rmしたことをなかったことにする

git restore --staged <file>
git restore <file>

(多分)一発で戻すことはできなくて、一旦stageから降ろしてきた後に最終的になかったことにします。

git の管理下にあることをなかったことにする

$ git update-index --assume-unchanged <file>

例えば配布はするけど管理は各リポジトリごとに別々で行いたい(一例として、環境に依存する設定ファイルとか)場合に重宝する。

なお、元に戻したいときは

$ git update-index --no-assume-unchanged <file>

とする。

http://qiita.com/usamik26/items/56d0d3ba7a1300625f92 を参考にさせていただきました。)

後書き

なかったことにするのに revert については触れないのか?と思った方もいるでしょう。しかし、revert はある意味では commit をなかったことにしていますが、commit をなかったことにしたことをなかったことにはしません。commit を取り消したことがちゃんとログに残ります。ですので、この記事の趣旨とは外れるため、あえて触れませんでした。

73
79
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
79

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?