私はGitを使用していて、
git commit -a
後で、ファイルが誤ってコミットに追加されたことがわかりました。
最後のコミットからファイルを削除するにはどうすればよいですか?
git reset filepath
私はGitを使用していて、
git commit -a
後で、ファイルが誤ってコミットに追加されたことがわかりました。
最後のコミットからファイルを削除するにはどうすればよいですか?
git reset filepath
回答:
これは他の答えは間違っていると思います。これは、誤ってコミットされたファイルを以前のコミットからステージング領域に戻し、それらに加えられた変更を取り消さないようにするためです。これは、Paritosh Singhが提案したように実行できます。
git reset --soft HEAD^
または
git reset --soft HEAD~1
次に、不要なファイルをリセットして、コミットから除外します。
git reset HEAD path/to/unwanted_file
もう一度コミットします。同じコミットメッセージを再利用することもできます。
git commit -c ORIG_HEAD
git push
、修正をレポまで実行しようとすると、文句が表示されますUpdates were rejected because the tip of your current branch is behind its remote counterpart.
。あなたがそれらをプッシュしたいことが確かである場合(例えば、それがあなたのフォークである場合)-f
、プッシュを強制するオプションを使用することができますgit push origin master -f
。(他のユーザーが取得している上流のリポジトリに対してこれを行わないでください)
git reset --soft HEAD^
私の最も一般的な元に戻す操作です
git reset
たが、「インプレース」の既存のコミットに影響を与える方法を望んでいました。について学んだgit commit -C
。だから私にとって、私が欲しいのは、もう1つのステップを含む正確なレシピgit commit -C [hash of original HEAD commit from first step]
です。
注意!以前のコミットからファイルを削除し、それをディスクに保持したいだけの場合は、上記のjuzzlinの答えを読んでください。
これが最後のコミットであり、ローカルおよびリモートリポジトリからファイルを完全に削除する場合は、次のことができます。
git rm <file>
git commit --amend
amendフラグはgitに再度コミットするように指示しますが、(2つのブランチをマージする意味ではなく)このコミットを最後のコミットと「マージ」します。
コメントで述べたように、git rm
ここでの使用はrm
コマンド自体の使用と似ています!
git rm --cached
ファイルをディスクに保存するためにも使用できます
rm
inは、それ自体が行うことです!git
rm
git commit --amend
はまだそこにあり、たとえばで見つけることができますgit reflog
。したがって、他のコメントが示唆するほど悪くはありません。
既存の答えはすべて、最後のコミットから不要なファイルを削除することについて話している。
古いコミットから不要なファイルを削除したい場合(プッシュした場合でも)、新しいコミットを作成したくない場合は、アクションのために不要です。
1。
ファイルに準拠させるコミットを見つけます。
git checkout <commit_id> <path_to_file>
多数のファイルを削除する場合は、これを複数回実行できます。
2。
git commit -am "remove unwanted files"
3。
ファイルが誤って追加されたコミットの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 rm --cached <file(s)>
。
--fixup=35c23c2
、git commit
コマンドに追加することで少し簡単になります。これにより、必要なコミットのフィックスアップとしてコミットが自動的に設定されるため、リベースで指定する必要はありません。さらに、コマンドに追加する--autosquash
とgit rebase
、gitはコミットを正しい場所に自動的に移動するので、インタラクティブなリベースで何もする必要はありません。結果を保存するだけです(つまり、-i
フラグを立てる必要さえありません。とにかく私はそれを使ってすべてが期待どおりに見えることを確認するのが好きです)。
受け入れられた回答が示すように、コミット全体をリセットすることでこれを行うことができます。しかし、これはかなり強引なアプローチです。
これを行うためのよりクリーンな方法は、コミットを維持し、変更されたファイルを単にコミットから削除することです。
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
それは、前にあったように、ファイルを取るコミットし、インデックスにそれを上演します。作業ディレクトリ内のファイルはそのままです。
次にgit commit
、インデックスをコミットし、現在のコミットにスカッシュします。
これは基本的に、以前のコミットにあったファイルのバージョンを取得して、現在のコミットに追加します。これにより最終的な変更は発生しないため、ファイルはコミットから効果的に削除されます。
サーバーに変更をプッシュしていない場合は、使用できます
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
例を挙げて説明します。
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>
noop
するedit [A_commit_ID]
かe [A_commit_ID]
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を使用すると、以前のコミットからファイルを簡単に削除できます。
これが共有ブランチではなく、履歴を書き換えても構わないと想定して、次のコマンドを実行します。
git gui citool --amend
誤ってコミットしたファイルのチェックを外して、「コミット」をクリックします。
ファイルはコミットから削除されますが、ディスク上に保持されます。そのため、誤って追加した後でファイルのチェックを外すと、追跡されていないファイルのリストに表示されます(誤って変更した後でファイルのチェックを外すと、コミットリストにステージングされていない変更に表示されます)。
sudo apt-get install git-gui
git rebase -i HEAD~4
でしたが、私は最初に利用してから、コマンドを実行してエディターを開きました。別のメモ:「ステージング解除」は「コミット」メニューにあります。
git reset --soft HEAD^
、(- soft argを覚えておく)を使用するよりもエラーが発生しにくく、その後にgit commit -c ORIG_HEAD
(すべてを台無しにする--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 revert <commit_id>
$ git reset HEAD~1 --hard
破棄したい変更を他のコミットに残し、他のコミットをチェックしてください
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
実際には、git rebaseインタラクティブモードを使用する方が速くて簡単な方法だと思います。
git rebase -i head~1
(またはhead〜4、どこまで行きたいか)
次に、「選択」の代わりに「編集」を使用します。「編集」がいかに強力であるかを理解していませんでした。
https://www.youtube.com/watch?v=2dQosJaLN18
お役に立てれば幸いです。
ローカルブランチで1つのファイルだけを元に戻したいという変更があったのと同じ問題がありました。私のために働いたのは-
(以下のfeature / target_branchには、特定のファイルで元に戻したい変更を含むすべての変更があります)
(origin / feature / target_branchは、変更をプッシュするリモートブランチです)
(機能/ステージングは一時的なステージングブランチであり、その1つのファイルへの変更を除くすべての必要な変更からプッシュします)
origin / feature / target_branchからローカルブランチを作成します- フィーチャー/ステージングと呼ばれます
機能しているローカルブランチのfeature / target_branch をfeature / stagingブランチにマージしました
チェックアウト機能/ステージングその後、gitのリセット--soft ORIG_HEADを (今機能/ステージング」からのすべての変更が上演が、コミットされていないされます。)
以前に不要な変更を加えてチェックインしたファイルをアンステージングしました
機能/ステージングの上流ブランチを origin / feature / target_branchに変更しました
ステージングされた残りの変更をコミットし、上流のリモートorigin / feature / target_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
変更をまだ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
現在のところ、どの回答も妥当ではありません。実際のソリューションを提案する必要があるという十分な需要があるようです:https : //github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <ファイル名>
いいだろう。履歴を変更したくないのですが、ローカルで誤ってローカルの「ハック」ファイルを追加して、それをコミットから削除したい場合、これは非常に役立ちます。