Gitまとめ

## Gitまとめ

### チェックアウト
今いるコミットを移動する。
ブランチを移動するときにも使う。

```bash
git checkout コミットID
```
今時分がいるブランチは「*」をつけて表す。

### フォーク・クローン
#### フォーク
他の人が公開しているリモートリポジトリを、自分のアカウントにコピーすること。
#### クローン
リモートリポジトリを自分のPC（ローカル）にダウンロードすること。

```bash
git clone リモートリポジトリのURL
```

※ただし実際の開発現場では、フォークせずに１つのリモートリポジトリを複数人が直接クローンして作業することが多い。不用意にリポジトリが分散するのを防ぐため。

### マージ
ブランチを取り込むこと。
マージはコミットで表される。

```bash
# ブランチＡにブランチＢを取り込む
git checkout ブランチA # マージコミットを作りたいブランチに移動
git merge ブランチB
```

### push
ローカルリポジトリで起きた変更をリモートリポジトリに反映する。

```bash
git push リモートリポジトリ名 ブランチ名
```

### pull
リモートリポジトリで起きた変更を、ローカルリポジトリに反映する

```bash
git checkout プルしてきたいブランチ
git pull リモートリポジトリ名 ブランチ名
```

### revert
過去のコミットを打ち消す。
コミット自体を削除するわけではなく、あくまで反対の内容で新規コミットを作ることで過去の変更を打ち消す。
あいだに別のコミットが存在しても、rebertは可能。

```bash
git revert コミットID
```

### rebase
履歴を一直線にする。
#### mergeとrebaseの違い
- merge：過去のコミットは改変されずに、マージするためだけの新しいコミットが作成される
- rebase：もともとのコミットが改変されてリベース先のブランチに乗っかり、履歴が一直線になる。

※ rebaseは履歴を改変する。コミットを新しく作り直すため、rebase前後でコミットIDがかわってしまう。
リモートリポジトリ上に存在しているブランチをrebaseしてしまうと、普通の方法ではpushできなくなる。

```bash
git checkout リベースしたいブランチ
git rebase リベース先のブランチ
```

### リモート追跡ブランチ
リモートブランチとローカルブランチの間にある。
ローカルリポジトリ内にあり、リモートブランチをローカルにコピーしただけのもの。
読み取り専用。

### fetch
リモートリポジトリから最新の状態を取得し、ローカルリポジトリ内のリモート追跡ブランチを更新する。
リモートリポジトリの状況は知りたいけど、まだローカルブランチに反映させたく内場合などに使用。
fetchしただけだと、リモート追跡ブランチ（origin/◯◯）にコミットがダウンロードされただけで、ローカルブランチは更新されていない。
ローカルブランチに反映させたくなったら、リモート追跡ブランチをmergeする。

```bash
git checkout main
git featch
git merge origin/main
```

### prune
リモートリポジトリで既に削除されたブランチを、ローカルリポジトリでも削除する。

```bash
git branch -a # リモート追跡ブランチを含めたすべてのブランチを確認する
git fetch --prune # リモートリポジトリで消えた追跡ブランチを消去する
git branch -d ブランチ名
```

### 最新のコミットメッセージを修正する
コミットメッセージをタイポなどしてしまった場合は、amendを使う。
push前なら修正できる。

```bash
git commit --amend # viが立ち上がり、直近のコミットメッセージを修正できる。
```

### 別ブランチから特定のコミットのみ取り込む（チェリーピック）
Ａブランチにコミットするはずが、間違えてＢブランチにコミットしてしまった場合などに使用。
任意のコミットを、今いるブランチ上にコピーしてこれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/9d6bbfb4-175e-1497-1d77-a4391b7abf9f.png)



```bash
git cherry-pick コミットID # 今いるブランチにコミットをコピー
```

※ あくまで特定のコミットを今いるブランチにコピーしてくるだけ。元のコミットは残ったまま。

#### 元のコミットを削除するには
間違えて作成した元のコミットを打ち消したい場合はrevertを使う。

### コミットに目印をつける（タグ）
タグを使うと、履歴上の重要なポイントに目印をつけることができる。
 - アプリ開発で、リリースしたときにバージョン番号のタグを付ける
 - 受託開発で、納品したときに日付のタグを付ける
 - Web開発で、リニューアルオープンしたときにタグを付ける

```bash
# 新規タグを作る
git tag タグ名

# タグをリモートリポジトリに共有する
git push origin タグ名

# ローカルリポジトリのタグを削除する
git tag -d タグ名

# リモートリポジトリのタグを削除する
git push origin --delete タグ名
```

### 間違えてHEADに直接コミットしてしまったら
#### detached HEAD状態
どのブランチにも所属しない無所属状態のコミット。
過去のコミットにチェックアウトし、そのまま新しくコミットを作成した場合などに起こる。
そのままコミットを積み重ねることもできるが、次にチェックアウトしたときに目印がないため戻ってこれなくなる。

通常時はHEADはブランチを指す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/07b0baa8-4848-f779-48c0-5c0793da8e85.png)


detachd HEAD状態は、HEADが直接コミットを指してしまっている状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/060eca1d-848f-cf8f-f922-39d8009da827.png)


HEADが分離した状態でコミットをしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/69820df9-064b-79cd-9bc3-270c10bee1b7.png)



一見ちゃんとコミットできているように見えるが、masterブランチにチェックアウトしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/b57993b3-9adc-5d6a-f9e9-5d14e4ea7dff.png)
コミットDがなくなってしまう。

#### 対処法
HEADに直接コミットし、detaced HEAD状態になっていることに気付いたら、慌てずそこから新規ブランチを作る。

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