git githubの復習

## 何者

ITベンチャーでインターンをしている大学生です。

業務中にgitの操作でよく詰まるのでおさらいしてみます

## この記事で得られる情報

- 以下についてふわっとわかる
    - git branch
    - git switch
    - git merge

## 始めに用意

1. githubでリポジトリを作成
    1. 僕は名前をgit_testにしました
    2. [https://github.com/kajiyai/git_test](https://github.com/kajiyai/git_test)
2. ローカルでgit clone
3. 何かのファイルを作ってadd, commit
    1. 僕は1.txtファイルに”はじめてかいてみた”と書きました
4. git push
    1. user nameとpasswordが求められる
    2. passwordはプロフィールのsettings>developer toolからpersonal access keyを作成し、入力すると通る

!![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/28265a05-c64a-c37c-bd8c-741d47a81fba.png)


## 現状

リモート、ローカル共に以下

ブランチ

- master

コミット

- 1.txt

ローカルでgit logしてみる
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/b59ce94b-ba40-1801-d53b-05589bb5e0de.png)
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/c1d89bd1-60ce-6841-24d2-45ea53a7559a.png)

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/00c988f1-68f1-6894-f23a-f3647c2ee8cd.png)


### git logの読み方

`コミット <ハッシュ値>(HEAD - > ローカルブランチ, リモートブランチ )`

`コミット作成者: メールアドレス`

`コミット作成時点`

HEAD - > は現在自分がいるコミットを指すポインタです

詳しくは以下の記事で紹介されています。

[https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa](https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa)

## ケース1: えらいおじさんがリモートでブランチをはやす

### はじめに

リモートでgreatman1ブランチをmasterブランチからはやすえらいおじさんがいます。

えらいおじさんに、「このブランチからさらにブランチを切って作業しろ！ブランチ名は分かりやすいように！」と言われました。

作業内容は、”2.txt”ファイルを作成し、「にかいめかいてみた」と書くこと、とメールで言われました。

大まかな流れは、以下のようになります。

1. えらいおじさん < masterブランチからgreatman1ブランチをはやす
2. 僕 < greatman1ブランチをローカルに持ってくる
3. 僕 < greatman1ブランチからtext2ブランチを新しく作成する
4. 僕 < 「2回目かいてみた」という内容の“2.txt”ファイルを作成する
5. 僕 < text2ブランチをpushする
6. 僕 < プルリクエストを立てる
7. えらいおじさん < チェックして文句を言う
8. 僕 < 修正する
9. えらいおじさん < マージする

### ステップ1:えらいおじさんがmasterブランチからgreatman1ブランチをはやす

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/49b30f69-16a2-483f-bfeb-01d8d8a4b18f/Untitled.png)

この時点でローカルでgit log してみた

![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8fc7a4c6-b8fe-4484-b0e4-a41d0e11ff68/Untitled.png)

### ステップ2:ローカルにgreatman1ブランチを持ってくる

ここで僕はローカルでgreatman1(リモートと同じ名前の)を切り、そのブランチでリモートの内容をpullする、という事をやってしまいました。gitは、リモートとローカルで完全に履歴が等しくないとpushするときにエラーを出します。履歴が等しいかをどのように判別するかというと、コミットのハッシュ値で判断します(おそらく)。ですので、リモートのブランチをそのままローカルに持ってきたいところです。そこで次のコマンドを打ちます

```powershell
# ローカルにリモートの状態を反映させます
$ git fetch 
```

![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/d4ba933a-4dc5-795d-2038-db8fc4c0353b.png)


リモートに新しいブランチが出来たことが反映されています
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/3fffa34e-8bee-ba0d-73d6-3d80728e20d4.png)

さて、いよいよリモートのgreatman1ブランチをローカルに作ります

参考([https://qiita.com/bitarx/items/ad47c9b91ae9c8272b3f](https://qiita.com/bitarx/items/ad47c9b91ae9c8272b3f))

(* checkoutコマンドはswitchコマンドとrestoreコマンドに機能分けされたので、なるべくswitchコマンドを使用するようにしています。)

```powershell
# リモート
git switch -c greatman1
```

### ステップ3:greatman1ブランチからtext2ブランチを新しく作成する

どうやらgitでは、ブランチを作成するタイミングでどこのブランチにいるか、という事が重要らしいのです。ですので、git branch コマンドで今どこにいるのか確認してからブランチを作成します。

![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/80538bd9-bd76-ebbd-49c8-e14836391e0b.png)

```powershell

#　今いるブランチを確認
git branch 
# text2ブランチを新たに作成
git switch -c text2

```

### ステップ4:テキストファイルの作成

```powershell
# エディタ(vscodeなど)で2.txtファイルを作成し、保存する

# 一応、今いるブランチを確認
git branch
# text2ブランチにいることを確認し、add,commit
git add 2.txt
git commit -m "にかいめかいてみまし
```

### ステップ5:テキストファイルのpush

ステップ4で2.txtファイルを作成し、コミットを作成しました。このコミットをリモートにpushしていきたいと思います。今作業中のブランチはtext2です。このブランチはリモートには存在しませんが、作成したいリモートのブランチ名を指定することでpushするときに作成されます。現在作業中のブランチ名を流用するのが一般的かと思います。

```powershell
# git push origin <リモートブランチ名>

git push origin text2
```

![Untitled (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/2a7c568e-7d7f-122d-b238-cbf08bd000ef.png)


githubのページに行くと、上の画像のようにpushされたぞ、という表示が出ています。

![Untitled (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/a107eb19-89e1-7064-ea3c-93f5483e25f5.png)


　

これまでリモートになかったtext2ブランチも作られています。

### ステップ6:プルリクエストを立てる

プルリクエストは、pullをrequestすることです。自分が書いたコードの正当性をここで主張します。

下の画像(再掲)の緑のボタン(compare &pull request)を押して、修正箇所を書いたりします

![Untitled (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/ad023063-1d85-5ade-8e54-7ce4ca96da6c.png)

下のような画面に映り、タイトルやコメントを残します。

ここでプルリクエストをマージしたいブランチはどこか指定できるので、ここはgreatman1にしておきましょう。プルリクエストとコミットは別の話なので注意しましょう。

![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/7a0f8cb7-3098-d053-0c59-2f5ad29f7718.png)


### ステップ7:えらいおじさんに文句を言われる

えらいおじさんがプルリクエストをみて話しかけてきました。

えらいおじさん < 私は「にかいめかいてみた」と記述して下さいと指示したはずですが、メール確認しました？

僕 < 「2回目かいてみた」と書きました。一生懸命打ちましたが、ダメでしょうか？

えらいおじさん <ふむ、 漢字で書いてあるじゃないか、「2回目」を「にかいめ」に修正しなさい。

僕 < はい(白目)

アカウント一つでえらいおじさん役が出来なかったです。

重大な注**私はいかなるご指摘、コメントも文句だとは思っていません。これは例え話です

### ステップ8:修正する

えらいおじさんに言われたとおりに修正します。

```powershell
# ブランチの確認
git branch

# vscodeで2.txtファイルの修正
git add 2.txt
git commit -m "えらいおじさんのいうとおりにしました"

git push origin text2
```

![Untitled (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/38aa6520-7590-d63f-fa42-49a6168766f9.png)


### ステップ9:えらいおじさんがマージする

えらいおじさんは僕の修正を見て満足そうにうなずき、マージしてくれました。

---

## おまけ

### gitのoriginってなんだっけ？

gitがリモートリポジトリにデフォルトでつける名前の事

参考: [https://reasonable-code.com/git-origin/](https://reasonable-code.com/git-origin/)

### gitでpushするたびにpasswordを聞かれるのが面倒

.envにaccess token コピペすることで対策しました。

### リモートのブランチを削除したいとき

この記事を作成する時には使用しました。

通常の開発でも、リリースした機能のリモートブランチを削除するのではないかと思います。