Windows シェル拡張(エクスプローラに機能を追加)で Git を操作できる無料の Git クライアントソフトウェア TortoiseGit で、公式「Git – リセットコマンド詳説」のサンプルリポジトリに git reset –soft HEAD~ コマンドと同等のメニューを実行して、HEAD の指す現在のコミット位置を変更した結果を確認します。
実行する git reset –soft コマンドの意味や、 git checktout コマンドとの違いについても紹介します。

※ TortoiseGit-2.17.0.2-64bit を使用します。
サンプルリポジトリについて
公式サイト「Git – リセットコマンド詳説」でリセットの解説に用いるサンプルリポジトリの作り方が書かれています。
それを参考に TortoiseGit で作成したサンプルリポジトリのフォルダのコピーを使うので、サンプルリポジトリを作成していない場合は以下の記事を参照してください。
コマンドプロンプトで、作成したサンプルリポジトリのフォルダに移動して、 git log –oneline を入力すると、サンプルの通りにコミットした履歴や HEAD が指す現在のコミット位置が確認できます。
※ Windows 10 の場合は、エクスプローラのアドレスバーに cmd⏎ でそのフォルダを作業ディレクトリにしてコマンドプロンプトを開けます。

作成したサンプルリポジトリでは、3回のコミット履歴 (上の行が最新) があり、HEAD は最新の3回目のコミット位置を現在のコミット位置として指しています。
G:\Dev\StudyTortoiseGit\Repo1ResetHard>git log --oneline
fa795f0 (HEAD -> master) file.txt に 2 行目を追加
1f1f4dd file.txt に hello, world を追記。
e2829b8 file.txt をバージョン管理に追加します。
git reset –soft HEAD~ の意味
git reset コマンドには、 soft, mixed, hard の 3 つの段階のリセットがあります。
soft は一番影響範囲が小さい reset で、 HEAD が示す現在のコミット位置を、指定したコミット位置(例では HEAD~)に移動するだけです。
In the first three forms, copy entries from
<tree-ish>
to the index. In the last form, set the current branch head (HEAD
) to<commit>
, optionally modifying index and working tree to match. The<tree-ish>
/<commit>
defaults toHEAD
in all forms.最初の 3 つの形式では、<tree-ish> からインデックスにエントリをコピーします。最後の形式では、現在のブランチ ヘッド (HEAD) を <commit> に設定し、オプションでインデックスと作業ツリーを一致するように変更します。 <tree-ish>/<commit> は、すべての形式でデフォルトで HEAD になります。
–soft
Does not touch the index file or the working tree at all (but resets the head to
<commit>
, just like all modes do). This leaves all your changed files “Changes to be committed”, asgit status
would put it.インデックス ファイルや作業ツリーにはまったく触れません (ただし、すべてのモードと同様に、ヘッドを <commit> にリセットします)。これにより、変更されたファイルはすべて、git status で表現されるように「コミットされる変更」のままになりますGit – git-reset Documentation と Google 翻訳
HEAD~ は、HEAD より1つ前のコミット位置を示します。
HEAD~~ とすると2つ前のコミット位置を示します。
SHA-1 のハッシュ値でも指定できますが、最新より1つ前などのように指示したいときは HEAD~ の方が直感的かもしれません。
チルダ指定をすることで、コミットをさかのぼって指定ができます。
【やっとわかった!】gitのHEAD^とHEAD~の違い #Git – Qiita
HEAD~と指定することで、HEADに対して1世代前のコミットを指定でき、HEAD~~と指定することでHEADの2世代前のコミットを指定できます。
git checkout との違い
git checkout でも、HEAD が示す現在のコミット位置を変更できます。
git reset –soft との違いは、 git checkout では、指定したコミット位置に HEAD を変えるだけではなく、作業ディレクトリとインデックス(ステージングエリア)の内容を指定したコミット位置の状態に上書きしてしまうことです。
Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given, git checkout will also update
HEAD
to set the specified branch as the current branch.作業ツリー内のファイルを更新して、インデックスまたは指定されたツリー内のバージョンと一致させます。 pathspec が指定されていない場合、git checkout は HEAD も更新して、指定されたブランチを現在のブランチとして設定します。Git – git-checkout Documentation と Google 翻訳
HEAD だけを変えたい場合は git reset –soft の方を使うと良いでしょう。
HEAD をかえることで、作業ディレクトリと、指定したコミット位置の状態との比較を行えます。
reset –soft 前のリポジトリのコミット履歴を確認
git reset –soft コマンドを使う前に、前述の公式サイトのサンプルリポジトリを作成した直後のコミット履歴を確認します。
エクスプローラで対象のリポジトリのあるフォルダを開き、アドレスバーで cmd⏎ と入力するとそのディレクトリに移動した状態でコマンドプロンプトが開きます。
※コマンドプロンプトを起動して cd /d コマンドなどで移動しても同じです。
git log –graph –oneline –all コマンドで、コミット履歴を確認しましょう。
–oneline オプションは1つのコミットの情報を1行で簡潔に表示します。
※現在のサンプルリポジトリでは git log –oneline でも同じ結果が表示されます。
Shows the commit logs.
Git – git-log Documentation と Google 翻訳
コミットログを表示します。

結果として、ファイルの追加、ファイルの変更(1回目)、ファイルの変更(2回目)の3つのコミットが表示されました。
最初の7桁の数値は、コミットごとに一意に割り振られる SHA-1 というハッシュ値の一部です。
そのあとに、コミット時のメッセージが表示されています。
1番上の3番目のコミットが現在のコミット位置のため、その行には (HEAD -> master) と、 HEAD が master ブランチのこのコミットを現在のコミット位置として指していることを表しています。
–oneline でコミットごとに1行の簡易表示にしています。
G:\Dev\StudyTortoiseGit\Repo1Soft>git log --graph --oneline --all
* fa795f0 (HEAD -> master) file.txt に 2 行目を追加
* 1f1f4dd file.txt に hello, world を追記。
* e2829b8 file.txt をバージョン管理に追加します。
git reset –soft HEAD~ と同等の TortoiseGit メニューを実行
TortoiseGit を用いて「git reset –soft HEAD~」コマンドと同じメニューを実行します。
エクスプローラでリポジトリフォルダを右クリックして表示されるメニュー「TortoiseGit」→「ログを表示」を選択します。

リビジョンログダイアログ(ウィンドウ名はログメッセージ)が表示されました。
さきほど git log コマンドで確認した3つのコミットが、上側のリストに表示されています。
今回は HEAD の位置を現在のコミット位置より1つ前のコミット位置 (HEAD~) に変えるので、現在 HEAD が指している1行目の赤枠で master (ブランチ名)と書かれている行の1つ下の行である2行目を右クリックして、表示されるメニュー「 “master” をここへリセット」を選択します。

「リセット」ダイアログが表示され、「現在のブランチのリセット」枠では「コミット」ラジオボタンが選択され、コミット位置を一意に表す SHA-1 ハッシュ値が書かれています。
その右側の… ボタンを押すと、ログメッセージのダイアログが表示され、そのハッシュ値が指すコミットが、先ほど右クリックした2行目の2回目のコミットを指していることが確認できます。
ハッシュ値も同じものが書かれていることが確認できます。
確認したら、… ボタンで表示したログメッセージのダイアログを「キャンセル」ボタンで閉じます。

「リセットの種類」枠で、 soft ラジオボタンを選択して OK ボタンを押すと git reset –soft HEAD~ と同じ結果となる処理が行われます。

リセット (soft) の実行が成功しました。「閉じる」ボタンを押します。

実行結果の確認
リビジョンログダイアログ(ログメッセージ)ウィンドウを確認すると、赤枠の master (ブランチ名) が、選択した2行目(2回目のコミット)に移動しています。
HEAD が指す現在のコミット位置が、3回目のコミット位置の1つ前の2回目のコミット位置に移りました。

先ほどのコマンドプロンプトに reset 実行前と同様に git log –graph –oneline –all コマンドを再びを実行すると、今度は、3回目のコミットが表示されず、移動した現在のコミット位置である2回目のコミットとそれ以前のコミットだけが表示されました。
※現在のサンプルリポジトリでは git log –oneline でも同じ結果が表示されます。

G:\Dev\StudyTortoiseGit\Repo1Soft>git log --graph --oneline --all
* 1f1f4dd (HEAD -> master) file.txt に hello, world を追記。
* e2829b8 file.txt をバージョン管理に追加します。
これは、 git log コマンドではコミット位置を指定しないと、HEAD が指す現在のコミット位置からさかのぼれるコミット履歴を表示するためです。
List commits that are reachable by following the
parent
links from the given commit(s), but exclude commits that are reachable from the one(s) given with a ^ in front of them. The output is given in reverse chronological order by default.指定されたコミットから親リンクをたどることで到達可能なコミットをリストしますが、先頭に ^ を付けて指定されたコミットから到達可能なコミットは除外します。デフォルトでは、出力は新しい順に表示されます。Git – git-log Documentation と Google 翻訳
HEAD の参照先が変わった後のファイル差分の確認
HEAD が変わり、3回目のコミット位置から2回目のコミット位置に現在のコミット位置が変わりました。
しかし、 checkout とは異なり作業ディレクトリの内容は変更されず3回目のコミットの内容ですl。
HEAD が指す2回目のコミット位置の内容と異なるため file.txt に差分があると判断され、赤色のマークがファイルアイコンに追加されました。
差分を確認するため、ファイルを右クリックして表示されるメニュー「TortoiseGit」→「差分」を選択します。

左側が現在のコミット位置のファイルの内容で、右側が作業ディレクトリの実際のファイルの内容です。
左側は2回目のコミット時の内容で、右側は3回目のコミット時の内容になっていて、3回目のコミットで追加した2行目の有無が差分になっていることが確認できました。
これは間接的に、HEAD の指す現在のコミット位置が2回目のコミット位置であることを表しています。

まとめ
今回は、Windows シェル拡張(エクスプローラに機能を追加)で Git を操作できる無料の Git クライアントソフトウェア TortoiseGit で、公式「Git – リセットコマンド詳説」のサンプルリポジトリに git reset –soft HEAD~ コマンドと同等のメニューを実行して、HEAD の指す現在のコミット位置を変更した結果を確認しました。
実行する git reset –soft コマンドの意味や、 git checktout コマンドとの違いについても紹介しました。
参照サイト Thank You!
- Git
- TortoiseGit – Windows Shell Interface to Git
- Git – リセットコマンド詳説
- リビジョングラフ
- リビジョンログダイアログ
- Git – git-log Documentation
- Git – git-reset Documentation
- 【やっとわかった!】gitのHEAD^とHEAD~の違い #Git – Qiita
- Git – git-checkout Documentation
記事一覧 → Compota-Soft-Press
コメント