Gitを使ってもらうために


# Gitを使ってもらうために
:::note warn

まだまだ勉強の中で書いてみた記事になります。
間違い等ある場合是非コメント等で教えて頂ければ幸いです。

:::


複数人で開発をしているとGitを使うことが多々あると思います。
Gitをまだ使ったことがなく怖いという方もいらっしゃると思います。

しかし、デファクトスタンダード「業界の標準」となっているGitを知らないのは
今後のIT業界に身を置くものとして少し足りなくなってしまうのではないでしょうか。

## 敷居が高いと思う理由
1. コマンドを覚えられない
1. マージが正しいのか分からない
1. コンフリクトが怖い
1. コマンドを間違えたときに何が起こるかわからない

上記のような理由が考えられます。

## でも大丈夫
### コマンドが覚えられない

Gitには95個ほど(2025/04/02現在)のコマンドが存在していますが、  
これらのコマンド全てを使用する事は基本的にはないため、  
最初は必要最低限のコマンドだけを使い、メモを取ることで自然と覚えていきましょう。 

ただ、以下5つのコマンドは覚えておくとGitを使っていく中で便利です
1. clone : リモートリポジトリからリソースをコピー
1. **pull : リモートリポジトリの変更を作業ツリーに反映**
1. **add : 作業ツリーの変更をステージングに乗せる**
1. **commit : ステージングに乗せた変更に履歴を作る**
1. **push : 作業ツリーの変更をリモートリポジトリにアップロードする**

特に太文字のものを覚えていれば問題ありません。

他にも、fetchやmergeと言ったコマンドがありますが、追々慣れていけばいいと思います。


### マージが正しいのか分からない

Gitは元々、Linuxカーネルのソース管理で利用するために開発されました。  
あれほど大規模なシステムが管理できるので、まず間違いありません。  

そもそも、マージはコミットの履歴から差分があるかどうかを確認し、
差分があったものを取込むため変更のないファイルについては何も処理されません。

GUI(GitHubやGitLab等の)ツールを使ってプルリクエストを行えば差分が表示され、どのような変更が反映されるのか確認しながらマージすることができるため安心です。

WinMerge等の差分比較ツールで手動マージした場合、
変更部分を探す必要もありますしどちらに反映するべきなのか間違えてしまう可能性があり、
とても危険な（熟練度に依存した）作業となります。

併せて、Cloneで取ってきたファイルが正しいのか疑問を感じる方もいますが、  
Gitはファイルのチェックを行い、問題ないことを常に監視しています。

>**Gitは完全性を持つ**  
Gitの全てのものは、格納される前にチェックサムが取られ、その後、そのチェックサムで照合されます。  
これは、Gitがそれに関して感知することなしに、あらゆるファイルの内容を変更することが不可能であることを意味します。  
この機能は、Gitの最下層に組み込まれ、またGitの哲学に不可欠です。  
Gitがそれを感知できない状態で、転送中に情報を失う、もしくは壊れたファイルを取得することはありません。  

[使い始める-Gitの基本](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E5%9F%BA%E6%9C%AC)参照


### コンフリクトが怖い
コンフリクトは、別々のブランチで同じファイルの同じ行を変更した場合に発生する「競合（コンフリクト）」 です  
慣れていないうちは、エラーが表示され焦ってしまうかもしれません。
Gitのコンフリクトは、解決が難しく感じるかもしれませんが、実際は単にどの変更を採用するかを選ぶ作業です。
親切なGitはコンフリクトが起きた場所にしっかりとマーキングを行ってくれています。

```text
<<<<<<< HEAD

	Dim B_MESSAGE_1 AS String = 'bbranchが追加したメッセージ 1個目。';
	Dim B_MESSAGE_2 AS String = 'bbranchが追加したメッセージ 2個目。';
=======

	Dim B_MESSAGE_1 AS String = 'abranchが追加したメッセージ 1個目。';
	Dim B_MESSAGE_2 AS String = 'abranchが追加したメッセージ 2個目。';
>>>>>>> abranch
```
```HEAD```が現在取込を行おうとしているブランチです  
```abranch```がマージを実施しようとしているブランチです。

この場合、どちらが正しいものなのかを確認して[abranch]を採用する場合はHEADの変更をすべて消します。
```diff
-<<<<<<< HEAD
-
-	Dim B_MESSAGE_1 AS String = 'bbranchが追加したメッセージ 1個目。';
-	Dim B_MESSAGE_2 AS String = 'bbranchが追加したメッセージ 2個目。';
-=======

+	Dim B_MESSAGE_1 AS String = 'abranchが追加したメッセージ 1個目。';
+	Dim B_MESSAGE_2 AS String = 'abranchが追加したメッセージ 2個目。';
->>>>>>> abranch

```
#### 最終的な形
```text
	Dim B_MESSAGE_1 AS String = 'abranchが追加したメッセージ 1個目。';
	Dim B_MESSAGE_2 AS String = 'abranchが追加したメッセージ 2個目。';
```
この時、Gitが作成したマーキングも一緒にすべて削除します。


もし、どちらを反映してよいかわからなければコミットの履歴から変更者に確認を取ればよいのです。  
何のことはありませんん。落ち着いて変更されている部分をしっかりと確認すればよいのです。

コンフリクトは必要経費です。必ず起きるものとして受け入れる必要があります


### コマンドを間違えたときに何が起こるかわからない
コマンドを間違えても、```push```しなければどうにでもなります。  
コミットを取り消したり、再度```clone```し直せばよいのです。

コマンドは、基本的なコマンドを触っていればファイルがおかしくなったりすることはありません。

但し、git add で変更をステージングに上げる作業だけはしっかりと確認を行いましょう。  
```git add .```と全ての変更をステージングに上げることができますが、この方法はあまり推奨されるものではありません。  
なぜなら、自分の思いもよらぬ変更が反映されてしまう可能性があるからです。  
沢山のファイルを変更した場合なども、一つ一つ確認をしながらステージングに上げていきましょう  

そもそも、大量の変更をまとめてコミット自体がブランチ戦略としてはあまり褒められるものではないです。

## 不安の解決
少しでも不安が解消できれば幸いです。
怖い気持ちもあると思いますが、まずは触ってみることが大切です。

Gitの利用自体は無料ですし、リモートリポジトリは[GitHub](https://github.co.jp/)等のサービスが簡単に利用できます。  
触ってみて、実際に見てみてどのような動きをするのか、使い勝手はどうなのかを感じてみてはどうでしょうか。

自分で作成している簡単なアプリケーションをGitで管理してみてみるのが一番良いかもしれません。

これを機に、Gitを勉強してデファクトスタンダードであるGitに寄り添ってみてください。

では、より良い開発を！