TortoiseGit reset で HEAD の指す現在のリビジョンを変更

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

TortoiseGit ダウンロードとインストール1

TortoiseGit-2.17.0.2-64bit を使用します。

サンプルリポジトリについて

公式サイト「Git – リセットコマンド詳説」でリセットの解説に用いるサンプルリポジトリの作り方が書かれています。

それを参考に TortoiseGit で作成したサンプルリポジトリのフォルダのコピーを使うので、サンプルリポジトリを作成していない場合は以下の記事を参照してください。

コマンドプロンプトで、作成したサンプルリポジトリのフォルダに移動して、 git log –oneline を入力すると、サンプルの通りにコミットした履歴や HEAD が指す現在のコミット位置確認できます。
※ Windows 10 の場合は、エクスプローラのアドレスバーに cmd⏎ でそのフォルダを作業ディレクトリにしてコマンドプロンプトを開けます。

TortoiseGit と git でコミットの削除と削除直前の dangling commit を復元11

作成したサンプルリポジトリでは、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 to HEAD 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”, as git status would put it.

インデックス ファイルや作業ツリーにはまったく触れません (ただし、すべてのモードと同様に、ヘッドを <commit> にリセットします)。これにより、変更されたファイルはすべて、git status で表現されるように「コミットされる変更」のままになります
Git – git-reset Documentation と Google 翻訳

HEAD~ は、HEAD より1つ前のコミット位置を示します。
HEAD~~ とすると2つ前のコミット位置を示します。
SHA-1 のハッシュ値でも指定できますが、最新より1つ前などのように指示したいときは HEAD~ の方が直感的かもしれません。

チルダ指定をすることで、コミットをさかのぼって指定ができます。
HEAD~と指定することで、HEADに対して1世代前のコミットを指定でき、HEAD~~と指定することでHEADの2世代前のコミットを指定できます。

【やっとわかった!】gitのHEAD^とHEAD~の違い #Git – Qiita

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 翻訳
TortoiseGit git reset -soft HEAD~ と同等のメニューの実行1

結果として、ファイルの追加、ファイルの変更(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」→「ログを表示」を選択します。

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行2

リビジョンログダイアログ(ウィンドウ名はログメッセージ)が表示されました。

さきほど git log コマンドで確認した3つのコミットが、上側のリストに表示されています。

今回は HEAD の位置を現在のコミット位置より1つ前のコミット位置 (HEAD~) に変えるので、現在 HEAD が指している1行目の赤枠で master (ブランチ名)と書かれている行の1つ下の行である2行目を右クリックして、表示されるメニュー「 “master” をここへリセット」を選択します。

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行3

「リセット」ダイアログが表示され、「現在のブランチのリセット」枠では「コミット」ラジオボタンが選択され、コミット位置を一意に表す SHA-1 ハッシュ値が書かれています。

その右側の… ボタンを押すと、ログメッセージのダイアログが表示され、そのハッシュ値が指すコミットが、先ほど右クリックした2行目の2回目のコミットを指していることが確認できます。
ハッシュ値同じものが書かれていることが確認できます。
確認したら、… ボタンで表示したログメッセージのダイアログを「キャンセル」ボタンで閉じます。

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行4

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

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行5

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

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行6

実行結果の確認

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

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行7

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

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行8
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」→「差分」を選択します。

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行9

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

これは間接的に、HEAD の指す現在のコミット位置が2回目のコミット位置であることを表しています。

TortoiseGit git reset -soft HEAD~ と同等のメニューの実行10

まとめ

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

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました