この記事は Microsoft Student Partners Japan Advent Calendar 2017 2日目の記事です。

どうも、ラルフです。

閑古鳥が鳴いているアドカレなので、少しでも埋めていきたいと思います。

突発的に思いついたネタなので、MSPですが、MS関係なくgitについてです。

git って便利だよね

表題の通り、gitって便利ですよね。

変更履歴は遡れるわGithubとかにホスティングすれば公開や万が一のためのバックアップにもなるし、git bisectみたいなコマンドとかもあったりします。

一方で習得コストも多少あるわけですが、今回は基本のコマンドは使える人を対象にした、自分が日頃から行っている git を少し便利にするための Tips を共有したいと思います。

1. リポジトリ作成時に空のコミットを作成する

git init をした直後、何も add せずにコミットを作成します。

1
2
git init
git commit --allow-empty -m "Init commit"

通常は空のコミットを作成することはできませんが、--allow-empty をつけることで可能になります。

https://github.com/r-ralph/CRC32C.Standard/commit/ec9a37f000923ce0e8e79b30958466e70df52209

このようなコミットが作成されます。

どうしてこのようなコミットを作成するかというと、例として git rebase -i なんかで最初のコミットに操作を対象にインタラクションリベースを行いたいとなった場合、通常であれば git rebase -i --root のようにハッシュでない引数を渡す必要があります。

しかし、案外 --root のことを忘れることも多々あるので、空のコミットを作成し、それを参照することで擬似的なroot-rebaseを行えるようにしています。(rebase自体そこまでしませんが・・・)

後なんか便利なことがあったのですが、忘れてしまったので思い出したら追記します。

2. GithubのPullRequestをpullするコマンド

GithubのPullRequestを確認したい時、手元で動作させたり、IDE上で見てみたりしたいことがあると思います。

1
git fetch origin pull/1/head:pr_1

一応このようなコマンドでIDが1のPullRequestをローカルの pr_1 ブランチに持ってこれますが、わざわざ入力するのもめんどいです。

そこで、gitのカスタムコマンドの機能を作ってわかりやすく取ってこれるようにしたいと思います。

こちらの記事に書いてあるように、git-[command] という実行可能なファイルをPATHの通っているところに置くことで、git [command] といったコマンドで実行することが可能になります。

今回は、git-pull-pr という名前のファイルを作成して、git pull-pr 1 のような感じで使えるようにします。

中身はこんな感じです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

print_help_and_exit () {
    cat << EOF
usage: git pull-pr [remote] <pr_id&gt;
Pull pull request branch from specified remote.
EOF
    exit
}

case "$1" in
  -h|-?|--help)
    print_help_and_exit
    exit
    ;;
esac
if [ -n "$2" ]; then
  REMOTE="$1"
  PR_ID="$2"
elif [ -n "$1" ]; then
  PR_ID="$1"
  REMOTE="$(git config --get branch.${BRANCH}.remote)"
  if [ -z "$REMOTE" ]; then
    REMOTE="origin"
  fi
else
  print_help_and_exit
fi

echo "Pulling pull-request from remote $REMOTE into pr_$PR_ID"

exec git fetch "$REMOTE" pull/$PR_ID/head:pr_$PR_ID

こうすることで、 git pull-pr 1 と実行すると pr_1 ブランチでローカルでcheckout出来るようになります。

1
2
3
4
5
6
7
8
9
# git pull-pr 485
Pulling pull-request from remote origin into pr_485
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 28 (delta 13), reused 28 (delta 13), pack-reused 0
Unpacking objects: 100% (28/28), done.
From github.com:******/******
 * [new ref]           refs/pull/485/head -> pr_485
#

まとめ

他に色々便利に改造してるのもあった気がするので、思い出したら更新します。

gitはいいぞ