🗝️

Gitコマンド入門::add,reset,rm,status,log「第三十五回」

2021/03/05に公開

みなさん、こんにちは! 今日も引き続き、git reset です! ここまで、度々、--hard オプションは使ってきましたので、もう、そんなにやることもないかな? と思いつつも、コマンドを打てば、あれれ?! この場合は、どうなるのかな? な~んて思うこともありますので、復習も兼ねて学習して行きましょう!

git reset --sotf --mixed --hard 補足
HEAD~ 前回学習 前回学習 前回学習 第三十二回、第三十三回
HEAD 第三十四回 <-- 今回は●の箇所
任意のハシュ値 - - <-- 今回は●の箇所

前回の記事は、こちら!

https://zenn.dev/shiozumi/articles/ff20b8e1a0d894

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

今日の学習専用レポジトリーはこちら!

https://github.com/shiozumi-makoto/202103.git

git clone で取得できます!

$ mkdir temp <!-- 適当なフォルダーを作成してください!
$ cd temp <!-- そこに移動して、git clone! 
git clone https://github.com/shiozumi-makoto/202103.git -b tag0032 v.0033

$ ls -a v.0033/
.  ..  .git  README.md  a.txt  b.txt
// .gitリポジトリと、ファイルが3つあればOKです!

ブランチ名、tag0032 は省略可能です。
その場合は、あとからブランチ名を追加してください。
git switch -c <任意のブランチ名>

git reset --hard HEAD

$ git reset --hard HEAD
HEAD is now at 8756963 3rd add b.txt git reset

$ git status
On branch tag0032
Your branch is up to date with 'origin/tag0032'.

nothing to commit, working tree clean

$ git log --oneline
8756963 (HEAD -> tag0032, tag: v.0033, origin/tag0032) 3rd add b.txt git reset
ce2321e 2nd add a.txt
53d39e0 1st

$ ls
README.md  a.txt  b.txt

$ git diff
// 何も差分なし!
  1. HEAD のハッシュ値を確認。ここでは、8756963
  2. git status で、nothing to commit, working tree clean を確認
  3. git log --oneline でコミットの状況確認
  4. ls で、ファイルの存在を確認!
  5. git diff で差分なしを確認!

git reset --hard は、指定したHEAD値、「コミットした時点の任意のハッシュ値」に移動して、ワーキングディレクトリ、ステージングエリアを、その時点の最新の状態に設定。
つまり、git commit した直後の状態に変更します。非常に便利ですから、コミットのコメント分もしっかり分かるように記載して置けば、バックからファイルと取り出す感覚で、おそらく利用できると思います。本家本元のサイトでも説明されていますが、全てのコミットに対しての、ファイルのスナップショットを保持しているとの事なので・・・なので当然のことですが、しっかりコミットを整理して置かなければ、それはそれで、後でカオスになると思います。

git reset --hard 53d39e0 で、1stに移動!

$ git reset --hard 53d39e0
HEAD is now at 53d39e0 1s

$ git status
On branch tag0032
Your branch is behind 'origin/tag0032' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

$ git log --oneline
53d39e0 (HEAD -> tag0032) 1st

$ ls
README.md <!-- a.txt b.txt の2つのファイルが消えました。

$ git diff
// 何も差分なし!

ファイルの数が1つにだけ、README.md のみとなりました。a.txt,b.txt は、しっかりと削除されていますね。また、元に戻してみましょう! ひとつ前のヘッダーに戻る方法は、git reset --hard ORIG_HEAD でしたね!

git reset --hard ORIG_HEAD で、ひとつ前のヘッダー位置に移動します。

$ git reset --hard ORIG_HEAD
HEAD is now at 8756963 3rd add b.txt git reset

$ ls
README.md  a.txt  b.txt
// これで元通り、a.txt , b.txt が復活しています!

ハッシュ値指定でも、試してくださいね!

  1. git reset --hard 8756963 で、コメント文、3rd・・・へ移動
  2. git reset --hard ce2321e で、コメント文、2nd・・・へ移動

では、新しいコマンド、git stash !

git reset --hard コマンドや、git checkoutなどで、ブランチを切り替えると、現時点でのワーキングディレクトリ、ステージングエリアが初期化されてしまいます。そこで、作業途中に切り替えたいときに便利なのが、git stash コマンドなんです。今の編集状態を一時保存して置いて、また、元に戻すことができる、スタック機能です。ということで、まず早速試してみましょう。

$ echo "c.txt" > c.txt <!-- 新規ファイルを作成!
$ git add c.txt

$ git status -s
A  c.txt <!-- Aは緑色の文字となり、ステージングエリアへ

// この時、この環境の状態を保持できます。
// ワーキングディレクトリ、インデックス(ステージングエリア)を保存!
$ git stash save
Saved working directory and index state WIP on tag0032: 8756963 3rd // 省略

$ git stash list
stash@{0}: WIP on tag0032: 8756963 3rd add b.txt git reset
// stash@{0} に保存されていますね!

$  git reset --hard ce2321e
HEAD is now at ce2321e 2nd add a.txt
// では、2nd コミットに移動してみましょう!

$ ls
README.md  a.txt
// b.txt と、c.txt が消えていますね。

$ git reset --hard 8756963
// 早速、元のヘッダーに戻して!

$ git reset --hard 8756963
HEAD is now at 8756963 3rd add b.txt git reset

$ ls
README.md  a.txt  b.txt
// c.txt は、コミットしていない状態で、HEADを移動させたので、
// Gitリポジトリには、保存されていませんから、復活できていませんね。

$ git stash pop stash@{0}

On branch tag0032
Your branch is up to date with 'origin/tag0032'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   c.txt

Dropped stash@{0} (2df3f834a2ab345dca99270ca7b8a326e060c93c)

$ ls
README.md  a.txt  b.txt  c.txt
// c.txt が無事、元にもどりました!

$ git status -s
A  c.txt
// そして、add した状態にもなっていますね。

現在作業中のワーキングディレクトリ、ステージングエリアの状態をスタックに退避しておき、別の作業が終わったら、また元に戻って、その状態から作業を続つことができるようになるので、とても便利ですね。

  1. git stash save // 作業環境を保存する。
  2. git stash list // 保存した環境のリスト一覧表示
  3. git stash apply stash@{0}[1] // 保存した作業環境を、取り出して元の状態に戻す。
  4. git stash drop stash@{0} // 保存した作業環境をリストから消去する。
  5. git stash pop stash@{0} // 3+4の同時処理。作業環境の復元、リスト消去!

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/62ca4aea6e66f6
https://twitter.com/esmile2013

脚注
  1. stash@{0}の部分は、git stash list から取得できます! ↩︎

Discussion