GITについて知っておくべきことすべて

コードのバージョン管理の重要性は想像できると思います。それによって、変更を元に戻す失われたデータの回復などの可能性があります。
きっと、(私じゃないですけどね)ファイルのコピーを作成して、どんどん工夫を凝らした名前をつけてバージョン管理している人を知ってるでしょう...

GIF画像

1972年にSCCS(ソースコードコントロールシステム)が登場する前までは、コードのバージョン管理は恐らく誰もがこのように行っていたでしょう。SCCSは最初の集中型バージョン管理ソフトウェアです。

でも、今回話すのはSCCSではありません。今興味があるのは、来年20周年を迎える分散型オープンソースのバージョン管理ソフトウェアであるGITです。

目次:

1. GITってなに?

GITはリナス・トーバルズ(そう、Linuxカーネルの開発者ですよ)によって開発された2005年に立ち上げられたオープンソースの分散型バージョン管理システムです。

GITを使うと、プロジェクトのバージョンをローカルにコントロールすることができます(作業フォルダ内で)し、すべての変更をリモートリポジトリ(例えばGitHub上で)と同期させることができます。

2. GITの仕組みって?

物理的なファイルキャビネットを想像してみてください。キャビネットには全てのプロジェクトファイルが入ったフォルダがあります。誰かがファイルを操作したい場合は、それを取り出し、終わった後にフォルダに戻す必要があります。ですから、2人が同じファイルで作業をすることは不可能で、全ての衝突を回避できます。

でも、GITはそうは動きません!(神ありがとう)

GIF画像

集中型バージョン管理システムでは、特定のファイルで作業するたびにチェックアウトして、リポジトリから除去したり、作業が終わったらチェックインしてリポジトリに戻す必要があります。

GIF画像

分散型システムであるGITでは、リモートリポジトリと同じファイルに複数の人がアクセスすることが可能です。誰かがファイルを操作する必要がある時は、単にローカルマシンでクローン(あるいはリポジトリ全体をクローン)し、変更点をリモートリポジトリに送り返すことができます。これにより、複数の人が同じプロジェクトで作業し同じファイルを操作することが可能です。

3. GITのインストール

GITは主要な運用システム(Windows, Linux, MacOsなど)で利用が可能であり、コマンドラインもしくはgit-scm.com公式インストーラーを使用してとてもシンプルなインストールプロセスがあります。

3.1 Windowsでのインストール

GITは公式ウェブサイトからインストーラーをダウンロードして、指示に従ってインストールするだけです。

3.2 Linuxでのインストール

sudo apt install git-all

上記のコマンドを使用してLinuxでGITをインストールすることができます。

3.3 MacOSでのインストール

Macでは、Homebrewをインストールしてから、ターミナルで下記のコマンドを実行するのが最も簡単です。

brew install git

4. GITの設定

インストール後、下記のコマンドGITを設定することが重要です。

git config --global user.name "[ユーザー名]"
# 例: John Doe

git config --global user. email "[メールアドレス]"
# 例: johndoe@email.com

特定のローカルリポジトリに対して個別のユーザーを設定することも可能です。その場合は--globalタグを外してください。

5. ローカルリポジトリの開始

GITを設定したら、ローカルリポジトリを開始することができます。これには、ゼロから新しいリポジトリを開始するか、既存のリモートリポジトリをクローンするかのどちらかがあります。

5.1 ゼロから開始する場合(git init)

新しいリポジトリを開始するには、目的のリポジトリのルートフォルダに移動して下記のコマンドを実行するだけです。

git init

このコマンドを実行することで、プロジェクトフォルダ内に.gitディレクトリが作成され、このローカルリポジトリの作業フォルダでのバージョン管理が可能になります

5.2 既存のリポジトリをクローンする場合(git clone)

既存のリモートリポジトリをクローンするのは、ゼロから新しいリポジトリを開始するのと同じくらい簡単です。クローンしたいリモートリポジトリのURLgit cloneコマンドに渡し、リポジトリをダウンロードしたいフォルダにそのまま使います:

git clone [リポジトリURL]

クローンが成功すると、リポジトリ全体がローカルマシンにクローンされ、関連リモートリポジトリに自動的にリンクされます

クローンされたリポジトリでは、将来git remoteコマンドを使う必要はありません。

6. GITの使い方

ローカルリポジトリ内では、プロジェクトに必要なファイルを作成することができますが、それらは自動的にGITに同期されるわけではありません。変更があった場合にバージョン管理されるべき時を報告する必要があります。

ファイルを自由に操作し、変更が完了した後更新されたファイルをGITに送信します。

これを行うために、バージョン管理の3段階の無限フローを理解することが重要です(ええ、無限です)。

              変更 -> ステージ -> コミット
  • 変更: バージョン管理の最初の段階であり、最後の利用可能なバージョンと比較して変わったファイルがあります。

  • ステージ: バージョン管理の2番目の段階で、次のコミットに追加したい変更されたファイルを置く場所です。

  • コミット: バージョン管理の最終段階で、変更を確認し、ステージにある修正されたファイルをローカルリポジトリに送ります。

コミットすると、ローカルリポジトリには新しいバージョンが利用可能になり、再び更新を受け付けて "変更" され、その後 "ステージ" に置かれ、そして再び "コミット" され、新しいバージョンを確認することになります(だから、"無限"ですね)。

コミットが古いバージョンを上書きするわけではなく、新しいバージョンを最後のバージョンへのポインターとともに含むことで、GITによって追跡されている各ファイルのバージョンをトラッキングすることを意味します。

6.1 追加とコミットする(git addとgit commit)

かなり複雑に聞こえるかもしれませんが、バージョン管理のフローを実行するのは非常にシンプルです。所望の変更が完了したら、次のコマンドでステージに修正ファイルを追加します:

git add [ファイル名]

git add -A -> 一度にすべての変更ファイルをステージに追加します。

git add *.[ファイル拡張子] -> 指定されたファイル拡張子のすべての変更ファイルを一度にステージに追加します(例: git add *.html

いつでもgit statusコマンドでローカルリポジトリの現在の状態を確認することができます。

スクリーンショット画像

新しいファイルを作成した後にgit statusを実行すると、新しいファイルは "Untracked" として表示されます。これは、このファイルがまだ新しくGITによって追跡されるためにはいかなるコミットにも追加されていないことを意味します。

リポジトリ内の特定のファイルまたはフォルダをGITが無視する設定することができます。これには、ルートフォルダに.gitignoreファイルを追加し、中に無視されるべきファイル名やフォルダ名を書くだけでOKです。

注意:無視されたファイルやフォルダはGITの追跡対象から消えるので、"Untracked"でさえ表示されません。追跡をリセットするには、.gitignoreファイルから該当名を削除してください。

ファイルをコミットに追加するためには、git addコマンドを実行してそのファイルを追加します(この例では"index.html"):

スクリーンショット画像

ファイルを追加することで、git statusを再度実行すると、新しいファイルがステージに追加され、次のコミットで送られる準備が整いました。次のコマンドを使用してコミットすることができます:

git commit -m "[説明的なメッセージ]"

コミットにはユニークなID(ハッシュコード)があり、不変です。つまり、一度確認されたら変更することができません。

git commit -a -> 修正されたすべてのファイルをステージに追加し、一度にコミットします。

ファイルのコミットが成功した後git statusを実行すると、これ以上アップロードされるべき変更ファイルは存在しないことが分かります。つまり、すべての変更が最後のコミットとともにローカルリポジトリに効果的に保存されました。

スクリーンショット画像

また、リポジトリのコミットログを確認して行われた変更を確認することができます。git logコマンドを使うと、ハッシュコード、ブランチ、作者、日付など、すべてのコミットのいくつかのメタデータが表示されます。

スクリーンショット画像

このプロセスは、プロジェクトに必要な新しいファイルを追加し、それらを変更し、ローカルリポジトリに新しいコミットをして送信するために繰り返すことができます。

GIF画像

git log -N -> 最後のNコミットを含むログを表示します。

git log [ブランチ-A] [ブランチ-B] -> "ブランチ-B"にあるが"ブランチ-A"にはないコミットのログを表示します。

git log --follow [ファイル名] -> 指定されたファイルが変更されたコミットのログを表示します。たとえファイルの名前が変わっても大丈夫です。

git diff -> リポジトリの最新の利用可能なバージョンと比較して行われた変更をリストします。

git diff [ファイル名] -> 指定されたファイルの最後の利用可能なバージョンと比較して行われた変更をリストします。

6.2 コミット前後の変更を元に戻す

コミットされる前に、ローカルリポジトリへの変更は取り消されたり変

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/reenatoteixeira/everything-that-you-need-to-know-about-git-2440