決闘者(デュエリスト)から何となく学ぶGit導入

# はじめに
### 強いデッキ作ろうぜ！
![cardgame_card_dasu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/73102151-8360-ae18-58be-ca68b9b6486d.png)

俺「サイドラ入れて」
アイツ「サイクロン入れて」
コイツ「ミラフォ抜いて」
ソイツ「トラップを手札誘発に変えて」

俺「これ入れたの誰？」
アイツ「なんであれ抜いたの？」
コイツ「それ抜いたけどこれ入れてないぞ」
ソイツ「それ知らん」

あーあ、ぐちゃぐちゃになってしまいました
🤖<Gitを使えばよかったのに…

## さて、改めてGitとは何か？
　超簡単に言えば**履歴を管理してくれるやつ**です。
今回のカードゲームの例えで言うなら、「カード変更を提案する多数」と「実際にデッキを触る一人」に分かれるようなイメージです。このデッキを触る人こそがGit君なのです。

![Qiita09.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/f5bbf67d-3b04-60da-8117-b306183ec064.jpeg)
一人が上手くまとめてくれる

# 用語から学ぼう
　ビートダウン？ ハンデス？？ シナジー？？？
まるで意味がわかりませんが、知ればTCGが理解しやすくなるのもまた事実。
　Gitも同じ。用語から機能を理解したり、他の解説が読みやすくなったりします。用語を学びながら手順を理解しましょう。

### クローン
<details>

　まずはどんなデッキを編集するのか、Git君からデッキのコピーもらってきましょう。決闘者的に言うならデッキレシピと言った方が想像しやすいでしょうか。このレシピこそが**クローン**です。
これからこのデッキレシピを色々書き換えていきます。
![clone.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/b621a4bb-3811-764d-ae43-a82874f0443a.jpeg)
</details>


### コミット
<details>

　デッキを見せてもらい「ここ違うな～」となったあなた。
自分の頭の中や、手元で実際にデッキをいじってみて、「よし、これでOK!」
では早速先ほどもらったデッキレシピに反映させましょう。これが**コミット**をするということです。
![comit.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/5b04008d-6dcd-8624-a959-e69352dfb178.jpeg)

　ちなみにこのとき「どのような変更をしたのか」「なぜ変更したのか」を記したメモを一緒に渡します。これを**コミットログ**といいます。
 
🙎<サイバネティック・ヒドゥン・テクノロジーの方がシナジーあるからな

これが無いと冒頭の様にごちゃごちゃとしてしまいます。よく使ってる魔法が抜かれてたら誰でも「なんで？？」となりますし、それが誰の編集なのか分からなければ理由の聞きようもありません。
地味だけどかなり重要な工程です。

:::note info
コミットログは必ず残そう
:::
</details>


### プル
<details>

　さてデッキレシピにまとめた（コミットした）ものを早速デッキ本体に反映……する前に、他の編集者とすり合わせなければいけません。みんなバラバラの編集をしてるでしょうし、それを一つにまとめるのは大変です。
 なので今、他の人がどんな編集をしていたのか、最新のデッキ情報を取得してくる。これを**プル**と言います（ときには矛盾が発生し、それを解決したりもします）。

![pull.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/d26eaac9-ca6e-e7e3-338d-71bf02333a8b.jpeg)

　このときの差分は次のように表します。
```diff_c:デッキ編集差分
- 抜いたカード
+ 入れたカード
```
 ちなみに最新のデッキ状況を確認するだけのものを
 ### フェッチ
 と言います。
</details>


### プッシュ
<details>

　さぁいよいよ本体と合体する**プッシュ**の時です。
 コミットログとプルしたことを確認したら深いこと考えずにGO!
 デッキ本体を確認してみてください。きっとより良いデッキになってるはずです。

 ![push.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/0427b3e0-f163-11d1-2f4d-1b630c590918.jpeg)
</details>

### ブランチ
<details><summary>少し長くなるよ</summary>

　**ブランチ**とは作業を分岐する機能。またその枝分かれのことを言います。
 全体の編集とは別に「モンスターカード担当」「魔法カード担当」といった様に分担するようなイメージです。（逆に時間かかりそうですが、あくまで例えなので……）
 この枝分かれはそれぞれ分離独立しており、同時並行で編集しても互いに影響がありません。ピンとこないかもしれませんが、実際のプロジェクトではこれが結構大事なのです。
　今はなんとなく「カードが混ざらないのが大事なんだなぁ」くらいに覚えておいてください。
 
![branch.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/06c57f72-c7b9-c053-aea9-6b28fc6ca8ed.jpeg)

ちなみにこの枝分かれする前の本流のことを**master**といいます。
そしてブランチがmasterに再び合流することを

### マージ（統合）

といいます。
上手く魔法が組めたらデッキに合流してあげましょう。

![merge.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/0c8a875a-f53f-11ca-c810-a0d60e041076.jpeg)


　さて、本流であるデッキ本体（master）の編集を持ってくることをプルと言いましたが、支流（ブランチ）同士でも似たようなことができます。
 
### リベース

　正確には持ってくるというより**他人の編集に乗っかる**、枝をそのまま接ぎ替えるようなイメージです。
 モンスターカードと魔法カードのブランチがあったとして……
 
 ![rebase.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/6b7f5577-856d-71bd-300f-a6b64ee89c8b.jpeg)

　もう少し嚙み砕いて説明しましょう。
 
「モンスターカード担当がツイン抜いてノヴァ入れたらしい」
「マジか、結構でかいな」
「それな。他にどんな編集してるのか一度見せてもらおう」

だいたいこんなもんです。
　リベースはあくまでモンスターカード担当の編集を見せてもらう（反映させる）ものなので、魔法カード担当が行ったリベースは**モンスターカード担当自体への影響がありません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/cdefd907-61ad-fe98-6b22-2d5e5dd65409.png)

　役割がわかりづらい！ という人は**もしリベースが無かったら**を考えてみた方が早いかもしれませんね。
　先ほど説明した通り、カードの担当同士は独立しているので互いの編集が見えません。これはカードが混ざらないためでしたね。
 だから他の担当がどんな編集をしてるのか見たかったら毎回
 　モンスターカード担当のプッシュ
 　↓
 　魔法カード担当のプル
 を挟まなくちゃいけなくなります。一々頼むのも面倒ですし、分流と合流を繰り返すのもごちゃついてて汚いですね。
 結局カードが混ざっちゃいそうで本末転倒というやつです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/e8e3018e-367d-6c33-13ce-e98893ca1060.png)
 ``もしリベースが無ければ……``[^2]
 
 　なので基本はそれぞれでやって、必要があったら見せてもらう。相手への影響がないので互いの独立性も保たれます。

</details>

---

　以上が用語説明になります。少しはGitを使う流れが掴めたでしょうか？
 せっかくなので実際のソフトにもさらっと触れてみましょう。


# 実際にさわってみよう

### 今回の登場人物
* **Source Tree**
難しいコマンドとか使わなくても分かり易い操作でGit使えるよ
* **Azure Dev Ops**
クラウドサービスの一つ。
アマゾンのAWSなら聞いたことあるだろうか。言わばそのMicrosoft版だよ。
今回はリポジトリっていう機能だけ使うよ。
要はみんなで使う引き出しみたいなものだよ。

### 手順
1. 組織を作ろう（入ろう）
　[Azure DevOps](https://azure.microsoft.com/ja-jp/products/devops/)に登録、プロジェクトを立ち上げてください。
細かいことわかんない！とか誰かが用意してくれてるよ～って人は気にしなくていいです。
もし自分で1から立ち上げたい人はこちらを参照してください。
→ [リポジトリの作成](https://learn.microsoft.com/ja-jp/azure/devops/repos/git/create-new-repo?view=azure-devops)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/ab87c773-69fd-08e1-ed03-90a3b83c7220.png)

2. 鍵を作ろう
　右上の歯車>Personal access tokens>+New Tokenからトークンを作成してください。
みんなで使う引き出しの合鍵になります🔑
⚠️ちなみにトークンは一度しか表示されません！ ちゃんと控えておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/ae2686a5-b637-c4ec-76c2-6a70497f217f.png)

3. Sourcetree
[Sourcetree](https://scienceparkoffice.sharepoint.com/:x:/s/Public199/Edys5FILdmpPhUcF33ezA78BgLrLPxiZVdy-smnPKXvdwA?e=O52yNw)をリンク先からダウンロード、インストールしてください。
用語で説明した手順通り、まずはクローン！
　今回はAzureを使うので、[リモートリポジトリ]から先ほどのリポジトリにアクセスしましょう。
ホスティングサービスはAzureDevOps
ホストURLはおそらく`` https://dev.azure.com/[会社名]/[プロジェクト名] ``みたいな感じ
PersonalAccessTorkenはユーザ名（outlookアカウント、会社で使ってるメアドとか）
パスワードは先ほど作った合鍵、トークンを入力します
　使いたいリポジトリを選んだら履歴や枝分かれの画面が表示されます。
![202409261432.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/f54a25a5-9b65-5258-cb24-e844e5d0a352.jpeg)
`` 黒塗りばかりで申し訳ない… ``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794351/d6bb1b3d-8d78-fc4f-c783-862d3b4785fd.png)[^2]
　クローンが作成出来たら右上のExplorerを押してみてください。ローカル保存されたGitフォルダが開けるはずです。
その中でファイルを追加したり変更したりしたらまたSourceTreeに戻ってきてください。
作業ツリーのファイルから必要な項目を＋ボタンで抜き出し、コミット。画面下にコミットログを書くのを忘れずに。
あとは説明した通りにプル、プッシュ。必要に応じてブランチ、マージ。

# おわりに
　結局のところ、Gitとは「みんなで同じ作業机使ったらごちゃごちゃするからそれぞれの机にもってこーぜ」というだけの話なのです。
 基本は自分の机で作業して、キリの良いところでみんなの所に持っていく。ただそれだけ。
 **ブランチが東京地下鉄路線図みたいなことになって迷子**になったりなんて無いので、まずは気楽に使ってみてください！


[^1]:東京都交通局より
[^2]:Source Tree公式サイトより