セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
メール
外部システム
サーバー管理
- 2.50.1 変更なし
-
2.50.0
2025-06-16
- 2.39.4 → 2.49.1 変更なし
-
2.39.3
2023-04-17
- 2.36.1 → 2.39.2 変更なし
-
2.36.0
2022-04-18
- 2.34.1 → 2.35.8 変更なし
-
2.34.0
2021-11-15
- 2.27.1 → 2.33.8 変更なし
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 変更なし
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 変更なし
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 変更なし
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 変更なし
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 変更なし
-
2.20.0
2018-12-09
- 2.15.4 → 2.19.6 変更なし
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.1.4 → 2.11.4 変更なし
-
2.0.5
2014-12-17
概要
git
reset
[-q
] [<tree-ish>] [--
] <pathspec>…git
reset
[-q
] [--pathspec-from-file=
<file> [--pathspec-file-nul
]] [<tree-ish>]git
reset
(--patch
|-p
) [<tree-ish>] [--
] [<pathspec>…]git
reset
[--soft
|--mixed
[-N
] |--hard
|--merge
|--keep
] [-q
] [<commit>]
説明
最初の3つの形式では、<tree-ish>からインデックスにエントリをコピーします。最後の形式では、現在のブランチのヘッド (HEAD
) を<commit>に設定し、必要に応じてインデックスとワーキングツリーを一致するように変更します。<tree-ish>/<commit>は、すべての形式でデフォルトでHEAD
になります。
git
reset
[-q
] [<tree-ish>] [--
] <pathspec>...git
reset
[-q
] [--pathspec-from-file=
<file> [--pathspec-file-nul
]] [<tree-ish>]-
これらの形式は、<pathspec>に一致するすべてのパスのインデックスエントリを、<tree-ish>の状態にリセットします。(ワーキングツリーや現在のブランチには影響しません。)
これは、
git
reset
<pathspec>がgit
add
<pathspec>の反対であることを意味します。このコマンドは、git
restore
[--source=
<tree-ish>]--staged
<pathspec>... と同等です。git
reset
<pathspec>を実行してインデックスエントリを更新した後、git-restore[1]を使用してインデックスの内容をワーキングツリーにチェックアウトできます。あるいは、git-restore[1]を使用し、--source
でコミットを指定することで、コミットの内容をパスからインデックスとワーキングツリーに一度にコピーできます。 git
reset
(--patch
|-p
) [<tree-ish>] [--
] [<pathspec>...]-
インデックスと<tree-ish> (デフォルトは
HEAD
) の差分からハンクをインタラクティブに選択します。選択されたハンクはインデックスに逆方向に適用されます。これは、
git
reset
-p
がgit
add
-p
の反対、つまりハンクを選択的にリセットするために使用できることを意味します。--patch
モードの操作方法については、git-add[1]の「インタラクティブモード」セクションを参照してください。 git
reset
[<mode>] [<commit>]-
この形式は、現在のブランチのヘッドを<commit>にリセットし、<mode>に応じてインデックス (<commit>のツリーにリセット) とワーキングツリーを更新する場合があります。操作の前に、
ORIG_HEAD
は現在のブランチの先端に設定されます。<mode>が省略された場合、デフォルトは--mixed
になります。<mode>は次のいずれかである必要があります。--soft
-
インデックスファイルもワーキングツリーも一切変更しません (ただし、すべてのモードと同様に、ヘッドを<commit>にリセットします)。これにより、
git
status
が示すように、すべての変更されたファイルが「コミット対象の変更」として残されます。 --mixed
-
インデックスはリセットしますが、ワーキングツリーはリセットしません (つまり、変更されたファイルは保持されますが、コミット対象としてマークされません) 。更新されていないものを報告します。これがデフォルトのアクションです。
-N
が指定された場合、削除されたパスはintent-to-add (追加予定) としてマークされます (git-add[1]を参照)。 --hard
-
インデックスとワーキングツリーをリセットします。<commit>以降にワーキングツリー内の追跡されているファイルに加えられた変更はすべて破棄されます。追跡されているファイルを書き込むのを妨げる、追跡されていないファイルまたはディレクトリは単純に削除されます。
--merge
-
インデックスをリセットし、<commit>と
HEAD
の間で異なるワーキングツリー内のファイルを更新しますが、インデックスとワーキングツリーの間で異なるファイル (つまり、まだ追加されていない変更があるファイル) は保持します。<commit>とインデックスの間で異なるファイルにステージされていない変更がある場合、リセットは中止されます。言い換えれば、
--merge
はgit
read-tree
-u
-m
<commit>のようなことを行いますが、未マージのインデックスエントリを引き継ぎます。 --keep
-
インデックスエントリをリセットし、<commit>と
HEAD
の間で異なるワーキングツリー内のファイルを更新します。<commit>とHEAD
の間で異なるファイルにローカルな変更がある場合、リセットは中止されます。 --
[no-
]recurse-submodules
-
ワーキングツリーが更新される際、
--recurse-submodules
を使用すると、スーパープロジェクトに記録されたコミットに従って、すべてのアクティブなサブモジュールのワーキングツリーも再帰的にリセットされ、サブモジュールのHEAD
はそのコミットでデタッチされた状態に設定されます。
これら3つのコマンドの違いについては、git[1]の「リセット、リストア、リバート」を参照してください。
オプション
-q
--quiet
-
静かに実行し、エラーのみを報告します。
--refresh
--no-refresh
-
mixed resetの後にインデックスをリフレッシュします。デフォルトで有効です。
--pathspec-from-file=
<file>-
パススペックはコマンドライン引数ではなく<file>で渡されます。<file>が正確に
-
の場合、標準入力が使用されます。パススペック要素はLFまたはCR/LFで区切られます。パススペック要素は設定変数core.quotePath
について説明されているように引用符で囲むことができます (git-config[1]を参照)。--pathspec-file-nul
およびグローバルな--literal-pathspecs
も参照してください。 --pathspec-file-nul
-
--pathspec-from-file
との組み合わせでのみ意味があります。パススペック要素はNUL文字で区切られ、他のすべての文字はリテラルとして扱われます (改行や引用符を含む)。 --
-
これ以降の引数をオプションとして解釈しません。
- <pathspec>...
-
操作の影響を受けるパスを制限します。
詳細については、gitglossary[7]のpathspecエントリを参照してください。
例
- 追加を元に戻す
-
$ edit (1) $ git add frotz.c filfre.c $ mailx (2) $ git reset (3) $ git pull git://info.example.com/ nitfol (4)
-
作業中に、これらのファイルへの変更がうまくまとまっていることを見つけました。他のファイルや変更に集中したいので、
git
diff
を実行するときにこれらの変更を見たくありません。 -
誰かがプルを要求し、その変更はマージする価値があるようです。
-
しかし、すでにインデックスを汚してしまっています (つまり、インデックスが
HEAD
コミットと一致しません)。しかし、これから行うプルがfrotz.c
やfilfre.c
に影響しないことを知っているので、これら2つのファイルのインデックス変更を元に戻します。ワーキングツリー内の変更はそのまま残ります。 -
その後、プルとマージを行い、
frotz.c
とfilfre.c
の変更をワーキングツリーに残しておくことができます。
-
- コミットを元に戻してやり直す
-
$ git commit ... $ git reset --soft HEAD^ (1) $ edit (2) $ git commit -a -c ORIG_HEAD (3)
-
これは、コミットしたばかりのものが不完全であること、コミットメッセージのスペルを間違えたこと、またはその両方を思い出した場合によく行われます。「reset」前のワーキングツリーの状態をそのまま残します。
-
ワーキングツリーのファイルを修正します。
-
「reset」は古いヘッドを
.git/ORIG_HEAD
にコピーします。そのログメッセージから始めてコミットをやり直します。メッセージをさらに編集する必要がない場合は、代わりに-C
オプションを指定できます。git-commit[1]の
--amend
オプションも参照してください。
-
- コミットを元に戻し、トピックブランチにする
-
$ git branch topic/wip (1) $ git reset --hard HEAD~3 (2) $ git switch topic/wip (3)
-
いくつかのコミットをしましたが、それらが
master
ブランチに入れるには時期尚早であることに気づきました。それらをトピックブランチでさらに磨き続けたいので、現在のHEAD
からtopic/wip
ブランチを作成します。 -
マスターブランチを巻き戻して、それらの3つのコミットを削除します。
-
topic/wip
ブランチに切り替えて作業を続けます。
-
- コミットを永久に元に戻す
-
$ git commit ... $ git reset --hard HEAD~3 (1)
-
最後の3つのコミット (
HEAD
、HEAD^
、およびHEAD~2
) は悪く、二度と見たくありません。これらのコミットをすでに他の誰かに渡している場合は、これを行ってはいけません。(これを行うことの意味については、git-rebase[1]の「アップストリームのリベースからの復旧」セクションを参照してください。)
-
- マージまたはプルを元に戻す
-
$ git pull (1) Auto-merging nitfol CONFLICT (content): Merge conflict in nitfol Automatic merge failed; fix conflicts and then commit the result. $ git reset --hard (2) $ git pull . topic/branch (3) Updating from 41223... to 13134... Fast-forward $ git reset --hard ORIG_HEAD (4)
-
アップストリームからの更新を試みた結果、多くの競合が発生しました。今はマージに多くの時間を費やす準備ができていなかったので、後で行うことにしました。
-
「pull」はマージコミットを作成していないため、
git
reset
--hard
(git
reset
--hard
HEAD
の同義語) は、インデックスファイルとワーキングツリーの混乱を解消します。 -
トピックブランチを現在のブランチにマージし、高速フォワードが発生しました。
-
しかし、トピックブランチはまだ一般公開の準備ができていないと判断しました。「pull」または「merge」は常に現在のブランチの元の先端を
ORIG_HEAD
に残すため、それにハードリセットすると、インデックスファイルとワーキングツリーがその状態に戻り、ブランチの先端がそのコミットにリセットされます。
-
- 汚れたワーキングツリー内でのマージまたはプルを元に戻す
-
$ git pull (1) Auto-merging nitfol Merge made by recursive. nitfol | 20 +++++---- ... $ git reset --merge ORIG_HEAD (2)
-
ワーキングツリーにローカルな変更がある場合でも、他のブランチの変更がそれらと重複しないことがわかっている場合は、安全に
git
pull
と言えます。 -
マージの結果を検査した後、他のブランチの変更が不満であると判明するかもしれません。
git
reset
--hard
ORIG_HEAD
を実行すると元に戻ることができますが、ローカルな変更は破棄されます。これは望ましくありません。git
reset
--merge
はローカルな変更を保持します。
-
- 中断されたワークフロー
-
大規模な変更の途中で緊急の修正要求によって中断されたとします。ワーキングツリー内のファイルはまだコミットできる状態ではありませんが、迅速なバグ修正のために他のブランチに移動する必要があります。
$ git switch feature ;# you were working in "feature" branch and $ work work work ;# got interrupted $ git commit -a -m "snapshot WIP" (1) $ git switch master $ fix fix fix $ git commit ;# commit with real log $ git switch feature $ git reset --soft HEAD^ ;# go back to WIP state (2) $ git reset (3)
-
このコミットは破棄されるため、使い捨てのログメッセージでも構いません。
-
これにより、WIPコミットがコミット履歴から削除され、ワーキングツリーはスナップショットを作成する直前の状態に設定されます。
-
この時点でもインデックスファイルには、snapshot WIPとしてコミットしたすべてのWIP変更が残っています。これにより、インデックスが更新され、WIPファイルが未コミットとして表示されます。
git-stash[1]も参照してください。
-
- インデックス内の単一ファイルをリセットする
-
ファイルをインデックスに追加したが、後でコミットに追加したくないと判断したとします。git resetを使用すると、変更を保持したままインデックスからファイルを削除できます。
$ git reset -- frotz.c (1) $ git commit -m "Commit files in index" (2) $ git add frotz.c (3)
-
これにより、ファイルはワーキングディレクトリに残されたまま、インデックスから削除されます。
-
これにより、インデックス内の他のすべての変更がコミットされます。
-
ファイルを再度インデックスに追加します。
-
- いくつかの前のコミットを破棄しつつ、ワーキングツリーの変更を保持する
-
何か作業をしていてコミットし、さらに少し作業を続けたが、現在のワーキングツリーにあるものは以前コミットしたものとは関係のない別のブランチにあるべきだと考えた場合。新しいブランチを開始し、ワーキングツリーの変更を保持したままリセットできます。
$ git tag start $ git switch -c branch1 $ edit $ git commit ... (1) $ edit $ git switch -c branch2 (2) $ git reset --keep start (3)
-
これは
branch1
での最初の編集をコミットします。 -
理想的には、
branch2
を作成して切り替えたとき (つまり、git
switch
-c
branch2
start
) に、以前のコミットが新しいトピックに属さないことに気づいたかもしれませんが、完璧な人はいません。 -
しかし、
branch2
に切り替えた後、reset
--keep
を使って不要なコミットを削除することができます。
-
- コミットを複数のコミットに分割する
-
論理的に分離された多くの変更を作成し、それらをまとめてコミットしたとします。その後、各論理チャンクを独自のコミットに関連付けた方が良いと判断しました。git resetを使用して、ローカルファイルの内容を変更せずに履歴を巻き戻し、その後、
git
add
-p
を順次使用して、各コミットに含めるハンクをインタラクティブに選択し、git
commit
-c
を使用してコミットメッセージを事前に設定できます。$ git reset -N HEAD^ (1) $ git add -p (2) $ git diff --cached (3) $ git commit -c HEAD@{1} (4) ... (5) $ git add ... (6) $ git diff --cached (7) $ git commit ... (8)
-
まず、履歴を1コミット巻き戻して元のコミットを削除しますが、ワーキングツリーはすべての変更を残します。
-N
は、HEAD
で追加された新しいファイルが引き続きマークされるようにし、git
add
-p
がそれらを見つけられるようにします。 -
次に、
git
add
-p
機能を使用して、インタラクティブに差分ハンクを追加します。これにより、各差分ハンクについて順次質問され、「はい、これを含める」、「いいえ、含めない」などの簡単なコマンド、または非常に強力な「編集」機能を使用できます。 -
含めたいハンクに満足したら、
git
diff
--cached
を使用して、最初のコミット用に準備されたものを確認する必要があります。これは、インデックスに移動され、コミットされようとしているすべての変更を示します。 -
次に、インデックスに保存されている変更をコミットします。
-c
オプションは、最初のコミットで開始した元のメッセージからコミットメッセージを事前に設定することを指定します。これにより、再入力の手間が省けます。HEAD@{1}
は、元のリセットコミットの前にHEAD
があったコミット (1変更前) の特殊な表記です。git-reflog[1]で詳細を参照してください。他の有効なコミット参照も使用できます。 -
手順2〜4を複数回繰り返して、元のコードを任意の数のコミットに分割できます。
-
これで、多くの変更を独自のコミットに分割し、残りのコミットされていない変更をすべて選択するために、もはや
git
add
のパッチモードを使用しないかもしれません。 -
もう一度、含めたいものが含まれていることを確認します。後でコミットする残りの変更がgit diffに表示されないことも確認したいかもしれません。
-
そして最後に、最終コミットを作成します。
-
考察
以下の表は、
git reset --option target
ファイルをさまざまなリセットオプションで別のコミット (target
) にリセットした場合に何が起こるかを示しています。
これらの表では、A
、B
、C
、D
はファイルの状態が異なることを意味します。例えば、最初の表の最初の行は、ワーキングツリーのファイルがA
の状態、インデックスがB
の状態、HEAD
がC
の状態、ターゲットがD
の状態である場合、git
reset
--soft
target
を実行すると、ワーキングツリーのファイルはA
の状態、インデックスはB
の状態のままになることを意味します。そして、HEAD
(現在のブランチの先端、もしある場合) をtarget
(ファイルがD
の状態である) にリセット (つまり移動) します。
working index HEAD target working index HEAD ---------------------------------------------------- A B C D --soft A B D --mixed A D D --hard D D D --merge (disallowed) --keep (disallowed)
working index HEAD target working index HEAD ---------------------------------------------------- A B C C --soft A B C --mixed A C C --hard C C C --merge (disallowed) --keep A C C
working index HEAD target working index HEAD ---------------------------------------------------- B B C D --soft B B D --mixed B D D --hard D D D --merge D D D --keep (disallowed)
working index HEAD target working index HEAD ---------------------------------------------------- B B C C --soft B B C --mixed B C C --hard C C C --merge C C C --keep B C C
working index HEAD target working index HEAD ---------------------------------------------------- B C C D --soft B C D --mixed B D D --hard D D D --merge (disallowed) --keep (disallowed)
working index HEAD target working index HEAD ---------------------------------------------------- B C C C --soft B C C --mixed B C C --hard C C C --merge B C C --keep B C C
git
reset
--merge
は、競合するマージからリセットする場合に使用することを意図しています。マージ操作は、マージに含まれるワーキングツリーファイルが開始前にインデックスに対してローカルな変更を持たず、結果をワーキングツリーに書き込むことを保証します。したがって、インデックスとターゲットの間、およびインデックスとワーキングツリーの間にいくつかの違いがある場合、それはマージ操作が競合で失敗した後に残した状態からリセットしていないことを意味します。そのため、この場合は--merge
オプションを許可しません。
git
reset
--keep
は、ワーキングツリーの変更を保持しながら、現在のブランチの最後のコミットの一部を削除する場合に使用することを意図しています。削除したいコミットの変更と保持したいワーキングツリーの変更の間に競合が発生する可能性がある場合、リセットは許可されません。そのため、ワーキングツリーとHEAD
の間、およびHEAD
とターゲットの間に両方の変更がある場合は許可されません。安全のため、未マージのエントリがある場合も許可されません。
以下の表は、未マージのエントリがある場合に何が起こるかを示しています。
working index HEAD target working index HEAD ---------------------------------------------------- X U A B --soft (disallowed) --mixed X B B --hard B B B --merge B B B --keep (disallowed)
working index HEAD target working index HEAD ---------------------------------------------------- X U A A --soft (disallowed) --mixed X A A --hard A A A --merge A A A --keep (disallowed)
X
は任意の状態を意味し、U
は未マージのインデックスを意味します。
GIT
git[1]スイートの一部