Git の基本コマンドまとめ


# 初期設定

### インストールされた Git の確認

```
git version
```

### ユーザ名の設定 (Github で登録したユーザ名)

```
git config --global user.name "hogehoge"
```

### メールアドレスの設定 (Github で登録したメールアドレス)

```
git config --global user.email test@example.com
```

### Git でコミットやタグのメッセージを編集するときにデフォルトで使用されるエディタを設定

```ruby:Atomを使う場合
git config --global core.editor "atom --wait"
```

```ruby:VisualStudioCodeを使う場合
git config --global core.editor "code --wait"
```

### 設定内容の確認

```
git config --list
```

# ローカルリポジトリに反映させるまで

まずは Git で管理していきたいディレクトリに移動します。
その後、そのディレクトリを丸ごとローカルリポジトリに追加するために **git init** と打ちます。

```
git init
```

これで最初の準備の一つであるローカルリポジトリが作成できました。

さて、このあとは書いたコード等のファイルをローカルリポジトリに追加していきます。

普段、コードを書いたりファイルを作成する場所のことを Git では**ワークツリー**といいます。
このワークツリーの状況をローカルリポジトリに反映させる前に、
一度「このファイルは反映させる準備 OK」と明らかにするため**ステージ**にファイルを追加していきます。

このときのコマンドが **git add** です。

```
git add ファイル名
```

作業中のフォルダ内のファイルをすべて追加したければ **git add .** と打ちます。

```
git add .
```

これでローカルリポジトリに反映させる準備が整いました。
その他に反映させたいファイルが出来上がったら、追加で更にファイルを git add でステージに追加します。
そしていよいよ準備が整ったら、**git commit** でローカルリポジトリに反映させることになります。
さらにオプションで **-m "こめんと"** という形でコメント付きのコミットを実行できます。
変更内容が自分からみても、他の人から見ても分かるようになるので必ずつけるようにしましょう。

```
git commit -m "コメントを入力"
```

これでローカルリポジトリへ変更を反映できました。

ちなみにワークツリー内の変更を一旦、コミット前に確認することもできます。

```
git status
```

### 変更差分をみたいとき

**git diff** コマンドを使います。

```ruby:ワークツリーとステージの差分を確認
git diff
or
git diff ファイル名
```

```ruby:ステージとリポジトリの差分を確認
git diff --staged
```

### これまでの変更履歴をみたいとき

```
git log
```

```ruby:一行ずつ要約して履歴を表示
git log --oneline
```

```ruby:特定ファイルにおける変更差分を表示
git log -p test.txt
```

### ファイルの削除を記録

```ruby:ファイルごと削除
git rm test.txt
```

```ruby:ディレクトリごと削除
git rm -r testdir
```

```ruby:ファイルは残すがリポジトリから削除
git rm --chached test.txt
```

ちなみにこのとき削除したファイルを add はできないので、既にステージングが完了している状態になっています。

### ファイルの移動を記録

```
git mv testOld.txt testNew.txt
```

## Github 内の既存プロジェクトを作業するとき

あなたが開発チームに参入したときなど、既に Github に上がっているコードから作業をする時があるかもしれません。
そんなときは、まずはリモートリポジトリ（今回は Github 上）にあるファイル達を一度ローカルリポジトリとワークツリーにコピーしてきてあげます。

```
git clone リポジトリ名
```

リポジトリ名は、Github でコピーしたいリポジトリを開いたら Clone 用の URL をコピーできる場所から入手します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/74748fa2-b73f-3a56-4d54-8a97787036d8.png)

上記は私の Github 内に作ったテスト用のリモートリポジトリですが、これをローカルリポジトリおよびワークツリーにコピーするときはこんな感じです。

```
git clone https://github.com/tmasuyama1114/testgit.git
```

# リモートリポジトリ(Github)でコードを管理

### リモートリポジトリ(Github)を新規追加

**git remote add origin リポジトリ URL** で追加できます

```
git remote add origin https://github.com/tmasuyama1114/testgit.git
```

なお、clone したリポジトリで作業しているときは既に origin(ショートカット)が存在してしまっているので以下のコマンドで一度削除してあげます。

```
git remote rm origin
```

ここでいう**origin**は、登録するリモートリポジトリ URL の短縮名というイメージです。

### リモート

**git push リモート名 ブランチ名** でプッシュします

```
git push origin master
```

ちなみに最初に以下のようにオプションをつけておくと、次回以降 push するときに「origin master」とつけなくて済みます。

```
git push -u origin master
```

### Git で管理させないファイルを登録

パスワードが書いてあるファイルだったり、ただのキャッシュファイルだったりするようなものは Git でバージョン管理する必要がありませんね。
そういったファイルは **.gitignore** に書きます。

以下は、ignoreFile.txt というファイルをバージョン管理したくないときの .gitignore ファイルです。

```ruby:.gitignore
# 以下のファイルはGit管理対象外
ignoreFile.txt
```

# 変更を戻す時

### ファイルへの変更を取り消す

```
git checkout --test.txt
```

### ディレクトリ全体の変更を取り消す

```
git checkout --testdir
```

### 全変更を取り消す

```
git checkout --
```

# ステージした変更を取り消す (git add したものを取り下げる)

### ステージしたファイルを取り消す

```
git reset HEAD test.txt
```

### ステージしたディレクトリを取り消す

```
git reset HEAD testdir
```

### ステージした全変更を取り消す

```
git reset HEAD
```

# コミットのやり直し

push する前ならばコミットをやり直せる（修正できる）

### 直前のコミットのやり直し(今のステージの内容で)

```
git commit --amend
```

# リモートリポジトリとのやり取り

## リモートリポジトリの設定

### リモートを表示

```
git remote
```

```ruby:詳細情報
git remote -v
```

### リモートリポジトリを複数登録

```
git remote add リモート名 リモートURL
```

例えば origin の他に other というリモートリポジトリを登録した場合は
以下のようなコマンドで push などの操作を行うことになります。

```
git push other https://xxxxxxxxxx
```

## リモートから取得（フェッチ）

フェッチはリモートから情報をコピーした後、すぐにマージしない時に使うコマンドです。

```
git fetch origin(リモート名)
```

フェッチの場合、ワークツリー(master)には保存されずブランチとして保存されるので
内容を表示したいときは **git branch -a** でフェッチしたものを確認し、
**git checkout remotes/origin/master** でブランチを切り替えます。

フェッチした内容を origin/master ブランチに merge したいときは
先に git checkout master で master ブランチに戻り、以下のコマンドを入力します。

```
git merge origin/master
```

## リモートから取得（プル）

プルはリモートから情報をコピーした後、すぐにマージする時に使います。

```
git pull origin master
```

そのため、上記のコマンドと下記のコマンドは同じ意味を持ちます。

```
git fetch origin master
git merge origin/master
```

## リモートの詳細情報を表示

```
git remote show origin
```

## リモートを変更する（リネーム）

```
git remote rename 古いリモート名 新リモート名
```

## リモートを削除する

```
git remote rm リモート名
```

# ブランチの操作

### ブランチを追加

```
git branch ブランチ名
```

### ブランチの一覧を表示

```
git branch
```

### すべてのブランチを表示

```
git branch -a
```

### 既存のブランチを切り替える

```
git checkout 既存ブランチ名
```

### ブランチを新規作成して切り替える

```
git checkout -b 新ブランチ名
```

### 変更をマージ

```
git merge ブランチ名
```

### ブランチ名の変更(作業中のブランチで入力)

作業中のブランチで以下を実行します。

```
git branch -m 新しいブランチ名
```

### ブランチの削除

```
git branch -d ブランチ名
```

上記を実行したとき、対象のブランチがもし master にマージされていないブランチである場合には削除できません。
それでも強制的にブランチを削除したいときは、

```
git branch -D ブランチ名
```

# コンフリクトの扱い

同じファイルで、同じ行に対して異なる変更を行うとコンフリクトが発生します。
その際にはコンフリクトを解消してあげる必要があります。

## 解消方法

コンフリクトしたファイルには、コンフリクトが発生した箇所がわかるようになっているので
最終的な(正しい)形にファイルを修正してあげれば OK です。

### コンフリクトが起きているファイルの確認方法

```
git status
```

で確認すると、該当のファイルが表示されます。
そしてワークツリー内のファイルを確認するとコンフリクトについての記載があるので、あるべき姿になるように修正の上
git add と git commit をしてあげればコンフリクトを解消できます。

### コンフリクトの防止するための注意点

- 複数人でファイルを同時に編集しないこと
- pull を行う際は、pull をしようとしているブランチに checkout してから pull を行うこと
- pull・merge をする前に commit or stash を行い、編集中のファイルを無くす