ハッカソン初挑戦！初心者のためのGitコマンドまとめ

今回、ハッカソンで初めてのアプリ開発を経験しました。その中で理解したgitコマンドについてアウトプットします。GitHubについて、勉強はしたけど実際に使ったことはないといった方が、少しでもスムーズにチーム開発に取り組めることを目標にしています。
IT未経験のため間違っている点がありましたらご指摘いただけますと幸いです。

まず、ゼロからの開発の場合、リモートリポジトリとローカルリポジトリのどちらにも何もない状態からスタートするかと思います。大まかな流れを箇条書きにしてみます。
＜リモートリポジトリ＞
・リモートリポジトリを作成する（例: GitHub上でmainブランチとdevelopブランチを作成）
＜ローカルリポジトリ＞
・ローカルリポジトリにクローンする（git clone）
・新しいブランチを作成して切り替える（git switch -c <ブランチ名>）
・作業内容をステージング（git add）し、コミットする（git commit）
・リモートリポジトリにプッシュする（git push）
＜リモートリポジトリ＞
・developブランチでマージ
＜ローカルリポジトリ＞
・git pullでローカルを最新化
＜リモートリポジトリ＞
・最終的にdevelop→mainへマージして完成


## ＜基本的な操作＞
### 1. リモートリポジトリ→ローカルリポジトリに情報を反映させる
```
git clone <リモートリポジトリのURL>
```
リモートリポジトリのURLは、SSH接続の設定をしている場合はSSHのURLを、設定をしていなければHTTPSのURLをコピペします。この際、リモートリポジトリの名前が`origin`に設定されるので、以降のコマンドではURLの部分を`origin`に置き換えることができます。
これでリモートリポジトリの情報が全てローカルリポジトリに反映されます。開発スタートです。
注意したいのが、`git clone`をすると、ローカルリポジトリではデフォルトでmainブランチにチェックアウトされます。このブランチで作業をしてしまうと、完成形を作りたいmainブランチがグチャグチャになってしまうので、ブランチを切り替える必要があります。

### 2. 新しくブランチを作成、切り替える
```
git switch -c <ブランチ名>
```
ローカルリポジトリに新しくブランチを作成し、そのブランチに切り替えます。実装予定の機能ごとに開発を進めていくことが多いと思いますので、ブランチの名前は＜feature/機能名＞といった命名にすると把握しやすいと思います。また、一つのブランチで複数のメンバーが作業をするのは避けたほうが良いです。コンフリクトの原因になります。
この時点では、作成したブランチはローカルリポジトリにのみ存在し、リモートリポジトリにはありません。

### 3. 実装した内容をステージングエリアにあげる
```
git add .
```
作業した内容を全て反映させたい場合のコマンドです。
```
git add <ファイル名>
```
作業した内容のうち、一部のファイルのみ反映させたい場合はこちらのコマンドになります。
ステージングエリアって？となりますが、`commit`をするための準備と理解すると良いと思います。このコマンドがないと、作業内容の一部だけを`commit`したいという時に困りますよね。

### 4. 作業内容をローカルリポジトリに確定させる
```
git commit -m "コメント"
```
3でステージングエリアにあげたものを確定させます。これで、ローカルリポジトリで滞在しているブランチに点として記録されます。以降になにか問題があった時に、このcommitした地点に戻ってくることができたり、いつ何をしたのかを振り返ることができるようになります。
この時点でも、まだローカルリポジトリでの話であり、リモートリポジトリには何も変化はありません。
`git commit`は一つの作業が完了した際に行い、その作業内容をコメントに記載します。

### 5. リモートリポジトリに作業内容を反映させる
```
git push origin <ブランチ名>
```
この段階で、ようやくリモートリポジトリに作業内容が反映されます。

### 6. developブランチに`merge`する
GitHubアカウントで確認すると、先ほど`push`したブランチが反映されていると思います。これをdevelopブランチに`merge`します。

### 7. リモートのdevelopブランチの内容をローカルに反映させる
```
git pull origin develop
```
これでローカルリポジトリのdevelopブランチが最新の状態に保たれます。
最初は`git clone`でしたが、二回目以降は`git pull`で一部の情報を反映させます。（ここでエラーが出る場合は、コンフリクトが発生している可能性が考えられます。）
以降、2～７を繰り返していくことで、だんだんdevelopブランチが完成に近づいていきます。最終的にリモートリポジトリでdevelop→mainに`merge`することで開発完了です。

## ＜備考＞
### ＜備考１＞ローカルでブランチを切り替えるには？
```
git switch <ブランチ名>
```

### ＜備考２＞ブランチを確認するには？
```
git branch
```
ローカルリポジトリにあるブランチ一覧を表示します。
```
git branch -r
```
リモートリポジトリにあるブランチ一覧を表示します。

### ＜備考３＞チェックインしているブランチの履歴を確認するには？
```
git log
```
チェックインしているブランチの過去の`commit`の履歴を参照できます。「なぜか`git push`できない!?」なんて時に確認します。

## ＜困った時の対応＞
### ＜困った時１＞間違って`git add`してしまった！
```
git restore --staged .
```
ステージングエリアにあげた変更を取り消します。それまでの作業内容は消されないので、`git add`という行為のみを取り消すコマンドになります。


### ＜困った時2＞間違って`git commit`してしまった！
```
git reset --soft HEAD~
```
最新の`commit`を取り消し、`git add`をした段階に戻ります。

```
git reset HEAD~
```
最新の`commit`を取り消し、`git add`する前の段階に戻ります。それまでの作業内容は消えません。

```
git reset --hard HEAD~
```
最新の`commit`を取り消し、**それまでの作業内容も消去**します。一つ前の`commit`の段階に戻ります。

### ＜困った時3＞間違ってmain/developブランチで作業してしまい、`git pull`できない！
```
git add .
git commit -m "コメント"
git pull origin <ブランチ名>
```
とりあえずローカルリポジトリでの変更内容をコミットしてしまい、その上でリモートリポジトリのmain/developブランチを`merge`します。

```
git stash
git pull origin <ブランチ名>
```
ローカルリポジトリで加えてしまった変更内容をなかったことにして、リモートリポジトリのmain/developブランチを`merge`します。