ファイルを追加解除する最後のコミットを修正する方法は?


108

私は2つのファイルを変更したab最後にコミットします。しかし、ファイルbをコミットするべきではありません。これを修正するワークフローは何ですか?

回答:


109

更新(数年後)

ヤン・フデック

インデックスからのみ削除するのは簡単です。

True:最近の回答Matt Connollyによって書かれた)が示唆するように、ファイルをインデックスコンテンツに簡単にリセットできます。

git reset HEAD^ path/to/file/to/revert

HEAD^ファイルが最後のコミットのの以前のコミットでそのコンテンツにアクセスできるようにします。

次にgit commit --amend、最初に以下に書いたように、できます。


Git 2.23(2019年8月)では、新しいコマンドを使用できますgit restore

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

より短い:

 git restore -s@^ -S -- path/to/file/to/revert

繰り返しますがgit commit --amend、最初に以下に書いたように、できます。


元の回答(2011年1月)

これが最後のコミットである(そしてどこにもプッシュしていない)場合、修正できます:(
最初のstashまたはsave b

 git commit --amend

次にbを削除し、再コミットします。bを復元すれば完了です。

--amend

現在のブランチの先端を修正するために使用されます。
通常のように最新のコミットを置き換えるツリーオブジェクトを準備します(これには通常の-i / -oおよび明示的なパスが含まれます)。現在のブランチの先端からコミットログエディターにコミットメッセージがシードされます。
作成したコミットによって現在のヒントが置き換えられます(マージの場合、現在のヒントの親が親になります)。したがって、現在のトップコミットは破棄されます。


... Then stash/delete b, re-commit..、ここでの単語はいけませんThenことafter?- --amendstach /削除Bの後に、...
謝Jìléi

@谢继雷:言い換えると、bを最初に保存してから、コミット-修正してから復元しますか?本当です。答えを更新しました。
VonC

gitインデックスの力を使えば、誰にでもファイルを隠し/保存するように言うのは愚かなことです(-1)。インデックスからのみ削除するのは簡単です。
Jan Hudec

1
@JanHudec確かに、それに応じて答えを編集しました。Stack Overflowの場合ほど古い回答には従いませんでした。とにかく、SUに関するgitの質問の99%はSOに移行する必要があります。
VonC

66
  1. git diff --name-only HEAD^ -(オプション)最後のコミットで変更されたファイルをリストするために使用します。
  2. git reset HEAD^ path/to/file/to/revert- インデックスを最後のバージョンにリセットし、作業コピーをそのままにします。
  3. git commit --amend- インデックスの変更を含めるために最後のコミットを修正する

9
私はそれが受け入れられたものよりもはるかに良い答えです。
mik01aj

1
git commit -a --amendステップ3には使用しない(ファイルを追加しない)か、削除しようとしている編集である作業コピーの変更をコミットすることに注意してください。オプションのステップ2.5はgit checkout path/to/file/to/revert、作業コピーもクリーンアップすることです。
dmnd

1
git rm --cached path/to/file/to/revertツリーから削除せずにファイルを追加解除する代わりに。
Jan Hudec

13

またはgit gui、「Amend last commit」オプションを選択すると、追加されたファイルが「Staged」リストに表示され、そのアイコンをクリックして「Unstaged」リストに移動し、コミットします。


1
@VonC:パッチを編集および分割することは、重いgitユーザーにとって非常に一般的な操作であるため、guiは簡単にするように設計されており、IMOにとって最適なツールです。
1月Hudec

それはうまくいきます!その特定のタスクの他のオプションでは成功しませんでした。ヒントをありがとう!
セルグゼスト

10

最後のコミットからbを削除する場合

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

最後のコミットでbへのすべての変更を削除する場合

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cachedバックアップ/復元ダンスを廃止します(-1)。
1月Hudec

それを指摘してくれてありがとう。これは、スレッド全体を読んだ後でも最も快適だと感じたアプローチであったため、これをどのように行ったかを共有したかったのです。
ピンゴ

4

インデックスハッカーを必要としない代替手段ですが、それでも古いコミットメッセージは保持されます。

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

(a)定期的に使用するコマンドを使用し、(b)git add -pコミットしたい内容を正確に把握できるため、これが気に入っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.