Git初心者によるgit入門・機能まとめ

## コマンド早見表
よく使うコマンドのコマンド名と使い方を例と共にまとめてみる。

| コマンド|使い方 | 例 ||
|:-:|:-:|:-:|:-:|
|branch|`$ git branch <ブランチ名>`|`$ git branch sub`|"sub"という新ブランチを作成|
|checkout|`$ git checkout <ブランチ名>`|`$ git checkout sub`|"sub"というブランチに切り替え|
|fetch   |```$ git fetch <リモート名>```   |```$ git fetch origin```   ||
|merge   |```$ git merge <リモート名>/<ブランチ名>```   |```$ git merge origin/master```   ||
|〃|`$ git merge <ブランチ名>```   |```$ git merge master```   |(リモート名は省略可能)|

git push -u origin 作成したブランチ名

# 1. githubへのプッシュの仕方
1 初期化 ```$ git init```
2 ```$ git add <ファイル名>```
3 ```$ git commit -m  "コメント"```
4 ```$ git remote add origin  <URL>```
このURLはgithub上のもので、
緑色のボタン(Clone or download)を押すと表示される
https://github.com/＜ユーザー名＞/＜リポジトリ名＞.git
のこと
<img width="756" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474340/4ad7ca9a-2d0f-1a5d-0cda-76318e61614c.png">

5．mainブランチにpushしたいとき
ローカルの `master` ブランチの名前を `main` に変更する
``` $ git branch -m master main ```

<+α 新しくブランチを作った上でpushしたいとき>
下のコマンドを打つことで新しくブランチが作成されます！
```$ git checkout -b <ブランチ名> ```


6 ```$ git push origin <ブランチ名>```
ブランチ名はデフォルトではmain
(以前はmasterだったので注意！)

+α) 下記のようなエラーが出た場合
<img width="467" alt="コメント 2019-12-28 145211.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474340/f1be135d-eb72-9d09-1f08-7efb78acd386.png">

```$ git pull --rebase origin master```を入力してから、git pushをすればOK!!
 

## ブランチをリモートに登録(+α)
git push -u origin 作成したブランチ名


# 2.コマンドまとめ

## 2-x ブランチの作成  git branch
(#41~43)
Gitはバージョン管理ツールであるが、この根幹をなすバージョン管理にはブランチの概念を抑える必要がある。

**ブランチとは？**
コミットを指すポインタ。つまり、バージョン管理をするのはこのポインタだけで、ポインタを切り替えるだけで管理ができるので、高速!!
(Git登場前のバージョン管理ツールは変更差分を記録するものが多かった←重い)

デフォルトのブランチはmasterだが、以下のようにして新たなブランチを作成することが可能。

```bash
$ git branch <ブランチ名>
```
`$ git branch`単体では、存在するブランチを表示
`$ git branch -a`で、リモートを含む全てのブランチ名を表示
**ブランチ名の変更** : `$ git branch -m <ブランチ名>`で、今使っているブランチを入力したブランチ名に変更する。(mはmoveの頭文字)
**ブランチの削除** : `$ git branch -d <ブランチ名>`で、指定したブランチを削除
(強制削除を行いたい場合は `-D`を使う！)

## 2-x ブランチの切り替え　git checkout
(#44)
`git checkout`コマンドを用いることによってブランチの切り替えが可能になる。(複数人での開発にはブランチは必須になってくるのでcheckoutも覚えておくべきコマンドである)

- オプションとしては`-b`が便利(bは、branchの頭文字)
このオプションを加えて、`git checkout -b <ブランチ名>`と入力すると、
ブランチを新規作成したうえで、そのブランチに移動することができる!

## 2-x 変更履歴を統合する git merge
マージをするときは、統合したいブランチに移動してから、以下のように`mergeコマンド`を用いてマージするブランチを指定する。

```bash
$ git merge <ブランチ名>
$ git merge <リモート名>/<ブランチ名>
```
(メモ)マージには3種類ある。
1. Fast Forward 早送りマージ
ブランチを作っても、枝わかれしていない構造を統合するとき、(ブランチ)のポインタを前に進めるだけである。
2. Auto Merge　一般的なマージ
枝分かれさせたものを統合させるとき。
3. Conflict コンフリクト
枝分かれさせたものを統合させるときであるが、統合させるものの両方の同じ箇所が修正されてしまうときにおこる問題。(どちらを優先したらよいのかわからないので、どちらを優先させるかを決める必要がある)

+α)コンフリクトが起きたら☆重要☆
➀`$ git merge `でコンフリクトが起きたことを確認
➁`$ git status`でコンフリクトが起きている場所を確認＋その場所に移動
➂コンフリクト箇所を確認(不要な部分を消し、正しいものだけを残す)
　コンフリクトが起きた場合、以下のようになる(subブランチをマージしようとした場合)
  ここでの、HEADブランチとは自分が今いるブランチのことでありHEADブランチというブランチが存在するわけではないので注意！

```c++:コンフリクトが起きた時
<<<<< HEAD
//HEADブランチの内容
=========
//subブランチの内容
>>>>> sub
```
➃コンフリクトを解消(不要な部分を消し、正しいものだけを残す)
<<<<< や ===== ,>>>>>は不要なのでまずこれらを消し、衝突した内容のうちプログラムとして残さない方も消す。

➄同様にして、他にもコンフリクトが起きている場合は解消してもう一度マージを行う

## 2-1 変更履歴を記録　git log
(24)191228
### 便利なオプション
(1) 要点だけをまとめて一行で表示

```bash
$ git log --oneline
```
 (2) 特定のファイルだけの差分を表示したいとき

```bash
$ git log -p <ファイル名>
```
(3) 最近のコミットを表示
ここではさかのぼって表示するコミット数を設定

```bash
$ git log -n <コミット数>
```
## 2-2 削除する　git rm
rm は 「remove」の略(25.191228)
(1)特定のファイルを削除

```bash
 $ git rm <ファイル名>
```
(2)特定のディレクトリを削除
このときはオプションとして「-r」を追加する必要アリ

```bash
 $ git rm -r <ディレクトリ名>
```
(3)リモート上のデータだけ削除したい場合
 (1),(2)ではリモート、ローカルの両方とも削除されてしまうが、ワークツリー上(ローカル)にはファイルを残したい場合はこのコマンドを用いれば良い

```bash
 $ git rm --cached <ファイル名>
```
## 2.3 リモートの操作　git remote
(#34,35)
 リモートリポジトリを操作するときは基本的には、remoteコマンドを使えば良い。リモートリポジトリは複数登録することが可能なことには注意！
```$ git remote ```単体だと登録されているリモートリポジトリの名前が表示される。

| コマンド| 内容 |
|:-:|:-:|
| -v  |  対応するURLを表示 |
|add <リモート名>|  リモートリポジトリを新規登録 |
|rename <旧リモート名> <新リモート名>|リモート名を変更|
|rm <リモート名>|特定のリモートを削除|

- <リモート名>はデフォルトではorigin 

## fetch と　pull の違い
```$ git pull```と、
```$ git fetch <リモート名>```+```$ git merge <リモート名>/<ブランチ名>```は同じ操作
このように見ると、pullの方が楽そうに見えるが、(ローカルで)自分がいるブランチに対して指定したリモートリポジトリのブランチがマージされてしまうので、内容が混同しないように注意！
そのようなことをいちいち確認しなければいけないという煩わしさから免れるためには、fetchしてmergeすることにしてもよいかも!




## その他のコマンド
・ファイルの移動を記録 
```$ git mv <移動元ファイル> <移動先ファイル>```

```$ mv ,$ git rm, $ git add ```の三つのコマンドをまとめて操作できる 

# 3.コマンドにエイリアス(別名)をつける
(#29)

```bash
 $ git config --global alias.<エイリアス名> <もとのコマンド名>
```
```bash:例
 $ git config --global alias.co commit
```
上の例ではcommitコマンドをcoというエイリアス名で登録している。
・configは設定をするときに持ちいるコマンド
・--global というオプションはこれをつけることにより、PC全体への変更ができるようになる。(これをつけないと、特定のディレクトリ内でしか変更が効かない)

筆者が使っているエイリアス名は以下の通り

|エイリアス名   |  元のコマンド名　    　|
|:-----------------:|:------------------:|
|co|commit|
|st|status|
|br|branch|
|di|diff|
|ch|checkout|

# +α
## .gitignoreファイル
(#30)
以下のようなファイルはGitで共有する必要は不要
・パスワードが組み込まれたファイル
・チーム開発をしている際に共有する必要のないファイル

上記のように共有する必要のないファイルは.gitignoreにまとめることにより、gitへの共有をやめることが可能である。

## 変更を取り消す方法
変更をとり消すといっても段階(どこを取り消すのか)によって、操作が異なっていくが、それをまとめると下の表のようになる。

|用途|コマンド名|
|:-:|:-:|
|ワークツリー上の取り消し|$ git checkout --   |
|ステージ上の取り消し|$ git reset HEAD|
|直前のコミットの取り消し|$ git commit --amend   |
注)「直前のコミットの取り消し」に関しては、リモートにあげる(pushする)前ならOK

上記のコマンドはそれぞれのコマンドを打った後に特定の「ファイル名」や「ディレクトリ名」、またはすべてを選択する場合は「.」を入力。