1957

私はGitを使用しており、使用していくつかのファイルをコミットしました

git commit -a

後で、ファイルが誤ってコミットに追加されていることがわかりました。

最後のコミットからファイルを削除するにはどうすればよいですか?

4

33 に答える 33

3711

ここでの他の回答は間違っていると思います。これは、誤ってコミットされたファイルを、変更をキャンセルせずに、以前のコミットからステージング領域に戻す問題であるためです。これは、Paritosh Singh が提案したように実行できます。

git reset --soft HEAD^ 

また

git reset --soft HEAD~1

次に、コミットから除外するために、不要なファイルをリセットします (古い方法)。

git reset HEAD path/to/unwanted_file

Git以降、次の2.23.0ことができることに注意してください(新しい方法):

git restore --staged path/to/unwanted_file

再度コミットすると、同じコミット メッセージを再利用することもできます。

git commit -c ORIG_HEAD  
于 2013-03-10T10:56:37.877 に答える
374

注意以前のコミットからファイルを削除してディスクに保存したいだけの場合は、上記の juzzlin の回答をお読みください。

これが最後のコミットであり、ローカルおよびリモート リポジトリからファイルを完全に削除したい場合は、次のことができます。

  1. ファイルを削除しますgit rm <file>
  2. 修正フラグ付きでコミット:git commit --amend

amend フラグは git に再度コミットするように指示しますが、このコミットを最後のコミットと「マージ」します (2 つのブランチをマージするという意味ではありません)。

コメントで述べたように、git rmここで使用することは、rmコマンド自体を使用するようなものです!

于 2012-09-18T17:22:53.393 に答える
210

既存の回答はすべて、最後のコミットから不要なファイルを削除することについて話しています。

古いコミットから不要なファイルを削除したい場合(プッシュされた場合でも)、アクションのために不要な新しいコミットを作成したくない場合:

  1. ; を使用して、ファイルを準拠させたいコミットを見つけます。

git log --graph --decorate --oneline

  1. を使用してコミットするチェックアウト

git checkout <commit_id> <path_to_file>

多くのファイルを削除する場合は、これを複数回行うことができます。

3.

git commit -am "remove unwanted files"

4.

ファイルが誤って追加されたコミットの commit_id を見つけます。ここでは「35c23c2」としましょう

git rebase 35c23c2~1 -i // notice: "~1" is necessary

このコマンドは、設定に従ってエディターを開きます。デフォルトは vim です。グローバル git エディターを変更する場合は、次を使用します。

git config --global core.editor <editor_name>

5.

「不要なファイルを削除する」という最後のコミットを、間違ったコミット (この場合は「35c23c2」) の次の行に移動し、コマンドを次のように設定しfixupます。

pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files

ファイルを保存した後は、うまくいくはずです。

6.

終わる :

git push -f

残念ながら競合が発生した場合は、手動で解決する必要があります。

于 2015-01-27T15:24:57.883 に答える
56

サーバーに変更をプッシュしていない場合は、使用できます

git reset --soft HEAD~1

すべての変更がリセットされ、1 つ前のコミットに戻ります。

変更をプッシュした場合は、@CharlesB が回答した手順に従ってください

于 2012-09-18T18:28:35.340 に答える
44

rm を使用してファイルを削除すると、ファイルが削除されます。

削除するのではなく、常に git でコミットに追加しているため、この場合、ファイルを最初のコミット前の状態に戻し (ファイルが新しい場合、これは削除 'rm' アクションである可能性があります)、次に再コミットすると、ファイルが移動します。

ファイルを以前の状態に戻すには:

    git checkout <commit_id> <path_to_file>

または、リモート HEAD の状態に戻すには:

    git checkout origin/master <path_to_file>

次にコミットを修正すると、ファイルがリストから消えていることがわかります (ディスクからは削除されていません!)。

于 2013-01-28T14:00:04.950 に答える
39
git checkout HEAD~ path/to/file
git commit --amend
于 2013-08-23T19:01:20.817 に答える
33

以下は、意図したファイルだけをステージング解除します。これは、OP が要求したものです。

git reset HEAD^ /path/to/file

次のようなものが表示されます...

コミットする変更: (「git reset HEAD ...」を使用してステージングを解除します)

変更: /path/to/file

コミットのためにステージングされていない変更: (「git add ...」を使用して、コミットされる内容を更新します) (「git checkout -- ...」を使用して、作業ディレクトリの変更を破棄します)

変更: /path/to/file

  • 「コミットされる変更」は、コミット前のファイルの以前のバージョンです。ファイルが存在しなかった場合、これは削除のように見えます。この変更をコミットすると、変更をブランチ内のファイルに戻すリビジョンが作成されます。
  • 「コミットのためにステージングされていない変更」は、コミットした変更であり、ファイルの現在の状態です

この時点で、別のバージョンにリセットするなど、ファイルに対して好きなことを行うことができます。

コミットする準備ができたら:

git commit --amend -a

または(まだコミットしたくない他の変更が進行中の場合)

git commit add /path/to/file
git commit --amend
于 2014-12-07T07:13:42.430 に答える
17
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

ローカルファイルはそのまま残ります。ファイルをローカルに保存したくない場合は、 --cached オプションをスキップできます。

すべての作業がローカル ブランチで行われている場合は、後のコミットでファイルを保持する必要があります。クリーンな履歴を持つように、これを行うためのより簡単な方法は次のようになると思います。

git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^

より複雑なコマンドを覚えたり、メッセージをコミットしたり、タイプしたりすることなく、リベースを簡単に完了することができます。

于 2016-02-23T06:22:47.903 に答える
14

git GUI を使用すると、以前のコミットからファイルを簡単に削除できます。

これが共有ブランチではなく、 history を書き換えても構わないと仮定して、次を実行します。

git gui citool --amend

誤ってコミットされたファイルのチェックを外してから、「コミット」をクリックします。

ここに画像の説明を入力

ファイルはコミットから削除されますが、ディスクには保持されます。そのため、誤ってファイルを追加した後にファイルのチェックを外した場合、追跡されていないファイルのリストに表示されます (ファイルを誤って変更した後にチェックを外した場合、コミット リストにステージングされていない変更に表示されます)。

于 2015-05-18T19:50:19.287 に答える
10

コミットを保持したい場合 (おそらく、詳細なコミット メッセージを作成するのに時間がかかり、それを失いたくない場合があります)、ファイルをコミットからのみ削除し、リポジトリからは完全に削除したくない場合:

git checkout origin/<remote-branch> <filename>
git commit --amend
于 2013-06-17T20:07:30.910 に答える
6

次の一連のコマンドを実行します。

//to remove the last commit, but preserve changes  
git reset --soft HEAD~1

//to remove unneded file from the staging area  
git reset HEAD `<your file>` 

//finally make a new commit  
git commit -m 'Your message'
于 2015-09-10T11:51:50.553 に答える
6

追加のコマンドを実行する必要があったため、上位の回答を補足したかっただけです。

git reset --soft HEAD^
git checkout origin/master <filepath>

乾杯!

于 2016-05-25T15:24:40.623 に答える
5
git reset --soft HEAD~1. 

This will undo the last commit in local repos and move everything back to stage area like before doing the commit. Then just use any Git UI tool as normal (like TortoiseGit, Git UI, Git Extensions...) to unstage the files that we do not want to commit then do the commit again.

于 2020-08-14T07:37:43.033 に答える
3

1つのファイルだけを元に戻したいローカルブランチに変更があるという同じ問題がありました。私にとってうまくいったのは-

(以下の feature/target_branchは、特定のファイルに対して元に戻したいものを含むすべての変更がある場所です)

( origin/feature/target_branchは、変更をプッシュするリモート ブランチです)

(機能/ステージングは​​一時的なステージング ブランチであり、その 1 つのファイルへの変更を除いて、必要なすべての変更をプッシュします)

  1. origin/feature/target_branchからローカル ブランチを作成します- これをfeature/stagingと呼びます

  2. 作業中のローカル ブランチfeature/target_branchfeature/stagingブランチにマージしました

  3. 機能/ステージングをチェックアウトしてからgit reset --soft ORIG_HEAD (機能/ステージングからのすべての変更はステージングされますが、コミットされません。)

  4. 不要な変更を加えて以前にチェックインしたファイルのステージングを解除しました

  5. 機能/ステージングの上流ブランチを origin/feature/target_branchに変更しました

  6. ステージングされた残りの変更をコミットし、リモートの origin/feature/target_branchにアップストリームにプッシュしました

于 2017-01-23T04:13:29.127 に答える
2

実際、より迅速で簡単な方法は、git rebase インタラクティブ モードを使用することだと思います。

git rebase -i head~1  

(またはhead~4、どこまでも行きたい)

そして、'pick' の代わりに 'edit' を使用します。「編集」がどれほど強力かを知りませんでした。

https://www.youtube.com/watch?v=2dQosJaLN18

お役に立てば幸いです。

于 2016-05-19T20:58:47.743 に答える
0
Here is the step to remove files from Git Commit.

>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
于 2020-05-21T04:50:44.360 に答える