未経験からエンジニア転職後、1年半の間に実務で使ったGitコマンド【初心者向け】

# はじめに 
他業種、他業界からのエンジニア転職をした後、1年半が経ちました。
その間に使用したGitコマンドをご紹介します。
転職前のGitレベルは実用レベルではありませんでした。。
実務で使うようになり、以下のコマンドの組み合わせで特に困らずにやっていけています。
今後、エンジニアを目指される方は覚えておいていただくと役に立つのではないかと思います。
開発の順に沿って説明しているので、こんな順で使っていくんだなということも理解できるようにと心がけています。


## Git初心者へメッセージ
プッシュさえしなければ、周りに迷惑が拡大することはありません。
手元の環境でコンフリクトしようが、プログラムが消えようが大丈夫です。何とかなります。
もし、自分が作った部分がなくなっても、もう一度作ればいいんですから。
Gitには様々なオプションがあります。その中でも「-f」は最強のオプションです。
慣れないうちは使うのをやめましょう。初心者にとってはバルスみたいなもんです。
必ず周りの人に相談してください。
相談すれば、そんなオプションを使わなくても回避できることが多いはずです。
初めはとても怖いですが、一つずつ自信を持って実行できるコマンドを増やしていきましょう。

## 各コマンドの重要度
個人的な感覚で重要度を星の数で表していますので、優先順位の参考にしてください。

★★★・・・必ず覚えよう
★★☆・・・覚えておくと便利
★☆☆・・・必要になったときに覚えよう

# コマンド紹介
## プロジェクト開始！
まずはリポジトリの操作から
### リモートリポジトリからリポジトリを複製する　★★★

```
$ git clone {リモートリポジトリ} {ローカル開発環境ディレクトリ}
```
例）

```
$ git clone https://github.com/username/projectname.git test/projectname
```
この例だと、カレントディレクトリに対して、test/projectnameのディレクトリ内にリポジトリを複製するということ。自分のパソコン内のリポジトリをローカルリポジトリといいます。
ディレクトリ部分の記述をしなければ、カレントディレクトリに複製する。

### 現在のリモートリポジトリを確認する　★☆☆

```
$ git remote -v
```

通常は、クローンしたリポジトリを「origin」と省略して呼んでいます。
### 別のリポジトリを追加する　★☆☆
別のリポジトリも一緒に操作したい時が出てきますので、別のリモートリポジトリを接続することができます。

```
$ git remote add {リポジトリの略称} {追加したいリモートリポジトリ}
```
例）

```
$ git remote add project2 https://github.com/username/projectname2.git 
```
これで、originとproject2というリポジトリを追加することができました。
`git remote -v`で確認してみてください。

## ブランチ操作
### 現在のブランチを確認する　★★★

```
$ git branch
```

リモートリポジトリのブランチ情報を見るために以下のオプションをよく使います。　★★☆

```
$ git branch -a　または　$ git branch -avv
```

### ブランチを新規作成　★★★

```
$ git branch 作りたいブランチ名
```

### ブランチを移動　★★★

```
$ git checkout ブランチ名
```
これでブランチを作って移動することができました。
ただ、コマンドが2つになり面倒なので、以下のコマンドをよく使います。
### ブランチを作りながらブランチを移動　★★★

```
$ git checkout -b ブランチ名
```
これで、ブランチを作ってそのブランチに移動。
簡単にまとめると以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/b5bfe5a7-ab73-64d9-938a-d57eca7be47a.png)


### ブランチ名を変える　★★☆
タイプミスや実は作業内容とブランチ名が全然違って気持ち悪いというときによく使います。

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

### ブランチを削除　★★☆

```
$ git branch -d ブランチ名
```
ただし、対象のブランチがどのブランチにも取り込まれていないときは、実行しても拒否される。
どうしても消したいときは、以下。　★☆☆

```
$ git branch -D ブランチ名
```
dを大文字にしただけですね。

### リモートリポジトリのブランチを削除　★☆☆

```
$ git push origin :ブランチ名
```

#プログラムの変更が完了したら
### 変更したファイルを確認する　★★★

```
$ git status
```
変更があったファイルは赤い文字でカレントディレクトリからのファイルパスが示されます。

### どのような変更を行ったか確認する　★★★

```
$ git diff
```
ファイルを指定することができます。

```
$ git diff ファイル名１　ファイル名２　ファイル名３
```
ステージに乗せた（後述）ファイルを確認するにはオプションが必要です。同じようにファイル名を指定できます。

```
$ git diff --staged
```

### 変更プログラムをステージに乗せる　★★★
プログラムをgit上で保存するにはまず、どのファイルを保存するかを指定します。
変更ファイルをすべてステージに乗せる。

```
$ git add .
```
ステージに乗せられたファイルは`git status`とすると、緑色の文字で示されます。
ファイルを指定してステージに乗せる。以下のように複数のファイルを同時に指定することができます。

```
$ git add ファイル名１　ファイル名２　ファイル名３
```

ステージに乗せたファイルをステージに乗せていない状態にする。間違えて指定してしまったときに使います。

```
$ git reset ファイル名１　ファイル名２
```
### 変更をキャンセルしたい　★★★

```
$ git checkout ファイル名
```
これで、ファイルの変更が即座にキャンセルされます。

#変更を記録する
### 変更を記録する　★★★

```
$ git commit -m '変更内容がわかるコメント'
```
`git status`で緑色に示されたファイルをまとめて変更が記録されます。

### コメントを間違えたので修正したい　★☆☆

```
$ git commit --amend -m '新しいコメント'
```

### 変更を直前のコミットに含めたい　★☆☆
変更後、ステージにファイルがある状態でコメントを変更するコマンドでOK。

```
$ git commit --amend -m 'コメント'
```
### コミットされたか確認する。　★★★

```
$ git log
```
これで、ログがざざっとでてきます。
上にいくほど新しく、新しいものから表示され、下にスクロールしていくと古い情報をさかのぼることができます。
よく使うオプションは、以下です。変更したファイル名も一緒に出てきます。

```
$ git log --name-status
```
ツリー状に表示したり、変更内容を確認したり、対象を絞ったりといろいろなことができます。
ログの詳細な確認はSourceTreeを使っています。
https://www.sourcetreeapp.com

# リモートリポジトリに反映させる
ここからが長いんです。。。
でもここは、複数の人が関わるからこそ重要なコマンドです。ぜひ、覚えましょう。

## 基本的な手順
１．変更したプログラムを取り込みたいブランチに移動
２．移動先のブランチを最新の状態にする。（リモートリポジトリにプログラムが反映されている場合、取り込む）
３．変更したプログラムを取り込む。
４．変更が重複したら修正する。
５．プログラムをリモートリポジトリに反映させる。

では、行きましょう。


何はともあれ、ブランチ移動ですね。繰り返しになりますが。。

```
$ git checkout 移動先のブランチ名
```

### プログラムを最新の状態にする　★★★

```
$ git pull
```
または

```
$ git fetch origin 
$ git merge origin/ブランチA
```
後者はトラッキングブランチを最新の状態にしてからマージします。　　　　　え？？
`origin/ブランチA`はトラッキングブランチと言い、リモートリポジトリにアクセスしてリモートリポジトリのブランチAの内容をローカルリポジトリに取得したもので、これは開発中のブランチとは別です。
`git fetch origin`で、リモートリポジトリの情報を引っ張ってきます。
そのあと、`git merge origin/ブランチA`で今のブランチに最新のブランチAの情報を取り込みます。
originとブランチAの間にある「/」はスペースではありません。
[参考記事](https://qiita.com/uasi/items/69368c17c79e99aaddbf)

### 作成したプログラムを取り込む　★★★

```
$ git merge 作業したブランチ
```
現在のブランチがmainという名前のブランチとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/67a57c5a-0763-bd65-3fcd-8e11e653353b.png)

では、いよいよほかのメンバーが参照できる状態にしていきます。
以下のコマンドを実行する前に一息おきましょう。
#### リモートリポジトリに反映する　★★★

```
$ git push origin main
```
プッシュしてしまったら変更などがとてもしにくくなります。
他の人が取り込んでしまっている可能性があるからです。
#### 作業ブランチをリモートリポジトリに反映させる　★★☆

```
$ git push origin feature
```
リモートリポジトリに同名のブランチがなければ作ってくれます。
あれば、同名のブランチに反映します。


















































# ややイレギュラーな操作
以下でコミットハッシュを使ったコマンドが出てきます。
コミットハッシュとは`git log`で表示されるときにcommit:の隣に出てくるなが～い数字とアルファベットの文字列のことです。

#### コミットしたけど、コミットする前の状態に戻したい（プッシュした後は不可）　★★☆

```
$ git reset --soft HEAD^
```
#### 手元のプログラムを指定のコミットの位置に戻したい。　★★☆

```
$ git reset --hard コミットハッシュ
```
#### 指定のコミットの内容だけを取り込みたい。　★★☆

```
$ git cherry-pick コミットハッシュ
```
#### 指定のコミットの情報と全く逆の追加を行い、打ち消す。　★☆☆

```
$ git revert コミットハッシュ
```
#### リモートリポジトリの特定のブランチの情報を落としてきたい。　★★☆

```
$ git fetch origin ブランチ名:ブランチ名
```

#### 編集内容を一時的によけておきたい　★★☆

```
$ git stash save
```
戻すときは以下。

```
$ git stash pop
```
`stash`は`list`や`apply`などがあります。

現職では`git flow`という開発手法を採用していますが、これは複数のコマンドを一つのコマンドでまとめたようなもので、各作業者によって全然違うブランチ管理をすると不都合が起こりやすくなるので、操作方法を統一するためのものだと理解しています。
それぞれのコマンドの意味が分かっていることが大切です。


# 終わりに
Gitのコマンドはたくさんありますが、ぼくが実務で使っているコマンドはそれほど多くありません。
forkとかrebaseとかなんだかありますが、今のところ使わなくて困ったことはありません。
必要になったら覚えることができます。
上記のコマンドを繰り返し使っていくうちに何をしているかだんだんわかってくるので、使ったことのないコマンドは調べたら動作がわかると思います。
まずは、自信をもって使えるコマンドを一つずつ増やしていくことが大切です。
以上、ここまでお読みいただきありがとうございました。