ベーシックでは、Gitを使ったバージョン管理システムを導入しています。一部のプロジェクトでは先行して導入していたものの、全社的にはまだまだ…といったわけで、よくGitコマンドについて質問されるので、ここで軽くまとめておきたいと思います。

普段は git add / commit / push / pull しかしてない…っていう人向けです。

addしたファイルを取り消す

$git reset HEAD ファイル名

更新内容自体は取り消さず、addしてインデックスに登録するのを取り消します。

更新したファイルの更新内容を取り消す

$git checkout ファイル名

commitする前限定です。

他ブランチの特定のコミットだけマージしたい

$git cherry-pick コミットID

とても便利なコマンドですが、cherry-pickを多用するような運用スタイルになっていたら問題なので、ブランチの切り方などを見なおしたほうが良いでしょう。

コミットしたけど失敗した!コミットをやり直したい。

$git commit --amend

その他:ファイルをaddし忘れた・コミットメッセージをミスったなど。ただし、リモートリポジトリへpushする前に限る。

コミットを取り消して、指定の位置まで戻りたい

$git reset コミットID

指定したコミットIDのコミットを取り消すのではなく、そこまで戻るという意味。ただし、リモートリポジトリへpushする前に限る。

全てをなかったコトにして戻りたい

$git reset --hard コミットID

指定したコミットまで、全ての更新をなかったコトにします。ただし、リモートリポジトリへpushする前に限る。

コミットをハードリセットしてしまった…死にたい

上記 git reset --hard でコミットを闇に葬ってしまってから、しまった!となったオッチョコチョイなエンジニアのためにもgitは配慮してくれています。すべての行動は記録されているのです。

$git reflog
7a4b4b6 HEAD@{0}: reset: moving to 7a4b4b6e31a6f4c908ee41dfc29bd132b53bcf68
f6f79b0 HEAD@{1}: commit: aaa
$git reset --hard HEAD@{1}

reflogで行動履歴が出るので、戻りたい所を指定します。

意気揚々とマージしようとしたら、コンフリクト嵐、いったんマージをなかったコトにしたい

よっしゃ他のブランチとマージしたるぜ!とmergeなりrebaseなりしたら、コンフリクトの嵐…。いったん見なかったことにして元に戻したい。そんな時あると思います。

$git reset --hard ORIG_HEAD

まぁ、どっかで綺麗にマージしなきゃいけないんですけどね。

リモートブランチからmaster以外のブランチをローカルに新しくもってきたい

リモートリポジトリ上で master / develop / hoge.. など色々なブランチで運用している場合、新規で入ってきたエンジニアはcloneしてくるだけでは、通常masterしか存在してないのです。そこで、開発用developブランチに切り替えたいという時は、こんな感じで。

$git fetch
$git branch -a
* master
  remotes/origin/develop
  remotes/origin/master
$git checkout -b develop origin/develop

origin/develop(リモートブランチ)をdevelop(ローカルブランチ)として作って、ついでにチェックアウトするよって意味です。

リモートブランチを追加する

リモートブランチを後からadd(追加)/ rm(削除)するのは簡単。

$git remote add origin git@example.com:git_test
$git remote -v

pushしようとしたら、リモートリポジトリが先行していて怒られた

$git push
To git@exmaple.com:git_test
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@exmaple.com:git_test'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

チーム開発しているとよくある光景ですね。俺の更新ファイルがアップできん!みたいなの。こんな時は2つの回避方法があります。一つは、pushする前にpullする。お手軽です。よほどのコンフリクトがなければ、自動マージしてくれます。ただし、マージコミットが発生して後から見返すと、マージコミットだらけて分かりにくくなります。

$git pull --rebase
$git push

まぁ、安易にpullする前に、fetchしてどんな更新が先行しているのか確認するのがベストです。