チーム開発に向けたgitコマンド

<h1>環境</h1>
<ul>
<li>WSL2</li>
</ul>

<h1>目的</h1>
<p>チーム開発のためにgitコマンドを習得する。</p>

<h1>注意</h1>
<ul>
<li>今回はメインブランチが「main」ではなく、「master」になっています。</li>
<li>https通信ではなく、ssh通信を使っています。</li>
</ul>

<h1>事前準備</h1>
<h3>Githubにssh接続できるようにしておく</h3>
<p>作業ディレクトリはどこでもいいです。</p>
<p>下記のコマンドで公開鍵と秘密鍵のペアを生成する。生成するディレクトリなどが聞かれるが、何も入力せずに全部Enterを押す。</p>

```shell
> ssh-keygen -t rsa
```

<p>下記の場所に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されているはず。</p>

```shell
>  ls -l ~/.ssh
...id_rsa
...id_rsa.pub
```
<p>下記のコマンドで公開鍵(id_rsa.pub)の中身を確認する。</p>

```shell
>  cat ~/.ssh/id_rsa.pub
...
```
<p>次にGithubの画面に行く。</p>
<p>Settings > SSH and GPG keys > New SSH key　と移動して、先ほどの公開鍵(id_rsa.pub)の中身を全てコピペする。 </p>
<p>下記のコマンドでSSH接続が成功しているかどうかを確認する。 </p>

```shell
> ssh -T git@github.com
Hi XXX! You've successfully authenticated, but GitHub does not provide shell access.
```

<h1>チーム開発を想定したgitコマンド</h1>
<h3>プロジェクトの一部を変更してプルリクエスト(マージリクエスト)を出す</h3>
<p>チームのプロジェクトをコピーする。 </p>

```shell
> git clone git@github.com:{Team Name}/git_practice.git
```
<p>チームのプロジェクトのルートディレクトリに移動する。 </p>

```shell
> cd git_practice
```

<p>自分用のブランチを作る。</p>

```shell
> git branch
* master
> git switch -c new-branch
Switched to a new branch 'new-branch'
> git branch
  master    
* new-branch
```

<p>コミット履歴を見る。</p>
<p>new-branchブランチ, masterブランチ、リモートのmasterブランチ(orign/master)、これら全て同じコミットに位置していることが分かる。</p>
<p>HEADは自分自身の現在位置を示す。自分は現在、new-branchブランチにいることが分かる。</p>

```shell
> git log
commit 3bce3d71c2ad9daa0c1c0187c43ca6ca7330bf2f (HEAD -> new-branch, origin/master, origin/HEAD, master)
...
```

<p>ファイルを適当に編集して、変更箇所を下記で確認する。</p>

```shell
> git status
...
> git diff
...
```

<p>ステージングして、変更箇所を確認する。</p>

```shell
> git add .
> git diff --staged
...
```

<p>コミットする。</p>
<p>new-branchブランチにコミットが新たに追加されていることが分かる。</p>


```shell
> git commit -m "Edit something."
> git log
commit 015032f0e1b2a3ab882c11b9d24e658b12010d2c (HEAD -> new-branch)
Author: Your Name <XXXXXX@gmail.com>
Date:   Mon Feb 19 19:06:44 2024 +0900

    Edit something.

commit 3bce3d71c2ad9daa0c1c0187c43ca6ca7330bf2f (origin/master, origin/HEAD, master)
Author: Your Name <XXXXXX@gmail.com>
Date:   Mon Feb 19 18:40:26 2024 +0900

    second commit

commit b8a90ee2ee8e142c659cf6e8cb83ec7b0eb5ca65
Author: Your Name <XXXXXX@gmail.com>
Date:   Mon Feb 19 18:12:25 2024 +0900

    first commit
...
```

<p>new-branchブランチをリモートにpushする。</p>

```shell
> git push origin new-branch
...
```

<p>プルリクエスト(マージリクエスト)を出して、new-branchブランチをmasterブランチにマージしていいかどうかを、管理者に確認してもらう。</p>

![Untitled (44)_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/dc9f6092-8ae5-6a16-92ff-df3c5b8e466c.png)

![Untitled (45)_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/f7855feb-d74f-a462-2857-15deeca7fe70.png)


<h3>管理者がプルリクエスト(マージリクエスト)をマージする。</h3>

<p>管理者は、プルリクエスト(マージリクエスト)をマージしていいかどうかを確認して、問題なければマージする。</p>

![Untitled (46)_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/d3c3cb5a-201d-fed7-3dc8-5572424a0135.png)


<h1>その他のコマンド</h1>
<h3>(a)</h3>
<p>ブランチを移動する。</p>

```shell
> git switch my-branch
```
<h3>(b)</h3>
<p>特定のコミットに戻る。そのコミット以降のコミットは完全に削除されるので注意してください。</p>

```shell
> git reset --hard XXXXXXXXXXXX
```
<h3>(c)</h3>
<p>特定のコミットに戻る(detach)。ここに新しいコミットをする場合は、新たにブランチを切らないと、孤立してしまうので注意してください。</p>

```shell
> git checkout XXXXXXXXXXXX
```
<h3>(d)</h3>
<p>ブランチをマージする。</p>

```shell
> git merge my-branch
```
<h3>(e)</h3>
<p>ブランチを削除する。一つ目はマージ済みのものしか削除できないが、二つ目はマージしていないブランチでも削除できる。</p>

```shell
> git branch -d my-branch
> git branch -D my-branch
```
<h3>(f)</h3>
<p>ブランチをリネームする。</p>

```shell
> git branch -m current-branch-name new-branch-name
```
<h3>(g)</h3>
<p>ローカルとリモートの履歴を確認する。</p>

```shell
> git log --oneline --graph --decorate --all
```
<h3>(h)</h3>
<p>(1) リモートの変更点をローカルの変更点の上に「積み重ねる」のではなく、両方の変更点から新しい「マージコミット」を作成して統合する。</p>
<p>(2) ローカルの変更がリモートの変更の直後に適用されたかのような直線的なコミット履歴が作成される。これは、履歴をよりシンプルで読みやすく保つのに役立つが、ローカルの変更履歴を改変するため、共有ブランチでの使用は注意が必要。</p>

```shell
(1)
> git pull --rebase origin main
(2)
> git pull origin main
```

<h3>(i)</h3>
<p>過去の履歴を変更する。</p>

```shell
> git rebase -i XXXXXX
> git add .
> git commit --amend
> git rebase --continue
```

<h1>参考</h1>
・GPT4

・初心者向けGithubへのPullRequest方法

https://qiita.com/samurai_runner/items/7442521bce2d6ac9330b