はじめに
先日、社内勉強会でgit/githubの個人的に好きなコマンドについて発表しました。
弊社ではgithubを使って開発を進めているため、聞いている人は基本的なコマンドについて理解しています。 その上で、あまり知らないであろうマイナーなコマンドについて発表しました。 今回はその発表の中から、いくつか社内で反響の大きかったものをピックアップしてお届けしようと思います。
(基本的な使い方については Atlassianさんの記事 https://www.atlassian.com/ja/git/tutorial/git-basics がわかりやすいと思います。)
gitの便利な使い方
git rebase -i HEAD~[X]
Pull Requestを作成する前にcommitを整理して見やすくしたい、等の場合に使います。
[X]のところは、何個前のcommitまで遡って修正するかの数字を入れます。 4個前であれば git rebase -i HEAD~4 になります。
知ってる人がほとんどだったのに、一番盛り上がった気がします。
基本的にはPullRequestを出す前にやるべきですが、「WIPとついたPullRequest」に使ってよいか?という点で議論が起きました。レビュー依頼出す前ならOK、という結論に。
打つと以下の様な編集画面になります
pick 1a2b3c4d 修正A pick ab12cd12 修正B pick dcb12a34 修正Aのtypo pick cd987ab1 修正Bのtypo ## Commands: ## p, pick = use commit ## r, reword = use commit, but edit the commit message ## e, edit = use commit, but stop for amending ## s, squash = use commit, but meld into previous commit ## f, fixup = like "squash", but discard this commit's log message ## x, exec = run command (the rest of the line) using shell
#の後はコメントなので無視されますが、以下の様なマニュアルが表示されています。 - p, pick そのままのかたちでcommitを使います - r, reword commit messageは変更するけど、内容はそのまま使います - e, edit いったんそこでrebaseを止めます。その状態で任意の編集をした後にgit rebase continueでrebaseを進めます。 - s, squash 直前のcommitにamendします。commit messageを編集します。 - f, fixup 直前のcommitにamendします。直前のcommit messageをそのまま使います。 - x, exec 任意のシェルコマンドを実行します。exec ls みたいな感じで指定します。
上の例だと、typoをそれぞれのcommitにamendしたいので、以下のように編集するとよいでしょう。
pick 1a2b3c4d 修正A fixup dcb12a34 修正Aのtypo pick ab12cd12 修正B fixup cd987ab1 修正Bのtypo
すると、修正Aと修正Bの2つのcommitにまとめられるはずです。
(git rebase -i はあまりマイナーではないですね。)
git reflog + git reset HEAD@{X}
何か失敗した時に、前の状態に戻すためのコマンドです。
git logとの違いは、commit単位でなく、基本的に全ての操作を戻せる点です。
- 間違えてamendした
- branchを間違えて消した
という時に便利です。
まず、git reflogすると操作の履歴が出てきます。
af87bc65 HEAD@{0}: checkout: moving from bugs/xxxx to feature/xxxx bc8765ab HEAD@{1}: checkout: moving from feature/xxxx to bugs/xxxx ec8fed65 HEAD@{2}: commit: fixup xxxx abc8765f HEAD@{3}: commit: fixup xxxx cba8d765 HEAD@{4}: commit: gh-1234 fix xxx dc87ab65 HEAD@{5}: rebase finished: returning to refs/heads/feature/xxxx
戻したいところの、HEAD@{X}の数字を覚えておいて、たとえばHEAD@{2}に戻したいときは
git reset HEAD@{2}
で戻します。もちろん、reset --soft / --hard も指定できます。
普段はあまり使いませんが、知っているとより気軽にamend出来るようになりますね。
git update-index --assume-unchanged
ローカルに加えた変更を無視するためのコマンドです。
- OSSにしたいけどOAuthSecretをハードコーディングしたいとき
- XCodeのチームプロビジョニングのところがConflictしてつらいとき
- よくつかうdebugフラグをOnに保ちたいが、commitしたくないとき
みたいな状況で便利です。chunk単位の指定もできます。
よく似たコマンドにgit update-index --skip-worktreeがあります。
違いは
- --assume-unchanged リモートが変更されたときは、リモートを取り込む
- --skip-worktree リモートが変更されても、ローカルを残す
です。
取り消すときは--no-assume-unchanged / --no-skip-worktree を使います。
弊社では、わりと知らない人が多かったです。Xcodeを使ってる人は役立つ機会が多そうです。
git instaweb
gitのヒストリーをブラウザから確認するためのコマンドです。
まだ公開していないローカルレポジトリやgithubが落ちた時に視認しやすいと思います。
RSSで購読、などマイナーな使い方もできます。
発表しといてなんですが、あんまり使わない気がしますね・・・。
githubの便利な使い方
全体的に小ネタです。
コメント時にマウスカーソルで選択してrで引用できる
PullRequestやissueにコメントをするときに、 引用したいところをマウスカーソルで選択状態にして、 そのままキーボードのrを押すと引用できます。
地味に便利です。弊社では、知らない人が多かった気がします。
?w=をURL末尾に付けると git diff -w相当になる
PullRequestなどでホワイトスペースを無視したdiffを見ることが出来ます。
コミットメッセージに Fix #123 とか書くとissueを閉じれる
参考 : https://help.github.com/articles/closing-issues-via-commit-messages/
マージするときにissueが閉じられるはずです。
wikiやgistもcloneできる
弊社ではデザイナーさんもgitでアセットを管理していますが、 もしgitに不慣れな方であれば、アセットや利用規約などをwikiに貼ってもらうと便利かもしれません。
おわりに
gitのコマンドは奥が深いですが、色々試してみる前にgit reflogを覚えておいて損はない気がします。