私はGitを使用しており、使用していくつかのファイルをコミットしました
git commit -a
後で、ファイルが誤ってコミットに追加されていることがわかりました。
最後のコミットからファイルを削除するにはどうすればよいですか?
私はGitを使用しており、使用していくつかのファイルをコミットしました
git commit -a
後で、ファイルが誤ってコミットに追加されていることがわかりました。
最後のコミットからファイルを削除するにはどうすればよいですか?
ここでの他の回答は間違っていると思います。これは、誤ってコミットされたファイルを、変更をキャンセルせずに、以前のコミットからステージング領域に戻す問題であるためです。これは、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
注意!以前のコミットからファイルを削除してディスクに保存したいだけの場合は、上記の juzzlin の回答をお読みください。
これが最後のコミットであり、ローカルおよびリモート リポジトリからファイルを完全に削除したい場合は、次のことができます。
git rm <file>
git commit --amend
amend フラグは git に再度コミットするように指示しますが、このコミットを最後のコミットと「マージ」します (2 つのブランチをマージするという意味ではありません)。
コメントで述べたように、git rm
ここで使用することは、rm
コマンド自体を使用するようなものです!
既存の回答はすべて、最後のコミットから不要なファイルを削除することについて話しています。
古いコミットから不要なファイルを削除したい場合(プッシュされた場合でも)、アクションのために不要な新しいコミットを作成したくない場合:
git log --graph --decorate --oneline
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
残念ながら競合が発生した場合は、手動で解決する必要があります。
サーバーに変更をプッシュしていない場合は、使用できます
git reset --soft HEAD~1
すべての変更がリセットされ、1 つ前のコミットに戻ります。
変更をプッシュした場合は、@CharlesB が回答した手順に従ってください
rm を使用してファイルを削除すると、ファイルが削除されます。
削除するのではなく、常に git でコミットに追加しているため、この場合、ファイルを最初のコミット前の状態に戻し (ファイルが新しい場合、これは削除 '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
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>^
より複雑なコマンドを覚えたり、メッセージをコミットしたり、タイプしたりすることなく、リベースを簡単に完了することができます。
git GUI を使用すると、以前のコミットからファイルを簡単に削除できます。
これが共有ブランチではなく、 history を書き換えても構わないと仮定して、次を実行します。
git gui citool --amend
誤ってコミットされたファイルのチェックを外してから、「コミット」をクリックします。
ファイルはコミットから削除されますが、ディスクには保持されます。そのため、誤ってファイルを追加した後にファイルのチェックを外した場合、追跡されていないファイルのリストに表示されます (ファイルを誤って変更した後にチェックを外した場合、コミット リストにステージングされていない変更に表示されます)。
コミットを保持したい場合 (おそらく、詳細なコミット メッセージを作成するのに時間がかかり、それを失いたくない場合があります)、ファイルをコミットからのみ削除し、リポジトリからは完全に削除したくない場合:
git checkout origin/<remote-branch> <filename>
git commit --amend
次の一連のコマンドを実行します。
//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 reset --soft HEAD^
git checkout origin/master <filepath>
乾杯!
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.
1つのファイルだけを元に戻したいローカルブランチに変更があるという同じ問題がありました。私にとってうまくいったのは-
(以下の feature/target_branchは、特定のファイルに対して元に戻したいものを含むすべての変更がある場所です)
( origin/feature/target_branchは、変更をプッシュするリモート ブランチです)
(機能/ステージングは一時的なステージング ブランチであり、その 1 つのファイルへの変更を除いて、必要なすべての変更をプッシュします)
origin/feature/target_branchからローカル ブランチを作成します- これをfeature/stagingと呼びます
作業中のローカル ブランチfeature/target_branch をfeature/stagingブランチにマージしました
機能/ステージングをチェックアウトしてからgit reset --soft ORIG_HEAD (機能/ステージングからのすべての変更はステージングされますが、コミットされません。)
不要な変更を加えて以前にチェックインしたファイルのステージングを解除しました
機能/ステージングの上流ブランチを origin/feature/target_branchに変更しました
ステージングされた残りの変更をコミットし、リモートの origin/feature/target_branchにアップストリームにプッシュしました
実際、より迅速で簡単な方法は、git rebase インタラクティブ モードを使用することだと思います。
git rebase -i head~1
(またはhead~4、どこまでも行きたい)
そして、'pick' の代わりに 'edit' を使用します。「編集」がどれほど強力かを知りませんでした。
https://www.youtube.com/watch?v=2dQosJaLN18
お役に立てば幸いです。
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)