Git とは
Gitは、ソースコードを管理し、他の開発者とソフトウェアプロジェクトで協力するための、無料でオープンソースの分散型バージョン管理システムです。
Linuxオペレーティングシステムを作成したLinus Torvalds氏が作成し、世界でもっとも広く使われているバージョン管理システムとなっています。
Gitを使用することで、開発者はコードの変更履歴を追跡し、他の人と協力し、何か問題が発生した場合に簡単に変更を元に戻すことができます。その人気により、小規模なスタートアップから大企業までのソフトウェア開発チームにとって必須のツールとなっています。
基本的な Git コマンド
ここでは、基本的なGitコマンドを紹介します。
Git Add
git add
コマンドは、変更をリポジトリにコミットする前に、開発者が変更をステージングすることができるため、Gitワークフローの重要な部分です。
作業ディレクトリ内のファイルを変更すると、Gitは自動的にそれらを変更されたファイルとして追跡します。ただし、これらの変更は自動的にステージングエリアに追加されないため、Gitは変更をコミットする準備ができた変更をステージングエリアに保持します。git add
コマンドは、変更を作業ディレクトリからステージングエリアに移動するために使用されます。
以下は、git add
コマンドの使用例です。
$ git add file.txt
この例では、git add
コマンドで「file.txt」ファイルをステージング領域に追加しています。ワイルドカードを使用して複数のファイルを一度に追加することもできます。
$ git add *.txt
このコマンドは、現在のディレクトリにある全てのテキストファイルをステージング領域に追加します。
また、次のようにして、作業ディレクトリのファイルに加えられた全ての変更をステージングすることもできます。
$ git add .
ドット(.)は現在のディレクトリを表し、このコマンドはディレクトリ内の全てのファイルに加えられた変更をステージングします。
Git Commit
git commit
コマンドは、ローカルリポジトリに加えられた変更を保存するために使用されます。一意のID、タイムスタンプ、およびコミットメッセージを持つ新しいコミットが作成されます。コミットメッセージは、コミットで行われた変更の簡単な説明である必要があります。
以下は、git commit
コマンドの使用例です。
$ git commit -m "ログインページに新しい機能を追加"
この例では、コミットメッセージは「ログインページに新しい機能を追加しました」です。-m
フラグは、コマンドで直接コミットメッセージを指定するために使用されます。このコマンドを実行すると、作業ディレクトリでの変更がローカルリポジトリに保存されます。変更をリモートリポジトリにプッシュするには、git push
コマンドを使用する必要があります。
Git Push
git push
コマンドは、ローカルリポジトリの内容をリモートリポジトリにアップロードするために使用されます。これは、他の人がアクセスできるようにリモートリポジトリに変更を公開するために使用されるコマンドです。
以下は、git push
コマンドの使用例です。
$ git push origin master
この例では、master
ブランチをorigin
リモートにプッシュしています。このコマンドを実行すると、Gitはリモートリポジトリに変更をプッシュしようとします。他の人が行った変更と競合する変更を行った場合、Gitは競合を解決するまで変更をプッシュできないことがあります。
コミットハッシュを使用して、特定のコミットをプッシュすることもできます。
$ git push origin abc123
このコマンドは、ハッシュabc123
のコミットをorigin
リモートにプッシュします。
変更をプッシュするには、リモートリポジトリに書き込みアクセス権を持っている必要があることに注意してください。書き込みアクセス権がない場合は、変更をプッシュする前にリポジトリの所有者に許可を求める必要があります。
Git Pull
git pull
コマンドは、リモートリポジトリに行われた変更をローカルリポジトリに更新するために使用されます。複数の開発者が同じプロジェクトで作業し、他の人が行った変更を自分のローカルリポジトリに反映させたい場合に便利です。
GitHubからリポジトリをクローンして、リモートリポジトリに行われた最新の変更を取得したい場合、ローカルリポジトリで次のコマンドを実行できます。
$ git pull
これにより、リモートリポジトリから最新の変更が取得され、ローカルリポジトリにマージされます。ローカルの変更とリモートの変更に競合がある場合、Gitはマージが完了する前に競合を解決するように促します。
git pull
は、git fetch
コマンドとgit merge
コマンドの組み合わせです。git fetch
コマンドは、リモートリポジトリから最新の変更をダウンロードし、git merge
コマンドはそれらの変更をローカルリポジトリにマージします。アップデートプロセスをより細かく制御したい場合は、これらのコマンドを別々に実行することもできます。
Git Status
git status
コマンドは、ローカルリポジトリの現在のステータスを表示するために使用されます。最後のコミット以降にファイルに加えられた変更、コミットのためにステージングされ、準備ができているファイル、そしてまだGitで追跡されていないファイルを表示します。
Gitリポジトリがあり、「index.html」という名前のファイルに変更を加えた場合、リポジトリのステータスを表示するには、次のコマンドを実行できます。
$ git status
これにより、次のような出力が表示されます。
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
この例では、Gitは、「index.html」ファイルに変更を加えたことを伝えていますが、それらの変更はコミットのためにステージングされていません。Gitはまた、git add
コマンドを使用して変更をコミットのためにステージングできることを提案しています。
Git Log
git logコマンドは、Gitリポジトリのコミット履歴を表示するために使用されます。リポジトリで行われた全てのコミットのリストを表示し、コミットメッセージ、著者、日付、コミットハッシュを含みます。
以下は、git log
コマンドの例です。
commit c0c0a7e92e49239e4d7d8f25d4f764da4fe4f17d
Author: John Smith <john.smith@example.com>
Date: Tue Mar 2 14:07:31 2021 -0500
Updated index.html file
commit 12040db00cc28a71903c2d8e4f4daa4c5e5b5c8e
Author: Jane Doe <jane.doe@example.com>
Date: Mon Mar 1 10:44:12 2021 -0500
Added new styles to style.css file
commit 8c8a49a2a9ce9dc3d76a3e8c1f618ee45ec54a71
Author: John Smith <john.smith@example.com>
Date: Sun Feb 28 16:15:52 2021 -0500
Initial commit
上記の出力は、リポジトリで行われた全てのコミットのリストを逆年代順に示しています。コミットハッシュは英数字の文字列として表示され、各コミットには著者、日付、コミットメッセージがあります。この例では、John Smithが最新のコミットでindex.html
ファイルを更新したこと、Jane Doeが2番目に最近のコミットでstyle.css
ファイルに新しいスタイルを追加したことがわかります。リスト中でもっとも古いコミットは、John Smithによって作成された最初のコミットです。
Git におけるブランチ
ブランチはGitの中核的な機能であり、開発者がコードベースの異なるバージョンで同時に作業できるようにします。Gitにおいて、ブランチとは本質的に、メインのコードベースから分岐した別々の開発ラインです。これにより、開発者はメインブランチに影響を与えることなく、コードベースを変更したり、他の開発者と独立して新しい機能やバグ修正を作業することができます。
Gitで新しいブランチを作成すると、リポジトリの現在のコミットを基にして作成されます。これにより、新しいブランチでファイルに変更を加えても、それらの変更がメインブランチに影響を与えることはありません。ブランチの変更がテストされ承認された後、Gitのマージ機能を使用してメインブランチにマージできます。
複雑なソフトウェア開発プロジェクトを管理するには、特に複数の開発者やチームを含む場合には、ブランチを効果的に使用することが不可欠です。これにより、より効率的なコラボレーション、より簡単なテスト、コード変更のより良い組織化が可能になります。Gitの強力なブランチ機能を使用することで、開発者は新しいアイデアを試したり、コードベースを変更することができますが、プロジェクトの他の部分に影響を与えるリスクを回避することができます。
Git Branch
Gitでは、ブランチはプロジェクトの異なる部分で作業することができ、本体のコードベースに影響を与えずに開発するための別々の開発ラインです。git branch
コマンドを使用して、ブランチの作成、一覧表示、削除を行うことができます。
例えば、プロジェクトで作業していて、新しい機能の作業に取り掛かるために新しいブランチを作成したい場合、次のコマンドを使用してfeature-branch
という新しいブランチを作成することができます。
$ git branch feature-branch
これにより、現在のブランチ(通常はmaster
)をベースに新しいブランチが作成されます。その後、git checkout
コマンドを使用して新しいブランチに切り替えることができます。
$ git checkout feature-branch
これで、行った変更はfeature-branch
ブランチにのみ影響を与え、master
ブランチには影響を与えません。作業が終了したら、git merge
コマンドを使用して変更をmaster
ブランチにマージすることができます。
リポジトリ内の全てのブランチを一覧表示する場合は、次のコマンドを使用できます。
$ git branch
これにより、リポジトリ内の全てのブランチがリスト表示され、現在のブランチがアスタリスクで強調表示されます。
ブランチを削除する場合は、次のコマンドを使用できます。
$ git branch -d feature-branch
これにより、feature-branchブランチが削除されます。ただし、ブランチがまだマージされていない場合、Gitはブランチを削除する前に警告を表示します。
Git Checkout
Gitでは、git checkout
コマンドを使用して、異なるブランチ間を切り替えたり、新しいブランチを作成したり、コミット履歴をナビゲートしたりします。以下にいくつかの例を示します。
既存のブランチに切り替える
既存のブランチに切り替えるには、git checkout
コマンドに続けてブランチ名を使用します。例えば、develop
ブランチに切り替えるには、次のように実行します。
$ git checkout develop
これにより、develop
ブランチに切り替わり、そのブランチ内のファイルとコミットを反映した作業ディレクトリが更新されます。
新しいブランチを作成する
-b
フラグを使用して、新しいブランチを作成して切り替えることができます。例えば、feature-branch
という新しいブランチを作成して切り替えるには、次のように実行します。
$ git checkout -b feature-branch
これにより、現在のブランチ(通常はmaster
)を基に新しいブランチが作成され、feature-branch
に切り替わります。
コミット履歴をナビゲートする
git checkout
を使用して、リポジトリのコミット履歴をナビゲートすることができます。例えば、プロジェクトが2つ前のコミット時点でどのようになっていたかを確認する場合は、次のように実行します。
$ git checkout HEAD~2
これにより、2つ前のコミットに作業ディレクトリが移動します。その時点で変更を加えたり、ファイルを表示したりすることができます。
git checkout
でブランチを切り替えると、Gitによってトラッキングされているファイルに対して変更がある場合は、コミットされていない場合は失われることに注意してください。Gitは警告を表示するため、ブランチを切り替える前に変更をコミットするか、スタッシュする必要があります。
Git Merge
Gitでは、git merge
コマンドを使用して、異なるブランチからの変更を1つのブランチに統合します。
new-feature
というフィーチャーブランチで作業しており、これらの変更をmaster
ブランチにマージしたいとします。最初に、 git checkout
コマンドを使用してmaster
ブランチに切り替えます。
$ git checkout master
次に、 git merge
コマンドを使用し、マージしたいブランチの名前を指定します(この場合はnew-feature
)。
$ git merge new-feature
Gitは、new-feature
ブランチからの変更をmaster
ブランチにマージしようとします。もし衝突がある場合(つまり、同じコード行に影響を与える両方のブランチの変更がある場合)、Gitはマージを完了する前に解決するように求めます。
マージが完了すると、 new-feature
ブランチからの変更がmaster
ブランチに統合されます。その後、 new-feature
ブランチが必要なくなった場合は削除することができます。
Git Workflow
Gitのワークフローは、ソフトウェア開発プロジェクトでバージョン管理にGitを使用するための手順を説明するプロセスです。ワークフローは、コードの変更方法、レビュー方法、コードベースに統合する方法を定義します。
Gitで従うことができる様々なワークフローがありますが、ブランチを使用して変更を分離し、変更を定期的にコミットし、コードレビューを通じて他の開発者と協力するなどの共通の原則を共有しています。
Gitワークフローは、チームが効果的に協力し、高品質のコードを提供するために構造化された組織的なアプローチを提供します。 Gitワークフローに従うことで、開発者はコードの変更が適切に追跡、レビュー、および統合されることを確認し、より効率的で効果的な開発プロセスを実現できます。
Git Stash
Gitでは、git stash
コマンドを使用して、変更をコミットせずに一時的にブランチに保存できます。これは、別のブランチに切り替えたり、別のタスクに取り組んだりする必要がある場合に役立ちます。次に例を示します。
new-feature
というフィーチャーブランチで作業していて、変更を加えたがまだコミットする準備ができていない場合を考えます。ただし、重要なバグ修正に取り組むために別のブランチに切り替える必要があります。git stash
コマンドを使用して変更を一時的に保存できます。
$ git stash
このコマンドは変更を保存し、作業ディレクトリを最後にコミットされた状態にリセットします。他のブランチに切り替えてバグ修正に取り組むことができます。
$ git checkout bug-fix
バグ修正が完了したら、new-feature
ブランチに戻り、git stash apply
コマンドを使用して保存した変更を取得できます。
$ git checkout new-feature
$ git stash apply
Gitでは、git rebase
コマンドを使用して、1つのブランチから別のブランチに変更を統合します。これにより、異なるブランチの上にコミットを再適用することができ、リポジトリの履歴を簡素化し、理解しやすくすることができます。以下は例です。
feature
ブランチとmaster
ブランチがあると仮定します。feature
ブランチで作業していたが、その間にmaster
ブランチに新しい変更が加えられたため、その変更をfeature
ブランチに含めたい場合、git rebase
コマンドを使用します。
Git Rebase
Gitでは、git rebase
コマンドを使用して、1つのブランチから別のブランチに変更を統合します。これにより、異なるブランチの上にコミットを再適用することができ、リポジトリの履歴を簡素化し、理解しやすくすることができます。
feature
ブランチとmaster
ブランチがあると仮定します。feature
ブランチで作業していたが、その間にmaster
ブランチに新しい変更が加えられたため、その変更をfeature
ブランチに含めたい場合、git rebase
コマンドを使用します。
$ git checkout feature
$ git rebase master
このコマンドは、feature
ブランチの全てのコミットを現在のmaster
ブランチの上に再適用し、master
からの変更をfeature
に統合します。2つのブランチ間に競合がある場合は、Gitが解決するよう促します。
リベースが完了したら、通常通りmaster
ブランチに戻り、feature
ブランチから変更をマージできます。
$ git checkout master
$ git merge feature
これにより、git rebase
を使用して統合したmaster
からの変更を含め、feature
ブランチの変更がマージされます。
Git Revert
Gitでは、git revert
コマンドを使用して特定のコミットを元に戻すことができます。これは、元のコミットで行われた変更を取り消す新しいコミットを作成することによって行われます。これはgit reset
コマンドとは異なり、コミットを完全に削除してコミット履歴を書き換えるものではありません。
master
という名前のブランチがあるとし、コードにバグを導入するコミットを作成したとします。
$ git checkout master
$ git commit -m "Introduce bug into code"
このコミットを取り消すには、git revert
コマンドを使用できます。
$ git revert HEAD
このコマンドは、以前のコミットで行われた変更を取り消す新しいコミットを作成します。リポジトリ内の他の変更との間に競合がある場合、Gitは新しいコミットを作成する前に解決するように促します。
リバートコミットが作成されたら、通常どおり変更をリモートリポジトリにプッシュできます。
$ git push origin master