LoginSignup
0
0

More than 5 years have passed since last update.

PR は WIP で出した方がいいから git とは仲良くなっておきたい

Posted at
1 / 12

言い訳

最初は、fixup とか rebase -i の話をしようとおもったのですが。

やめました。


その代わり

ひとつでもいいから git の tips を提供したいと思います。


まずはじめに TIPS

HEAD はもう書いていません @ がいるから

Release note 1.8.5


作業をなかったことにする

あなたは作業をして、コードにいくつかの変更を加えました。つまり Working directory に変更がいくつかある状態です。しばらくしてこの変更はまずいことに気づきました。Working directory の変更を全てなかったことにするために、どんな git コマンドを打ちますか?

chart.png

$ git reset --hard

or

$ git checkout .

or

$ git stash

質問です。
reset と checkout の違いはなんですか?

質問です。以下の違いはなんですか?

$ git stash 
$ git stash -u
$ git stash --all

いくつか前のコミットの状態にしたい

いまこのような状態です。

$ git log --oneline
c1dec0f (HEAD -> master) Add D
658fa0d Add C
5dfec5e Add B
07db11b Add A

4回コミットしました。A-B-C-D。今は最新のDの状態です。しばらくしてまずいことに気づきました。Bの状態から作業をやり直したいと思ったあなたは、どんな git コマンドを打ちますか?

chart.png

$ git reset @^^

or

$ git checkout @^^

質問です。
特定のファイルのみ B の状態にしたいときはどうしますか?


あるファイルのみを、いくつか前のコミットの状態にしたい

どうしますか?

$ git checkout @^^ hoge.txt

質問です。
checkout にパスを渡すときと渡さないときでは何が変わりますか?


reset と checkout の違いについて

網羅的に説明するのは難しいので、いくつかのポイントを紹介します。

なぜ、網羅的に説明するのが難しいかというと、reset, checkout ともに、
path を引数で持っているか否かで動きが異なるからです。


reset --hard は path を指定できない

$ g reset --hard @^^ hoge.txt
fatal: Cannot do hard reset with paths.

checkout @^^ とすると detached HEAD になる

$ g checkout @^^
Note: checking out '@^^'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 5dfec5e Add B

git 使いたてで、これを知らないとパニックになります。

graph はこんな感じ。

$ git log --graph --branches --oneline
* c1dec0f (master) Add D
* 658fa0d Add C
* 5dfec5e (HEAD) Add B
* 07db11b Add A

そして、 .git/HEAD をみてみると以下のようになっています。

$ cat .git/HEAD
5dfec5ea84035e05983e40e30adabe949325e768

通常は以下。

$ cat .git/HEAD
ref: refs/heads/master

つまり、HEAD にブランチではなく、直接 SHA-1 ハッシュ値が記載されている状態が detached HEAD です。

ですから、おちついてその場所から git checkout -b <new-branch-name> しておけば OK です。


checkout は staging area を無視する

なにかしらの変更を add している状態で、Working directory を HEAD の状態にしたい場合、
git checkout @ . では望んだ結果は得られません。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0