Gitコマンド入門::add,reset,rm,status,log「第三十五回」
みなさん、こんにちは! 今日も引き続き、git reset です! ここまで、度々、--hard オプションは使ってきましたので、もう、そんなにやることもないかな? と思いつつも、コマンドを打てば、あれれ?! この場合は、どうなるのかな? な~んて思うこともありますので、復習も兼ねて学習して行きましょう!
git reset | --sotf | --mixed | --hard | 補足 |
---|---|---|---|---|
HEAD~ | 前回学習 | 前回学習 | 前回学習 | 第三十二回、第三十三回 |
HEAD | ○ | 第三十四回 | ● | <-- 今回は●の箇所 |
任意のハシュ値 | - | - | ● | <-- 今回は●の箇所 |
前回の記事は、こちら!
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
// 何も差分なし!
- HEAD のハッシュ値を確認。ここでは、8756963
- git status で、nothing to commit, working tree clean を確認
- git log --oneline でコミットの状況確認
- ls で、ファイルの存在を確認!
- 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 が復活しています!
ハッシュ値指定でも、試してくださいね!
-
git reset --hard 8756963
で、コメント文、3rd・・・へ移動 -
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 した状態にもなっていますね。
現在作業中のワーキングディレクトリ、ステージングエリアの状態をスタックに退避しておき、別の作業が終わったら、また元に戻って、その状態から作業を続つことができるようになるので、とても便利ですね。
- git stash save // 作業環境を保存する。
- git stash list // 保存した環境のリスト一覧表示
- git stash apply stash@{0}[1] // 保存した作業環境を、取り出して元の状態に戻す。
- git stash drop stash@{0} // 保存した作業環境をリストから消去する。
- git stash pop stash@{0} // 3+4の同時処理。作業環境の復元、リスト消去!
それでは、今回はここまで、お疲れ様でした!
-
stash@{0}の部分は、git stash list から取得できます! ↩︎
Discussion