回答:
git reset --soft HEAD~1
あなたがしたいことをする必要があります。この後、インデックスが最初に変更され(で表示されgit diff --cached
ます)、最新の変更はステージングされません。git status
その後、次のようになります。
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
その後git add foo.java
、両方の変更を一度に実行してコミットできます。
git commit --amend
です。しかし、はるかに複雑なワークフローです。これは、良い方向性を示しているにもかかわらず、OPが尋ねた質問には答えません(git reset
)。
git reset --soft HEAD~
使用する:
git reset HEAD^
これにより、デフォルトで「混合」リセットが行われ、ユーザーが要求したことを実行します。foo.javaをアンステージングして、最新のコミットを削除します。
git reset --soft
機能しませんでしたが、機能git reset HEAD^
しました
私には、次の方法がより読みやすい(したがって望ましい)方法です。
git reset HEAD~1
の代わりに1
、ステージングを解除するコミットがいくつあってもかまいません。
git reset --soft
それはそのためだけです:に似git reset --hard
ていますが、ファイルには触れません。
git reset
「のようですgit reset --hard
が、ファイルには触れません。」ないgit reset --soft
。git reset --soft
変更をステージングするので、コミットする場合にステージングに追加する必要はありませんが、変更しない場合はgit reset
(はい、2回目、なしで--soft
)追加する必要があります。その答えは短いですが、正しくありません。
「リセット」は、変更をローカルで元に戻す方法です。コミットするときは、最初に「git add」で含める変更を選択します。これは「ステージング」と呼ばれます。そして、変更がステージングされたら、それらを「git commit」します。
ステージングまたはコミットのいずれかからバックアウトするには、HEADを「リセット」します。ブランチでは、HEADは最新のコミットを指すgit変数です。したがって、ステージングしたがコミットしていない場合は、「git reset HEAD」になります。これは、ステージから変更を取り除いて現在のHEADにバックアップします。「git reset --mixed HEAD〜0」の省略形です。
すでにコミットしている場合は、HEADはすでに進んでいるため、以前のコミットにバックアップする必要があります。ここでは、「reset HEAD〜1」または「reset HEAD ^ 1」または「reset HEAD〜」または「reset HEAD ^」-すべての参照HEADから1を引いたものです。
どちらが良い記号ですか、〜または^?〜チルドを単一のストリームと考えてください-各コミットに単一の親があり、それがシーケンスの一連の変更である場合、チルドを使用してストリームをバックアップして参照できます(HEAD〜1、HEAD〜2、HEAD) 〜3、親、祖父母、曾祖父母など(技術的には、初期の世代の最初の親を見つけます)。
マージがある場合、コミットには複数の親があります。そのとき、^キャレットが出てきます。ブランチが一緒に表示されるので、覚えておくことができます。キャレットを使用すると、HEAD ^ 1が1つのコミットの最初の親になり、HEAD ^ 2が2番目の親になります(たとえば、母親と父親)。
したがって、単一の親のコミットで1ホップ戻るだけの場合、HEAD〜とHEAD ^は同等です。どちらでも使用できます。
また、リセットは--soft、 mixed、または--hardに。ソフトリセットはコミットをバックアウトするだけです-ヘッドをリセットしますが、以前のコミットからのファイルをチェックアウトしないため、作業ディレクトリ内のすべての変更が保持されます。また、-- soft resetはステージ(indexとも呼ばれます)もクリアしないため、ステージングされたすべてのファイルはステージ上に残ります。
--mixedすべての変更が保存されますが、ステージをクリアしているので、リセット(デフォルトでは)また、以前のコミットからファイルをチェックアウトしません。これが、単純な「git reset HEAD」がステージから消える理由です。
--hard先にコミットし、それがすべての変更を上書きするので、すべてのファイルからリセットはHEADをリセットし、そしてそれは、ステージをクリアしますが、それもチェックします。
コミットをリモートリポジトリにプッシュした場合、リセットはうまく機能しません。ローカルでリセットできますが、リモートにプッシュしようとすると、ローカルヘッドがリモートブランチのヘッドの背後にあることがgitに表示され、プッシュが拒否されます。あなたはプッシュを強制することができるかもしれませんが、gitは実際にそれをするのが好きではありません。
または、変更を保持したい場合は、変更を隠しておき、以前のコミットをチェックアウトし、変更を元に戻し、それらをステージングし、新しいコミットを作成してからプッシュします。
変更をnコミットまでステージング解除したいとしましょう。
コミットハッシュは次のとおりです。
次に、次のコマンドを実行します。
git reset hn
これで、HEADはhn + 1になります。h1からhnへの変更はステージングされません。