これは入門編の続きです。
GitやGithubを利用していると、どう操作すべきかわかりづらい難しい状況に陥ることもしばしば起きます。
そういったときに使えるテクニックをいくつか紹介するので、ぜひ参考にしてください。
GitとGitHubを使いこなすには基本的なコマンドを理解するだけではありません。
より効率的にGitを使うためには、コミットログの表示や以前のバージョンへのチェックアウト、.gitignore
ファイルの使用など、さまざまなテクニックを熟知しておく必要があります。
例えば、git log
を使えばコミットの詳細な履歴を見ることができます。これは、変更を追跡し、どこでエラーが発生したかを特定するのに便利です。
.gitignore
は、Gitにどのファイルやディレクトリを無視し、追跡しないことを設定する目的でリポジトリに作成する特別なファイルです。
ログファイルや一時ファイル、コンパイル済みのコード(Pythonの.pyc
ファイルなど)、環境固有の設定ファイルなど、他の人と共有する必要のないファイルに対して有効です。
以下はPythonプロジェクトにおける.gitignore
ファイルの例です。
この例では、Pythonのコンパイル済みファイル、ログファイル、環境関連ディレクトリ、データベースファイル、キャッシュファイル、一時ファイルはすべてGitに無視されます。
つまり、git status
を実行しても表示されず、git add .
を実行しても含まれないということです。
.gitignore
のパターンはglobのような形式であることに注意してください。
ワイルドカードとして*
を使うことができ、ディレクトリを指定するために/
を使い、コメントを追加するために行頭へ#
を使うことができます。ディレクトリを指定した場合はそのディレクトリ内のすべてのファイルも無視されます。
Gitによってすでに追跡されているファイルは.gitignore
の影響を受けないということに注意してください。無視させたい場合はgit rm --cached /path/to/file
で明示的に追跡対象から削除する必要があります。
マージコンフリクトは、Gitが2つのコミット間のコードの相違を自動的に解決できない場合に発生します。
マージコンフリクトが発生するとマージプロセス中に警告を発します。コンフリクトが発生した場合は手動で解決しなければ先に進めません。
コンフリクトは<<<<<
、======
、>>>>
という記号で表示されます。<<<<<
と======
の間のコードはあなたの現在のブランチのコードで、======
と>>>>
の間のコードは他のブランチのコードです。どのコードを残すかを手動で決める必要があります。
また、<<<<<
、======
、>>>>
のような記号も手動で削除してから再度pushします。
git reflog
はGitの強力なコマンドで、リポジトリのHEAD
に加えられたすべての変更の一覧を表示し、Gitリポジトリで行ったすべてのアクションの記録として効果的に機能します。
これは変更を取り消したり前の状態に戻したりしたいときに特に便利です。
いくつかのコミットを行った後、git reset --hard HEAD~3
を使って3コミット前に戻したとします。git reflog
を使えば、そのコミットを復元できます。
まず、reflogを確認します。
出力では、HEAD@{1}
、HEAD@{2}
、HEAD@{3}
がハードリセットを行った際に失われるコミットであることがわかります。
各行には、コミットハッシュ(347fad4
の箇所)、その時点でHEADが指していたもの、そして実行されたコマンドが表示されています。
feature Z
を追加したばかりのプロジェクトの状態に戻るにはコミットハッシュを利用できます。
これで失われたと思っていたコミットが復元されました。
git reset --hard
を使用する場合は、コミットを永久に破棄してしまうので注意が必要です。破壊的なコマンドを使う前に、必ずコードのバックアップを取っておくか、コードをリモートリポジトリにプッシュしておくようにしてください。
間違ったコミットメッセージや不完全なコミットメッセージで変更をコミットした場合、git commit --amend
を使ってメッセージを変更できます。
テキストエディタが開き、コミットメッセージを編集できます。
ただしすでに公開リポジトリにプッシュされているコミットを修正する場合は注意が必要です。
間違ってGitHubにプッシュしてしまった場合は、git revert <commit_id>
を使って新しいコミットを作成し、間違ったコミットで行われたすべての変更を取り消すことができます。
これは既存のコミット履歴を変更しないので比較的安全な方法です。
Gitに慣れてきたらより高度な機能を持つコマンドを試すことをおすすめします。
例えば、git rebase
はブランチのベースをあるコミットから別のコミットに変更し、あたかも別のコミットからブランチを作成したかのように見せることができる強力なコマンドです。
もうひとつの便利なコマンドはgit stash
で、すぐにコミットしたくない変更を一時的に保存しておきます。
このコマンドによって任意のタイミングで変更を適用できます。
高度なコマンドは強力ですが、注意深く使用しないと破壊的な力を発揮することがあります。
コマンドを実行する前に常にコマンドを理解していることを確認してください。
GitとGitHubの理解を深めれば、コーディングのワークフローを効率化するための豊富な機能をさらに多く発見できます。
例えば、Gitにはインタラクティブなステージング環境があり、次のコミットに選択的に変更を追加できます。このモードに入るにはgit add -i
コマンドを使用します。この環境を使うことで、変更点の塊を直接編集できます。
GitHubも基本的な機能だけでなく多くの機能を提供しています。
たとえば、GitHub Actionsを活用してCI/CDパイプラインなどのソフトウェアワークフローを自動化できます。また、GitHubのREST APIやGraphQL APIを使って、プログラム的にプラットフォームと対話することでニーズに合わせて機能拡張も可能です。
GitHubは、Gitの機能をコラボレーションツールで拡張しています。
Star
は、気になるリポジトリへ☆をつけることで最新の情報を受け取りやすくできます。
Issues
は、バグ、タスク、機能のディスカッションフォーラムとして機能します。
Actions
は、コードのテストからアプリケーションのデプロイまで、タスクの自動化を可能にします。
GitHub Pages
は、あなたのリポジトリから直接静的なWebサイトをホストします。
これらの機能を使いこなすことで、GitHubのプロジェクトを効率とコラボレーションの新たなレベルへと引き上げることができます。
GitとGitHubのメリットを最大限に活かすには、確立されたベストプラクティスに従うことが肝要です。
一般的に、開発チームはFeature Branch Workflow
、Gitflow Workflow
、Forking Workflow
などのワークフローを採用して作業を整理しています。
優れたコミットメッセージも重要です。
優れたコミットメッセージは簡潔で、何が変更されたかを含み、なぜその変更が必要だったのかを説明するものです。
リモートリポジトリから定期的にアップデートをpullして、常に最新の状態を保つことも推奨されます。これらのベストプラクティスを実践してGitとGitHubを使いこなし、ストレスフリーな開発体制を整備してください。