Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

前置き

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

注意

この記事は、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 付けてコミットすればよい。

付けてはいけないのにうっかり --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 を取り消したことがちゃんとログに残ります。ですので、この記事の趣旨とは外れるため、あえて触れませんでした。

mdstoy
主に「自分用おぼえがき」や「人に説明するためのメモ」を書いていきたい
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