web-dev-qa-db-ja.com

Git commitからファイルを削除する

私はGitを使用していますが、使用しているファイルはほとんどありません。 

git commit -a

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

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

1249
Mojoy

なぜなら、これは誤ってコミットされたファイルを前のコミットからステージング領域に戻すための変更であり、それらに対する変更を取り消すのではないからです。 Paritosh Singhが示唆したようにこれを行うことができます。

git reset --soft HEAD^ 

または

git reset --soft HEAD~1

それからそれらをコミットから除外するために不要なファイルをリセットします。

git reset HEAD path/to/unwanted_file

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

git commit -c ORIG_HEAD  
2425
juzzlin

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

これが最後のコミットで、 ローカルとリモートのリポジトリからファイルを完全に削除したい場合 、 

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

修正フラグはgitに再度コミットするよう指示しますが、(2つのブランチをマージするという意味ではなく)このコミットを最後のコミットと "マージ"します。

コメントで述べたように、ここでgit rmを使用することは、rmコマンド自体を使用することに似ています。

255
CharlesB

既存の答えはすべて、 last コミットから不要なファイルを削除することです。

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

1。

ファイルに準拠させたいコミットを見つけます。

git checkout <commit_id> <path_to_file>

多数のファイルを削除したい場合は、これを複数回実行できます。

2。

git commit -am "remove unwanted files"

3。

ファイルが誤って追加されたcommit のcommit_idを見つけよう、ここで "35c23c2"としましょう。

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

このコマンドは設定に従ってエディタを開きます。デフォルトはvimです。

最後のコミット( "不要なファイルの削除")を誤ったコミットの次の行(この例では "35c23c2")に移動し、コマンドをfixupに設定します。

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

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

終わる : 

git Push -f

不幸にも矛盾が生じた場合は、手動で解決しなければなりません。

125
Brian

受け入れられた答えが示すように、あなたは全体のコミットをリセットすることによってこれを行うことができます。しかし、これはどちらかといえば重いやり方です。
これを行うためのよりクリーンな方法は、コミットを維持し、それから変更されたファイルを単に削除することです。

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

git resetは、前回のコミットと同じようにファイルを取得し、それをインデックスにステージします。作業ディレクトリ内のファイルはそのままです。
git commitは、コミットしてインデックスを現在のコミットに変換します。

これは本質的に前回のコミットにあったファイルのバージョンをとり、それを現在のコミットに追加します。これによって最終的な変更は発生しないため、ファイルは事実上コミットから削除されます。

90
Patrick

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

git reset --soft HEAD~1

それはすべての変更をリセットして1つのコミットに戻ります

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

35
Paritosh Singh

Rmを使ってファイルを削除すると削除されます。

削除するのではなく、常にgitでコミットに追加しているので、この例ではファイルを最初のコミット前の状態に戻します(ファイルが新しい場合はdelete 'rm'アクションかもしれません)。再度コミットするとファイルは移動します。

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

    git checkout <commit_id> <path_to_file>

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

    git checkout Origin/master <path_to_file>

それからコミットを修正すると、ファイルがリストから消えた(そしてあなたのディスクから削除されていない)ことがわかるでしょう。

35
Bob Flannigon
git checkout HEAD~ path/to/file
git commit --amend
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
28
ThatsAMorais

例を挙げて説明します。
A、B、Cを3回連続してコミットするとします。コミットBにはコミットしてはいけないファイルが含まれています。

git log  # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git Push --force-with-lease <branchName>    
11
Moaz Rashad

コミットを保存したい場合(おそらくもう少し時間をかけて詳細なコミットメッセージを書いていて失くしたくないでしょう)、コミットからファイルを削除したいだけで、リポジトリから完全に削除したくない場合

git checkout Origin/<remote-branch> <filename>
git commit --amend
9
mattexx

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

これが共有ブランチではなく、 履歴の書き換え を気にしないと仮定してから、次のコマンドを実行します。

git gui citool --amend

誤ってコミットされたファイルのチェックを外して「コミット」をクリックすることができます。

enter image description here

ファイルはコミットから削除されますが、 ディスク上に保持されます 。そのため、誤って追加した後にファイルのチェックを外した場合は、未チェックのファイルリストに表示されます(誤って変更した後にチェックを外した場合は、コミットリストには表示されません).

9
JDiMatteo
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

ローカルファイルはそのまま残します。ファイルをローカルにも使用したくない場合は、 - cacheオプションを省略できます。

すべての作業が自分のローカルブランチにある場合は、後でコミットするためにファイルを保存する必要があります。履歴を整理するのと同じように、これを実行するためのもっと簡単な方法があると思います。

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>^

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

8
Bryan Buckley

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

//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'
5

誤ってコミットにファイルを追加した場合、次のようなことができます

git rm --cached path_to_file

必ず--cachedを使用してください。そうしないと、ファイルもプロジェクトから削除されます。

4
HamzaMushtaq

私は余分なコマンドを実行しなければならなかったのでちょうどちょうどトップの答えを補完したいと思いました:

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

乾杯!

4
andrepo

git reset --soft HEAD^はコミットを元に戻し、git statusと入力すると、何をするべきかがわかります。

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
3
cardamom

私にとってはうまくいったが、それでももっと良い解決策があるべきだと思う:

$ git revert <commit_id>
$ git reset HEAD~1 --hard

破棄したい変更を他のコミットに残し、他のメンバーをチェックアウトするだけです。

$ git commit --amend // or stash and rebase to <commit_id> to amend changes
3
saiyancoder

実際のところ、私はより速くより簡単な方法はgit rebase interactiveモードを使うことだと思います。

git rebase -i head~1  

(または頭4、どこまで行きたいですか)

それから、 'pick'の代わりに 'edit'を使用してください。

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

あなたがそれが役に立つのを見つけることを願っています。 

2
Matt

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

feature/target_branch以下は、特定のファイルを元に戻したいものも含めて、すべての変更点を示しています)

Origin/feature/target_branchは変更をプッシュしたいリモートブランチです)

feature/stagingは私の一時的なステージングブランチで、そのファイルへの変更を除く、私が望むすべての変更からプッシュします)

  1. 私のOrigin/feature/target_branchからローカルブランチを作成し、feature/stagingと呼びます。

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

  3. feature/staging then git reset --soft ORIG_HEAD (今やfeature/stagingからのすべての変更はステージされますがコミットされません)

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

  5. feature/stagingのアップストリームブランチを Origin/feature/target_branch に変更しました

  6. 残りの段階的な変更をコミットして上流に私のリモートにプッシュしました Origin/feature/target_branch

2
user1201303

そのファイルがもう必要ない場合は、あなたがすることができます

git rm file
git commit --amend
git Push Origin branch
1
tven

以前のコミットからファイルを削除したい場合は、フィルタを使用してください。

git filter-branch --Prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

このエラーが表示されたら:

新しいバックアップを作成できません。以前のバックアップはすでにrefs/originalに存在します/ -fでバックアップを強制的に上書きする

あなたの地域のリポジトリにあるrefsバックアップを削除するだけです。

$ rm -rf .git/refs/original/refs
0
wilo087

GitHubを使用していて、まだコミットを進めていない場合は、GitHubデスクトップがこの問題を簡単に解決します。

  1. [リポジトリ] - > [最新のコミットを元に戻す]を選択します。
  2. 誤って追加したファイルを選択解除します。以前のコミットメッセージはすでにダイアログボックスに表示されています。
  3. 確定ボタンを押してください。
0
Ron

現在のファイルを別のフォルダーにコピーしてから、プッシュされていないすべての変更を削除します:

git reset --hard @{u}

その後、コピーします。コミット、プッシュ。

0
Miranda

変更をgitにプッシュしてもいけない場合

git reset --soft HEAD~1

それはすべての変更をリセットして1つのコミットに戻ります

これが最後のコミットで、ローカルおよびリモートのリポジトリからファイルを削除したい場合は、次の手順を試してください。

git rm <file>
 git commit --amend

またはもっと良い:

最初にリセット

git reset --soft HEAD~1

不要なファイルをリセットする

git reset HEAD path/to/unwanted_file

もう一度コミットする

git commit -c ORIG_HEAD  
0
TanvirChowdhury

これは私が最初にファイルをブランチにプッシュしたビットバケットリポジトリからファイルを削除するのに役立ちます。

git checkout Origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git Push
0
swathi