いまさら聞けないgitの使い方


# はじめに

表題のとおり、いまさら聞けないgitの使い方だが、正直マイナーなコマンドはヘビーユーザではない限り、必要になるたびにGoogleで検索しているのが実情ではないだろうか。このページではその備忘録として、基本的な使い方＋アルファのgitコマンドについてまとめる。

# 基本操作

## リモートリポジトリからクローンする

大抵のgitプロジェクトでは、githubなどから自分の環境にクローンを作成するところからはじまる。基本文法は以下の通り

```
$ git clone <uri>
```

このuriの中に入るのは、http,httpsから始まるurlやsshプロトコルで指定するもの、gitoliteなどの他のソフトウェアと連携するものなどいくつかのパターンがある。

### http, httpsを使う場合

だいたい、githubからcloneする場合はこのパターン。

```
$ git clone https://github.com/YYYYYY/XXXXX.git
```

ウェブデザインが変化してからだいぶ経つが、httpsのurlはページ右サイドバーの、HTTPS clone URLのボタンをクリックするとクリップボードにコピーされる。

### sshプロトコルから始まる場合

研究室や会社の一部門などの比較的ローカルなセクションで、gitを使っている場合はこのケースが多い。

```
$ git clone ssh://user@hostname/path/to/repos
```

ユーザにはアクセスするユーザ名、hostnameはローカルマシンのホスト名またはIPアドレス、/path/to/reposには、gitリポジトリまでの絶対パスが入る。ホームディレクトリからの相対パスじゃないことに注意。

### gitoliteなどの他のサードパーティのソフトとの連携

それぞれの内容に従ってください。

```
$ git clone gitolite@<hostname>:<projectname>
```

上記は、標準的にセットアップされたgitoliteのアクセス方法。詳しくは以下のページ参照。

* http://git-scm.com/book/ja/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Gitolite

## 自分用にローカルにgitリポジトリをつくる

自分用にリポジトリを作る場合は、プロジェクトのディレクトリの中で、ゴミファイルやビルド途中でできたファイルなどを削除し、以下を実行する。

```
$ git init
$ git add *
$ git commit -m "initial import"
```

リポジトリを初期化し、現在あるファイルを全部登録して、コミットする手順を実行すると、初期インポートまでが完了する。

## ローカルで開発するときに必要な作業

最も多用するコマンド群です。ローカルのみで作業している人は、「リモートリポジトリ・・・」の件は無視してよいです。

### 変更のコミット

いちいち、変更したファイルを登録したり、コメントをエディタを立ち上げて書くのが面倒なので、以下のコマンドに落ち着く

```
$ git commit -a -m "<comment>"
```

-aオプションは、既に登録されたファイルで変更点があるものをすべて指定するという意味、-mオプションはその後につづく文字列をコメントとして追加する。

### 新しく出来たファイルの登録

開発途上でできたソースファイルや設定ファイル、ライブラリは以下のコマンドで追加する

```
$ git add <file>
$ git add <directory>
$ git add <wildcard. e.g. *.java>
```

addの後に続くものは、ファイルやディレクトリの他にワイルドカードも使えます。

```
$  git add -A
```

プロジェクトディレクトリ中に追加されたすべてのファイルを追加する場合は上記が便利。ただし、コンパイルの中間ファイルなども登録されちゃったりするので、注意。

### 変更したファイルのコミット

git mvを用いず、エディタなどで変更したファイルの変更履歴をコミットする場合は以下を用いる．

```
$ git add --all <target>
```

オプションをつけない場合のgit addコマンドは、省略しないと

```
$ git add --ignore-removal <target>
```

に設定されていて、ワーキングツリーから削除されたファイルの追跡は行われないようになっているとのこと．ちなみに、疑わしき状況になるとwarningでしっかりと警告されます。以下、原文。

```
* 'git add --ignore-removal <pathspec>', which is the current default,
  ignores paths you removed from your working tree.

* 'git add --all <pathspec>' will let you also record the removals.

Run 'git status' to check the paths you removed from your working tree.
```

eclipseはgitプラグインがちゃんとしていないので、手動でコミットしている人はたびたびお世話になるかもしれない．

### ファイル権限の編集

うっかり実行権限を付け忘れてコミットした場合は、以下のコマンドで権限を修正可能

```
$ git update-index --add --chmod=<options> <target>
# e.g.
$ git update-index --add --chmod=+x <target>
```

### 不要なファイルの削除

実装過程で不要になったファイルは以下のように削除できる

```
$ git rm <target>
$ git rm -r <target dir>
```

ディレクトリ単位で削除したい場合は、-rオプションをつけると良い。中間ファイルなどを誤ってコミットしてしまった場合、--cachedオプションを使って削除すると、ローカルコピー上からは削除されず、git管理ファイルから外すことが出来る

```
$ git rm —cached <target>
$ git tm -r —cached <target dir>
```
## まだコミットしていない内容のコミット状態までのロールバック（svn revert相当）

編集中の内容からコミット済みのところまで戻りたい場合は以下のようにして、ロールバックできる。svn revertと一緒。

```
$ git checkout <target file name>
```

## リモートリポジトリとのシンク

チームプログラミングして、自分のローカル環境と、リモートリポジトリの内容をシンクしたい場合には以下のコマンドを使います。

### リモートリポジトリからローカルのリポジトリへ変更を反映

自分が寝ている間に他の小人さんがソースに加えた変更を自分のリポジトリに反映します。

```
$ git pull
```

### リモートリポジトリへローカルで編集した内容の反映

ある程度ローカルで編集した内容をリモートリポジトリに反映するときに使います。

```
$ git push
```

ローカルのタグのpushは

```
$ git push --tags
$ git push origin <tagname>
```

### ブランチで作業しているときのpushとpull

#### remoteのブランチ（への変更）を取得するとき

```
$ git pull origin <branchname>
$ git checkout <branchname>
```

checkoutは、まだそのブランチに移行していないとき実行する。すでにそのブランチで作業しているときはいらない。

#### ブランチのremoteへのpush

ブランチのpushは以下で実行する。

```
$ git push origin <branchname>
```

基本的には、

```
$ git push/pull origin <tagname>
```

だということさえ覚えておけば、後の開発方法は一緒である。自分がいま、どのブランチで作業しているかは以下を実行して調べられる。

```
$ git branch
```


# 知っておくと便利だけど、だいたい使わず忘れるコマンド

## アーカイブの作成

配布物をつくるときは以下のコマンドを使います。svn exportとだいたい同じ。

```
$ git archive --format=tar --prefix=<dir/> HEAD | gzip > <path/to/repo.tar.gz>
$ git archive --format=tar --prefix=<dir/> HEAD | bzip2 > <path/to/repo.tar.bz2>
```

prefixには、archiveが解凍されたときのディレクトリ名が、<path/to/repos.tar.gz|.tar.bz2>にはtarballのパスが入ります。

## タグの作成とタグづけされた状態への移行

### タグの一覧

以下のコマンドで一覧を見ることが出来ます。

```
$ git tag
```

### タグの作成

タグの作成。オプション付きだけど、以下のセットが便利です。

```
$ git tag -a <tagname> -m <comment>
```

tagnameにはタグの名前（たいてい、"v0.0.X"のような文字列が入ります）。commentにはコメントが入ります。

### タグの反映

クローンしてきたリポジトリをタグ付けされた状態に戻すときに使います。

```
$ git checkout refs/tags/<tagname>
```

## 管理されているファイルの一覧を見る

初期のインポート時に、全部インポートしたか確認するときなどに便利．

```
$ git ls-files
```

## ブランチの作り方

### ブランチの確認

```
$ git branch
```

### ブランチの作成

\<new branch name>という名前のブランチを作成します。

```
$ git checkout -b <new branch name>
```

### リモートブランチの取得

リモートブランチの取得は以下のコマンドから実行する。git pullするとすごいことになるので、checkoutでやったほうが良い。

```
$ git checkout -b <same branch name with remote> origin/<remote branch name>
```

たとえば、developというリモートブランチがある場合、

```
$ git checkout -b develop origin/develop
```

となる。

### ブランチの切り替え

\<branch name>というブランチに切り替えます（そのブランチ名がない場合は作成します）

```
$ git checkout <branch name>
```

### ブランチの削除

\<the branch name to be removed.>という名前のブランチを削除します。

```
$ git branch -d <the branch name to be removed.>
```

### リモートリポジトリへの反映

リモートリポジトリにブランチ\<branch name to be updated.>をpushします。

```
$ git commit -a -m “comments”
…
$ git push origin <branch name to be updated.>
```

githubのpullリクエストでよく使うので、覚えておきましょう。

## githubとの密な連携

githubとの連携をするなら、github拡張のhubを利用すると良い。コマンドラインからpull requestを行うなど、より密にgithubと連携できる。

```
## OSX
$ brew install hub
```

インストールはOSXなら上記のコマンドで、他のOSならバイナリが以下から入手できる．

* https://github.com/github/hub/releases


その後、.bash_profileに以下を設定すると、hubコマンドとしてgitを使用できる。

```
eval "$(hub alias -s)"
```

以下は新たに追加されるコマンドの一部

```
## clone
$ git clone hoge/geho
> git clone https://github.com/hoge/geho.git
## pull-request
$ git pull-request
```

詳細なコマンドは以下を参照のこと

* https://github.com/github/hub