gitのまとめ(前半)

これからgitのコマンドや使い方についてまとめていきます。
また、トラブルをどのように解決していったのかをまとめていきたいと思います。
私は初めてgitに触れる中で様々なことを学びました。
この記事を書こうと思った理由は大きく分けて2つあります。
1つ目は、gitのコマンドを実行した際にイメージとは大きくかけ離れた動きをしたからです。
2つ目は、gitのトラブルを解決するにつれて対処方法が分かってきたので今のうちにきちんと振り返ってまとめておきたいと思ったからです。
今回はコマンドのイメージと実際の動きを一致させて、gitを使って困った時に見返せるようにまとめていきたいと思います。
内容が多いので前後編分けて書いていきたいと思います。
今回は前半でgitコマンドの使い方についてみていきましょう。

<h2>1. wrapとVSCodeでの開発環境の準備</h2>
まず、warpとVSCodeをインストールします。
そして、warpを開き以下のコマンドを実行します。
usernameには自分の名前を入力します。
emailには自分のメールアドレスを入力します。

```git:username設定
git config --global user.name "username"
```

```git:email設定
git config --global user.email "email"
```

次にVSCodeをエディタとして使うために以下のコマンドを実行します。

```git:エディタへの設定
git config --global core.editor "code --wait"
```

<h2>2.gitのローカルレポジトリの作成するには</h2>
まず、以下のコマンドを実行してディレクトリを作成します。
[ディレクトリ名]には好きなディレクトリ名を入れます。

```git:ディレクトリの作成
mkdir [ディレクトリ名]
```
cdコマンドで作ったディレクトリに移動した後に
次は以下のコマンドを実行しローカルリポジトリを作成します。

```git:ローカルリポジトリの作成
git init
```
これでgitが使えるようになりました！

<h2>3.リモートリポジトリのcloneを作成するには</h2>
まずリモートリポジトリとは、GitHabのことです。git　clone コマンドを使うことで、GitHabからレポジトリからコードを持ってくることができます。リモートレポジトリと同じ内容を手元の作業スペース（ワークツリー）に反映することができます。


```git:ローカルリポジトリの作成
git clone <リポジトリ名[ディレクトリ名]>
```

<h2>4.変更をステージに追加するには</h2>
まずgitはワークツリー→ステージ→レポジトリの3段階構造になっています。
ワークツリーは手元の作業場所のことです。ステージは変更を記録する前の段階になります。レポジトリは記録をまとめるところになります。ワークツリーでの変更でステージに上がっていない変更が赤で表示され、ステージに上がった変更は緑で表示されています。ファイルの変更後はcommand+Sで保存することを忘れないようにして下さい。ワークツリーの変更をステージに追加するコマンドが以下のコマンドです。このコマンドを実行することで記録をする前の段階まで持っていくことができます。
私はよく全ての変更をステージに追加してたので .を使っていました。

```git:特定の変更をステージに追加する
git add <ファイル・ディレクトリ名>
```
```git:全ての変更をステージに追加する
git add .
```

<h2>5.レポジトリに変更を記録するには</h2>
さっきの続きになりますが、git add　した後は変更を記録するために　git commitします。
このコマンドはファイル名やディレクトリ名は指定しないのでそのまま実行することが多いです。
commitするコマンドを実行したあとにエディターが立ち上がりコミットメッセージを入力し保存して閉じるとcommitができます。コミットメッセージの記入後はcommand+Sで保存することを忘れないようにして下さい。また、オプションでよく使っていたのは -mオプションです。-mオプションを使うとエディターを使わなくてもcommitすることができます。以下実行するコマンドです。messageには簡潔でわかりやすいメッセージを入力します。

```git:特定の変更をリポジトリに記録する（VSCodeも使う）
git commit
```

```git:特定の変更をリポジトリに記録する（warpだけ使う）
git commit　-m "メッセージ"
```

<h2>6.現在の変更内容を確認するには</h2>
先程、赤とか緑とか言ってたのがこのコマンドを使うと表示されます。これは、手元のワークツリーにある変更を赤でステージにある変更を緑で、リポジトリにある記録されている変更はnothing to commitと表示されます。色がついている時は、きちんと変更が記録されていないものがあるということです。現在の変更内容を確認するコマンドは以下のコマンドです。

```git:変更状況を確認する
git status
```

<h2>7.変更した箇所を確認するには</h2>
変更した箇所だけ確認したい時は、以下のコマンドを使います。
git statusを使うよりピンポイントで変更差分の確認ができます。

```git:ワークツリとステージの変更分を確認 
git diff　<ファイル名>
```
```git:ステージとリポジトリの変更分を確認
git diff --staged
````

<h2>8.変更履歴を確認するには</h2>
以下のコマンドで変更履歴を確認することができます。
コミットメッセージや時間など詳細な情報も確認することができます。
また、便利なオプションもたくさんあります。--onelineを使うと一行で各履歴の概要を表示してくれます。
-n <行数>を指定すると最新の情報から<行数>分だけ表示してくれます。--oneline -n <行数>のように連続してオプションをつけることが可能です。

```git:変更履歴の詳細まで確認
git log
```
```git:変更履歴を3行で確認
git log --oneline -n 3
```

<h2>9.ディレクトリやファイルを削除するには</h2>
ディレクトリやファイルを削除するには以下のコマンドを使います。
ディレクトリを削除するときは -rオプションを忘れずにつけましょう。
Linux触ったことある人は、Linuxのコマンドにgit がついただけなので関連付けると覚えやすいです。

```git:ファイルの削除
git rm <ファイル名>
```
```git:ファイルの削除
git rm -r <ディレクトリ名>
```

<h2>10.ファイル名を変更するには</h2>
ファイル名を変更するには以下のコマンドを使います。
mvコマンドを使うと消して新しいファイルを作成する手順を一回で終わらせることができるので楽です。

```git:ファイルの削除
git rm <既存ファイル名>　<新ファイル名>
```

<h2>11.リモートレポジトリ(GitHab)へ送信するには</h2>
今まではワークツリーの操作、ステージでの操作を見てきましたが、ローカルレポジトリの変更をリモートリポジトリ（GitHab）に保存するにはpushコマンドを実行する必要があります。git push origin mainと打つと、originにmainのローカルレポジトリの内容を送りますという意味になります。以下コマンドです。

```git:GitHabへ送信
git push <リモート名(originなど)>　<ブランチ名(mainなど)>
```

<h2>12.ファイルの変更を取り消すには</h2>
間違えて編集しちゃった、元のファイルの状態に戻したいなという時ありませんか。そんな時はファイルの変更を取り消す以下のコマンドを使います。これはワークツリーで作業した変更を削除するコマンドです。.を指定するとワークツリーの変更を全て取り消すことができます。

```git:特定の手元で行った作業を取り消す
git　checkout -- <ファイル・ディレクトリ名>
```
```git:全ての手元で行った作業を取り消す
git　checkout -- .
```

<h2>13.ステージした変更を取り消すには</h2>
git add を使って間違って変更をステージに上げっちゃった！そんな時は以下のコマンドを使います。
ステージに上げたファイルの変更を取り消しワークツリー(手元)に戻すことができます。

```git:ステージに上げた特定の変更をワークツリーに戻す
git　reset HEAD <ファイル・ディレクトリ名>
```
```git:ステージに上げた全ての変更をワークツリーに戻す
git　reset HEAD .
```

<h2>14. 直前でコミットをやり直すには</h2>
間違えてcommitしてしまった、commit戻せないかな。そんな時は以下のコマンドを使います。
直前に行ったcommitをやり直すことができます。ただ、注意点としてpushしたcommitはやり直してはいけないということを覚えておいて下さい。

```git:直前のcommitを修正
git commit --amend
```
<h2>15.複数のコミットをやり直すには</h2>
複数のコミットをやり直す方法もあります。
git rebase -i HEAD~3コマンドを使うとエディターに直近の３つのコミットが表示されるのでやり直したいコミットをeditに変えます。また、エディターで削除したり、順番を変えたりすることもできます。

```git:編集箇所をeditに変更
git rebase -i HEAD~3
```
編集後、amendコマンドを実行し、continueコマンドでリベースを完了させます。
```git:amendを実行
git commit --amend
```
```git:リベース完了
git rebase --continue
```
<h2>16.コミットをまとめるには</h2>
コミットをまとめるにはsquashを使います。
git rebase -i HEAD~3を実行しエディターで1行目以外のpick→squashに変更します。
以下コマンドです。

```git:2、3行目をsquashに変更
git rebase -i HEAD~3
```

<h2>17.コミットを分割するには</h2>
コミットを分割するにはこの順番で実行します。リセットしてコミットをやり直して分割します。

```git:コミットを分割するには
git reset HEAD^
git add fail1
git commit -m "fail1修正"
git add fail2
git commit -m "fail2修正"
```


<h2>18.リモートリポジトリから情報を取得するには</h2>
リモートリポジトリから情報を取得する方法は２種類あります。
1つ目はリモートリポジトリからローカルリポジトリに情報を持ってきて、ローカルリポジトリからワークツリーに持ってくる方法です。git fetchとgit mergeの二つのコマンドを実行します。

```git:リモートからローカルに持ってくる
git fetch　<リモート名(origin main)>

```
```git:ローカルから手元に持ってくる
git merge　<リモート名(origin main)>
```

2つ目はリモートリポジトリからワークツリーに持ってくる方法です。　流れはリモートリポジトリ→ローカルリポジトリ→ワークツリーと同じ流れになりますが、git pullの一回だけを実行するだけで手元に持ってくることができます。

```git:リモートから手元に持ってくる
git pull　<リモート名(origin main)>
```

　2つ目の方法は1つ目の操作より特殊な処理になるので基本的には1つ目の方法がおすすめです。
 また、リモート名はgit remote -vコマンドで確認することができます。
 
:::note warn
発展
git pull --rebaseというコマンドがあります。これはfetch(情報を取ってくるコマンド)＋rebase(履歴をきれいに整えて統合するコマンドがあります)
作業の最後に git pull --rebaseコマンドを使って履歴をきれいに整えてGitHabと同じ状態するのでよく使うコマンドです。

:::


<h2>19.リモートの詳細情報を表示するには</h2>
リモートの詳細情報を表示するには以下のコマンドを使います。
表示される情報はfetchやPushのURL、リモートブランチ、git pullの情報、　git pushの情報などとリモートリポジトリとローカルリポジトリのやり取りを確認することができます。

```git:リモートの詳細情報を表示
git remote show <リモート名(origin)>
```
<h2>20.リモートを変更・削除するには</h2>
リモートもファイルのように変更削除ができます。
リモートの変更削除をするには以下のコマンドを使います。

```git:リモート名の変更
git remote rename <旧リモート名> <新リモート名>
```
```git:リモートの削除
git remote rm <リモート名>
```

<h2>21.ブランチを新規追加する</h2>
ブランチとは自分専用の作業スペースのことです。ブランチを作ることで複数人で同時に開発作業が進められてとても便利です。ブランチを新規作成するには以下のコマンドを使います。

```git:ブランチを作成
git branch <ブランチ名>
```

<h2>22.ブランチの一覧を表示する</h2>
ブランチの一覧を表示するには以下のコマンドを使います。
自分が何のブランチを作ったか忘れたり、他の人のブランチを確認したりするときに使えます。

```git:ブランチの一覧を表示
git branch
```
<h2>23.ブランチを切り替える</h2>
ブランチを切り替えるには以下のコマンドを使います。
また、-bオプションをつけることでブランチを新規作成＋切り替えを行うことができます。

```git:ブランチの切り替え
git checkout <既存ブランチ>
```

```git:ブランチを作成して切り替え
git checkout -b <新ブランチ>
```

<h2>24.変更をマージ（merge）するには</h2>
2つのブランチの情報を統合するときにマージを使います。一般的には、mainブランチに他のブランチをマージして開発していくことが多いです。例えば、headerブランチで作業した内容をmainブランチに取り込むにはmainブランチに切り替えてgit merge headerを実行します。するとheaderブランチの内容がmainブランチに統合されます。

```git:ブランチの変更を統合
git merge <統合したいブランチ名>
```

<h2>25.変更をリベースするには</h2>
リベースとマージが異なる点は、リベースは履歴をきれいに整えて統合するのに対し、マージは履歴はそのままの状態で統合します。状況によって使い分けします。リベースするには以下のコマンドを使います。

```git:ブランチの変更を統合
git rebase <統合したいブランチ名>
```

<h2>26.ブランチを削除・変更するには</h2>
ブランチ名を変更するにはまず変更したいブランチに移動します。そこで以下コマンドを実行します。
するとブランチ名が変わります。

```git:ブランチ名を変更
git branch -m <ブランチ名>
```

ブランチ名を削除するには以下のコマンドを使います。
-dがついている方はmergeしてないブランチを指定した場合削除できません。
-Dがついている方はmergeしていなくても強制的に削除できます。

```git:ブランチを削除（merge済み）
git branch -d <ブランチ名>
```
```git:ブランチの強制削除
git branch -D <ブランチ名>
```

<h2>27.タグの一覧を表示する</h2>
タグを一覧で表示することができます。

```git:タグの一覧表示
git tag
```

<h2>28.タグを作成する</h2>
タグを作成するには以下のコマンドを使います。
messageには好きなメッセージを入れます。

```git:タグを作成する
git tag -a [タグ名]　-m "message"
```

<h2>29.タグをリモートリポジトリに送信する</h2>
タグをリモートリポジトリに送信するには、以下のコマンドを使います。

```git:リモートにタグ送信
git push [リモート名][タグ名]
```
<h2>30.作業を一時避難してブランチを切り替えるには</h2>

ブランチを切り替えたいけど作業は残しておきたいそんな時は以下のコマンドを使います。
```git:作業中断
git stash
```
<h2>31.stashした作業を確認するには</h2>
一時中断した作業の一覧を確認するには以下のコマンドを使います。

```git:中断した作業を確認
git stash list
```
<h2>32.中断した作業を復元・削除するには</h2>
中断した作業を復元するには以下のコマンドを使います。

```git:中断した最新の作業を復元
git stash apply
```

また、中断した作業を削除するには以下のコマンドを使います。
```git:中断した最新の作業を削除
git stash drop
```

```git:中断した全ての作業を削除
git stash clear
```

<h2>33.リモートリポジトリとローカルリポジトリを繋ぐ方法</h2>
まずレポジトリを作成します。名前だけつけて他の設定項目はデフォルトのままで作成します。次にtokenを作成します。名前をつけて、Repository accessは、さっき作ったレポジトリを選択します。Repository permissionsは Contents と Pull requsests を Read and writeに設定します。その後、コマンドを打ちます。

```git:レポジトリの画面のgit remote addコマンドをコピーして実行する
git remote add origin https://github.com/<username>/github_test.git
```

```git:リモートリポジトリの情報を確認する
git remote -v
```

```git:リモートリポジトリにmainブランチをpushする
git push origin main
```
pushコマンド実行後usernameとtokenのパスワードを聞かれるので入力します。
 これでローカルリポジトリとリモートリポジトリが接続され、情報がGitHabのリポジトリから見ることができます。
以上で前半部分のコマンドの基本的な使い方の解説を終了します。