🗝️

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

2021/03/05に公開

みなさんこんにちは! 今回も、git reset の続きを学習していきます! ここ数回は、reset のオプションを、--sotf --mixed --hard などに変更しながら試してきましたので、今回は、HEADの部分を変えてみます。HEAD~ を指定して、ひとつ前に戻してからの、commit は、前回学習しましたから、今回は、HEAD! ● の部分です!

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 log --graph を実行!

$ git log --graph
* commit 87569630965a792350b1b3fe3e8388db5f942da8 (HEAD -> tag0032, tag: v.0033, origin/tag0032)
|
|     3rd add b.txt git reset
|
* commit ce2321ec396ba5020fefbf9ed92a6db9c9ea4f1a
|
|     2nd add a.txt
|
* commit 53d39e0fc077f26cc71854e7af89c67c7fe5050b

      1st

--graph オプションを付けると、このような視覚化もできるようです。
Author: Date: の項目は、省略してあります!

git reset --mixed HEAD

ここでは、--mixed と HEADを、付け加えて実行していますが、--mixed HEAD は省略可能。通常は、git reset ですね。(笑)

ワーキングディレクトリ ステージングエリア Gitリポジトリ
何もしない HEADからコピー HEADもそのままの位置
  1. ワーキングディレクトリは、何もかわりません。[1]
  2. ステージングエリアは、指定したHEADからのファイルで上書きされます。
  3. HEADを指定しているので、そのまま動かずに、同じ位置ですね。
$ echo "c.txt" >c.txt // <!-- c.txtを追加してみましょう!

$ git status

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

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        c.txt

nothing added to commit but untracked files present (use "git add" to track)

$ git add c.txt // <!-- addして!
$ git status -s
A  c.txt // <!-- Aが緑色ですね。

c.txt を追加 git add c.txt してからの git reset --mixed HEADをですね!

$ git reset --mixed HEAD // <!-- --mixd HEAD は省略可能です!
$ git status -s
?? c.txt // <!-- Aから、??に変わり、赤い文字なりました!

c.txt が元の、Untracked files: となりましたね。

更に、b.txt も追加で編集してみます!

$ cat b.txt
b.txt + git reset

$ echo "b.txt + git reset --mixed HEAD " > b.txt
$ cat b.txt
b.txt + git reset --mixed HEAD
// こんな内容に変更して!

$ git add .  // <!-- ピリオドで、b.txt c.txt を同時にadd!

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

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

$ git status -s
M  b.txt  // <!-- Mは、緑色の文字
A  c.txt  // <!-- Aは、緑色の文字 

git reset b.txt を実行!

$ git reset b.txt
Unstaged changes after reset:
M       b.txt

$ git status -s
 M b.txt  // <!-- Mは、赤色になりました! 
A  c.txt  // <!-- Aは、緑色の文字 

$ git reset c.txt

$ git status -s
 M b.txt  // <!-- Mは、赤色 
?? c.txt  // <!-- ??で赤色に変化しました!

これで、git reset が、git add . コマンドの取り消しと同じ動作になることが分かりましたね。git restore --staged b.txt,git restore --staged c.txt でも同じことができますので、是非、一度は、お試しください。[2]

git restore --staged b.txt を実行!

$ git add . // <!-- もう一度、add してからの!

$ git restore --staged b.txt
// 尚、こちらも、HEADを省略しています。
// フルコマンドは、git restore --source=HEAD --staged b.txt 

$ git status -s
 M b.txt  // <!-- Mは、赤色 
A  c.txt  // <!-- Aは、緑色の文字 

さあ、いかがでしょうか? git add に対する反対の取り消し操作、git reset は、本来ならばもっと前に学習する方が良かったのですが、かなり後回しになってしまって、大変、申し訳ありませんでした。m(_)m まあ~ここまで来るのに紆余曲折でしたけど、おかげさまで、私もちょっとは、gitについて分かった気がしますよ! それでも、3%ぐらいかな?(爆笑)

それでは、今回はここまで、お疲れ様でした!
https://zenn.dev/shiozumi/articles/c07af0df5f737c
https://twitter.com/esmile2013

脚注
  1. --hard を設定すると、ワーキングディレクトリも、ステージングエリアと同じ内容で上書き。 ↩︎

  2. reset との違いは、単体ファイル名を指定するところです。従って、全てのファイルのaddを一括で取り消したいときは、git reset を使いましょう! ↩︎

Discussion