私はGitを使用していますが、使用しているファイルはほとんどありません。
git commit -a
後で、ファイルが誤ってコミットに追加されたことがわかりました。
最後のコミットからファイルを削除するにはどうすればいいですか?
なぜなら、これは誤ってコミットされたファイルを前のコミットからステージング領域に戻すための変更であり、それらに対する変更を取り消すのではないからです。 Paritosh Singhが示唆したようにこれを行うことができます。
git reset --soft HEAD^
または
git reset --soft HEAD~1
それからそれらをコミットから除外するために不要なファイルをリセットします。
git reset HEAD path/to/unwanted_file
もう一度コミットします。同じコミットメッセージを再利用することもできます。
git commit -c ORIG_HEAD
_注意_ !前回のコミットからファイルを削除したいだけで、ディスクに保存してくださいの場合は、 juzzlinの答え を読んでください。
これが最後のコミットで、 ローカルとリモートのリポジトリからファイルを完全に削除したい場合 、
git rm <file>
を削除します。git commit --amend
修正フラグはgitに再度コミットするよう指示しますが、(2つのブランチをマージするという意味ではなく)このコミットを最後のコミットと "マージ"します。
コメントで述べたように、ここでgit rm
を使用することは、rm
コマンド自体を使用することに似ています。
既存の答えはすべて、 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
不幸にも矛盾が生じた場合は、手動で解決しなければなりません。
受け入れられた答えが示すように、あなたは全体のコミットをリセットすることによってこれを行うことができます。しかし、これはどちらかといえば重いやり方です。
これを行うためのよりクリーンな方法は、コミットを維持し、それから変更されたファイルを単に削除することです。
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
は、前回のコミットと同じようにファイルを取得し、それをインデックスにステージします。作業ディレクトリ内のファイルはそのままです。git commit
は、コミットしてインデックスを現在のコミットに変換します。
これは本質的に前回のコミットにあったファイルのバージョンをとり、それを現在のコミットに追加します。これによって最終的な変更は発生しないため、ファイルは事実上コミットから削除されます。
変更をサーバーにプッシュしていない場合は、使用できます。
git reset --soft HEAD~1
それはすべての変更をリセットして1つのコミットに戻ります
変更をプッシュした場合は、@ CharlesBが回答した手順に従ってください。
Rmを使ってファイルを削除すると削除されます。
削除するのではなく、常にgitでコミットに追加しているので、この例ではファイルを最初のコミット前の状態に戻します(ファイルが新しい場合はdelete 'rm'アクションかもしれません)。再度コミットするとファイルは移動します。
ファイルを以前の状態に戻すには
git checkout <commit_id> <path_to_file>
またはリモートのHEADの状態に戻すには、
git checkout Origin/master <path_to_file>
それからコミットを修正すると、ファイルがリストから消えた(そしてあなたのディスクから削除されていない)ことがわかるでしょう。
git checkout HEAD~ path/to/file
git commit --amend
以下はあなたが意図したファイルだけを展開します、それは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
例を挙げて説明します。
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>
コミットを保存したい場合(おそらくもう少し時間をかけて詳細なコミットメッセージを書いていて失くしたくないでしょう)、コミットからファイルを削除したいだけで、リポジトリから完全に削除したくない場合
git checkout Origin/<remote-branch> <filename>
git commit --amend
Git GUIを使用すると、以前のコミットからファイルを簡単に削除できます。
これが共有ブランチではなく、 履歴の書き換え を気にしないと仮定してから、次のコマンドを実行します。
git gui citool --amend
誤ってコミットされたファイルのチェックを外して「コミット」をクリックすることができます。
ファイルはコミットから削除されますが、 ディスク上に保持されます 。そのため、誤って追加した後にファイルのチェックを外した場合は、未チェックのファイルリストに表示されます(誤って変更した後にチェックを外した場合は、コミットリストには表示されません).
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>^
これにより、より複雑なコマンドを覚えたり、メッセージをコミットしたり、入力したりすることなく、簡単にリベースを完了できます。
以下の一連のコマンドを実行します。
//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'
誤ってコミットにファイルを追加した場合、次のようなことができます
git rm --cached path_to_file
必ず--cached
を使用してください。そうしないと、ファイルもプロジェクトから削除されます。
私は余分なコマンドを実行しなければならなかったのでちょうどちょうどトップの答えを補完したいと思いました:
git reset --soft HEAD^
git checkout Origin/master <filepath>
乾杯!
git reset --soft HEAD^
はコミットを元に戻し、git status
と入力すると、何をするべきかがわかります。
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
私にとってはうまくいったが、それでももっと良い解決策があるべきだと思う:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
破棄したい変更を他のコミットに残し、他のメンバーをチェックアウトするだけです。
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
実際のところ、私はより速くより簡単な方法はgit rebase interactiveモードを使うことだと思います。
git rebase -i head~1
(または頭4、どこまで行きたいですか)
それから、 'pick'の代わりに 'edit'を使用してください。
https://www.youtube.com/watch?v=2dQosJaLN18
あなたがそれが役に立つのを見つけることを願っています。
1つのファイルだけを元に戻したいと思っていたローカルブランチで変更があったのと同じ問題がありました。私にとってうまくいったのは -
(feature/target_branch以下は、特定のファイルを元に戻したいものも含めて、すべての変更点を示しています)
(Origin/feature/target_branchは変更をプッシュしたいリモートブランチです)
(feature/stagingは私の一時的なステージングブランチで、そのファイルへの変更を除く、私が望むすべての変更からプッシュします)
私のOrigin/feature/target_branchからローカルブランチを作成し、feature/stagingと呼びます。
作業中のローカルブランチfeature/target_branchをfeature/stagingブランチに統合しました
feature/staging then git reset --soft ORIG_HEAD (今やfeature/stagingからのすべての変更はステージされますがコミットされません)
以前にチェックインしたファイルを不要な変更を加えてステージング解除しました
feature/stagingのアップストリームブランチを Origin/feature/target_branch に変更しました
残りの段階的な変更をコミットして上流に私のリモートにプッシュしました Origin/feature/target_branch
そのファイルがもう必要ない場合は、あなたがすることができます
git rm file
git commit --amend
git Push Origin branch
以前のコミットからファイルを削除したい場合は、フィルタを使用してください。
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
GitHubを使用していて、まだコミットを進めていない場合は、GitHubデスクトップがこの問題を簡単に解決します。
現在のファイルを別のフォルダーにコピーしてから、プッシュされていないすべての変更を削除します:
git reset --hard @{u}
その後、コピーします。コミット、プッシュ。
変更を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
これは私が最初にファイルをブランチにプッシュしたビットバケットリポジトリからファイルを削除するのに役立ちます。
git checkout Origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git Push