Git & GitHub (Enterprise) セットアップガイド on Mac OS X


インストールするソフトウェア
====
* Visual Studio Code
* Hub 
* https://www.sourcetreeapp.com/ 

ここでは書かないが環境の前提
----
Termina: https://www.iterm2.com/ からインストール可能
zsh: Mac OS X default (since catalina) だが、 `brew install zsh` して最新版をインストールし、それを使う事を推奨。

Visual Studio Code
====
https://code.visualstudio.com/ からダウンロードしてインストール出来る。

起動語に、 [Command] + [Shift] + P から `Install 'code' command in PATH` を選択して、`code` というコマンドで起動するようにしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/83fd70cd-7afb-6ec6-4a1b-1822f4eacae0.png)

shell で `code --version` と入力すると正しくインストールが終わったことを確認できる

```
% code --version
1.45.1
5763d909d5f12fe19f215cbfdd29a91c0fa9208a
x64
```

Source Tree
====
https://www.sourcetreeapp.com/ ここからダウンロードしてインストールする。

※ AppStore からダウンロードしたものは、shell コマンドがインストール出来ないのでアンインストールして↑から再インストールしないといけない。

無料のユーザー登録が必要なので、しておく（今無くなった？）

左上から、［コマンドラインツールをインストール］ でコマンドラインツールのインストールを完了させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/f76dc26f-3c91-c3c6-f2e1-fdc08e8915ff.png)


```
% stree --version
stree version 1.3
```


git / git-lfs
====
* git / git-lfs は brew 経由で入れれば良い `brew install git git-lfs`

確認は次の `hub` と同時に

hub
====
* hub コマンドも必要（便利）なので入れておきます。 - [A command-line tool that makes git easier to use with GitHub. https://hub.github.com/](https://github.com/github/hub) 

```zsh
% brew install hub
```

hub コマンドは aliasing しておく必要があるため、以下を ~/.zshrc に記入します。

```zsh:~/.zshrc
eval "$(hub alias -s)"
```

.zshrc を書き換えた後は、シェルの再読み込みが必要。
git / git-lfs とあわせて、以下の表示になるはずです。

```
% git --version
git version 2.26.2
hub version 2.14.1
% git-lfs --version
git-lfs/2.11.0 (GitHub; darwin amd64; go 1.14.2)
```


### memo; GitHub CLI について

> GitHubは米国時間2月12日、リポジトリーの管理をターミナル上のコマンドラインインターフェース（CLI）から行いたいと考えている開発者らに向け、公式のCLIツールを公開した。
> https://japan.zdnet.com/article/35149382/

と鳴り物入りで作成された GitHub CLI ではあるが、2020-05 時点ではまだ GitHub Enterprise と連携できないなど、不十分な点が多い。

スグに patch されそうな気もするが、beta 期間中は対応予定が無いらしい。

> While in beta, GitHub CLI is available for repos hosted on GitHub.com only. It does not currently support repositories hosted on GitHub Enterprise Server or other hosting providers. We are planning support for GitHub Enterprise Server after GitHub CLI is out of beta (likely toward the end of 2020)
> https://github.com/cli/cli/tree/v0.8.0#availability

ghq
====
複数のリポジトリで作業する時、リポジトリを管理するためのコマンドです https://github.com/x-motemen/ghq
また、hub コマンドと組み合わせて使うため peco コマンドもインストールします

`brew install ghq peco` でインストール可能です。

https://github.com/Songmu/ghq-handbook/blob/master/ja/05-ghq-list.md を参考に、 ~/.zshrc に以下の項目を記入しておきます。
移動時に使います。

```zsh:~/.zshrc
peco-src () {
    local repo=$(ghq list | peco --query "$LBUFFER")
    if [ -n "$repo" ]; then
        repo=$(ghq list --full-path --exact $repo)
        BUFFER="cd ${repo}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```

基本的な設定
===
以下では、ソースコードは `~/dev/src/` に checkout するものとします。（オススメ）

まず、以下の設定は必ずやっておきます。

```
git config --global user.name "FIRST_NAME LAST_NAME"
git config --global user.email "MY_NAME@example.com"
```

user.email は、会社で使う PC の場合、会社から貸与された email address にします。
（いずれにせよ、リポジトリ・サーバー単位で変更可能です）

氏名のフォーマットは、解らなければ周りの commit ログを確認しましょう。

code を editor として利用する
----
以下の設定で VS Code が editor として利用できます。

https://help.github.com/en/github/using-git/associating-text-editors-with-git#using-visual-studio-code-as-your-editor

```
$ git config --global core.editor "code --wait"
```

ghq
----
ルートディレクトリを指定します

```
$ git config --global ghq.root "~/dev/src/"
```


ここまでのテスト
====
ここまでの設定が旨く行けば、 github.com のリポジトリが簡単にクローンできるようになっていると思います。

試しに、 https://github.com/line/line-bot-sdk-java をクローンします

`git clone` は使う必要はありません

リポジトリをクローンしたい場合、単純に URL を copy して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/2dd30d9d-5c6a-5c3c-a8e3-a67d7070b195.png)

任意のディレクトリで

```
ghq get (URL を貼り付け)
```

コマンドを実行すれば、自動的に `~/dev/src/github.com/line/line-bot-sdk-java/` にコードがコピーされます。

このときのパスは深いのですが、 `[Ctrl] + ]` で移動できますので、特に気にする必要はありません。

```
QUERY> sdk-java
/Users/kazuki-ma/dev/src/github.com/line/line-bot-sdk-java
```


GitHub enterprise に応じた設定
====

http://git.example.com で自社の GitHub enterprise が展開されているとします。

hub
---

hub コマンドに対して、サーバー `git.example.com` が GitHub Enterprise server だと通知する必要がある（複数設定可能)

```
git config --global hub.host git.example.com
```

設定を変更する
---
`git.example.com` 会社用 GitHub Enterprise と `github.com` のリポジトリそれぞれに対して操作する機会がある場合、サーバー名またはリポジトリ名毎のファイルを作って、条件つき include をすると良い。

以下の用に会社 mail address を global に設定している場合でも

```
git config --global user.email "MY_NAME@example.com"
```

`~/.gitconfig_github.com` を作成し、

```config:~/.gitconfig_github.com
[user]
email = matsuda.kazuki@gmail.com
```

`~/.gitconfig` に条件付き include 設定を書いておけば良い

```config:~/.gitconfig
[includeIf "gitdir:~/dev/src/github.com/"]
    path = ~/.gitconfig_github.com
```

minor, やる必要が無いことがほとんど) この方法は、Organization / Repository 単位でも有効なので、 github.com でも更に自分の organization xxx 向けの設定が必要であれば

```config:~/.gitconfig
[includeIf "gitdir:~/dev/src/github.com/xxx/"]
    path = ~/.gitconfig_github.com_xxx
```

としておき、 `~/.gitconfig_github.com_xxx` に自分の organization 向けの設定を書けば良い。


日常操作
====

リポジトリのデータを更新したいときは
----
ともかく PR するときは、fork することを基本だと思うのが良い。

ただし、fork してはいけない文化の所もある？（要出典）なので最終的にはリポジトリ毎のルールに従う必要がある
& 業務で GitHub の private repository を利用している場合、基本的に fork ができない。

### fork したリポジトリで作業する方法

git の remote は複数登録できる、git において、リモートネーム origin は特別な意味を持つので、 `origin` は fork した自分の repository を指定しておくのがよい。

ghq で checkout した場合は多少手間なのだが、fork してから checkout するか、checkout したものに対して origin を fork 先に切り替えるのかで諸説ある。。

### 他の人の PR を review する方法

fork すると他の人の PR が review しにくくなる、という意見があります。

* 公式の [Checking out pull requests locally](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally) を確認する（めんどくさいのでオススメしない
* IntelliJ 系の IDE を使っているなら[公式に従って設定をして](https://www.jetbrains.com/help/idea/github.html)、[Manage incoming pull requests](https://www.jetbrains.com/help/idea/contribute-to-projects.html#incoming_pull_requests) で PR 一覧を取得・Checkout できます
* VS code を使っているなら https://code.visualstudio.com/docs/editor/github


ディレクトリ移動
----
基本的に `[Ctrl] + ]` で移動が完了するはず。


普段の更新
----
普段の更新であれば、今の working tree (ディレクトリの中身） をそのまま commit したいはずなので、以下のコマンドを実行すればよい

```
git add -A && git commit
```

Visual Studio Code が起動して、メッセージ編集ができる。保存して閉じれば commit 完了

fixup
----
些末な修正でいちいち新規 commit を作る必要は無いので merge されるまでの修正は commit 追加ではなく、 commit を修正 (amend = 	修正する、(欠点などを取り除いて)改める） する場合は、専用のコマンドがある。

staging していない場合は `git add -u` (or `git add -A`) した後

`git commit --amend --no-edit` すればよい

* `--amend` = 直前の commit を修正する
* `--no-edit` = commit log は修正しない

`--no-edit` を含めないと、amend したあとの commit ログを書き換える事ができる


`git` には alias の機能があるので、 `git config --global alias.fixup 'commit --amend --no-edit'` として、 `git fixup` で `commit --amend --no-edit` が呼び出せるようにしておいても良いだろう。


特定のファイルのみ commit
----
`git add そのファイルのpath` で staging した後に commit すればよい。
（この機能を使わなければならない場合、何かおかしいことをしている可能性もある

特定の patch のみ commit
----
`git add -p` でpatch を見つけても良いし、一般的には Sourcetree を使うのがよいだろう。

『ステージングを分割して表示』オプションを有効にするのがオススメ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52956/37db9437-7125-624c-0a40-a2043c1588c3.png)

`stree` コマンドを実行すると、Sourcetree が起動するので、 commit したいものを staging （下の画面から check を付けて上に移す）をすれば良い。