煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

gitのコマンドにエイリアスを定義する

svnクライアントみたいにcommitはciしたいし、checkoutはcoしたいんだ!

git configでエイリアスを定義する その1

git configコマンドで定義するならこんな感じ

$ git config alias.ci commit
  • オプション付にするならクォートで囲む
$ git config alias.ad "add --all"
$ git congi --global alias.co checkout

git configでエイリアスを定義する その2

.git/configファイルを直接編集してもいける

  • configの末尾に以下をコピペすればその1と同じようになる(--globalにするなら~/.gitconfig)
[alias]
        ci = commit
        ad = add --all
        co = checkout

git commit --amendとgit rebase

過去のコミットを変更する手順で定番(?)のamendとrebaseについてメモ
ただコミットを戻したいだけならこっちの手順で戻せる

直前のコミットを変更する

今コミットしたんだけど、ちょっと修正足りてなかったって時

  • 今のコミットがこんな感じであって
$ git log --oneline
21b391b sixth commit
2d7fb42 fifth commmit
9994b0b fourth commit
  • ファイル1つ変更してコミットしなおす
$ echo "I forgot it" >> six.txt
$ git add six.txt
  • amendを使って直前にコミットを変更する
    • エディタが立ち上がるのでコミットメッセージを良しなに変更する
$ git commit --amend
  • diffを見たら修正が入ってて、コミットのSHA-1が変わってる
$ git diff HEAD~
diff --git a/six.txt b/six.txt
new file mode 100644
index 0000000..d2c0e78
--- /dev/null
+++ b/six.txt
@@ -0,0 +1 @@
+I forgot it

$ git log --oneline
cbe662c sixth commit
2d7fb42 fifth commmit
9994b0b fourth commit

コミットを遡って変更する

ローカルで数回コミットしたんだけど、マージ前にコミットを格好良くしておきたいって時

  • ローカルで3コミット分作業したとする
]$ git log --oneline --decorate
f08317b (HEAD, master) eighth commit
a094ddf seventh commit
32a88b4 sixth commit
2d7fb42 (origin/master, origin/HEAD) fifth commmit
  • 3コミットを1つに纏めたいとすると
    • pickはそのコミットをそのまま使う
    • squashは一つ前のコミットと纏めて、コミットメッセージを付け直す
    • fixupは一つ前のコミットと纏めて、前のコミットメッセージを使う
$ git rebase -i HEAD~3

pick 32a88b4 sixth commit
squash a094ddf seventh commit #<< squashに変える
squash f08317b eighth commit  #<< ここも
  • 確認すると
$ git log --oneline --decorate
a65c1ac (HEAD, master) sixth..eighth commits
2d7fb42 (origin/master, origin/HEAD) fifth commmit

gitであれこれ戻したい

gitで何かを戻したい時、いつもどのコマンド叩くか忘れるのでメモ

ワーキングツリーを元に戻す

ファイル編集したけどまだaddしてない時

$ git checkout .
$ git checkout -- .
$ git checkout HEAD -- .

どれもHEADの状態にワーキングツリーを戻してくれる。(結果が同じなだけで挙動は違うんだろうけど・・・)
"--"が謎なんだけど、helpを見みるとこんな例があった。

If you have an unfortunate branch that is named hello.c, this step would be confused as an
instruction to switch to that branch. You should instead write:

$ git checkout -- hello.c

なるほど、ファイルと同名のブランチがあるとブランチ移動しちゃうから、--つければfile_pathとして解釈してくれるってことね。

indexを元に戻す

addしちゃったやつを戻す時

  • ワーキングツリーの変更はそのままでaddだけを戻すなら
$ git reset HEAD
  • ワーキングツリーの変更も含めてなかったことにするなら
$ git reset --hard HEAD

commitを元に戻す

commitしたけどやっぱやり戻したい時

  • commitだけを戻してaddした状態にするなら
$ git reset --soft HEAD~
  • commitとindexを戻してワーキングツリーを編集した状態にするなら
$ git reset HEAD~
$ git reset --mixed HEAD~
  • commitもindexもワーキングツリーも戻すなら
$ git reset --hard HEAD~

リモートにpushされてるコミットを元に戻す

pushしたんだけど、やっぱみすってたから戻したい!って時

  • 戻したいコミットのSHA-1を調べて
    • エディタが立ち上がるのでrevert commitのメッセージを入力する
$ git revert [SHA-1]
$ git push origin [branch]

リポジトリを編集する前の状態まで戻したいって時

色々やりすぎてわけわからない!とりあえずリモートの最新まで戻したいなら

$ git reset --hard origin/[branch名]