Git は分散型バージョン管理システムです。
Note
- バージョン管理は、その名の通り、履歴を記録し、必要な場合にはロールバックできます。
- 分散型の概念は、ローカルリポジトリが追加されることで、各ローカルリポジトリにはすべてのバージョンが存在し、途中でネットワークに接続する必要はありません(ただし、最終的にはコードを中央リポジトリに提出する必要があります)。
add#
add の目的は、作業ディレクトリ
での変更をステージングエリア
にコミットし、ファイル内の変更を監視することです。
git add <ファイル>
ファイルの状態は「未追跡
」から「ステージング済み
」に変わります
Warning
add はファイルの変更を追加するものであり、ファイル自体ではありません!
クイック add#
すべてのファイルをステージングする
git add .
commit#
commit の目的は、ステージングエリア
のコードをローカルリポジトリ
にコミットすることです。
git commit
クイック commit#
git commit -m <コミットメッセージ>
push#
ローカルをリモートリポジトリにプッシュすることで、現在のブランチとそのパス上のcommit
を一緒にリモートリポジトリに送信します。
git push <ホスト名> <ブランチ名>
クイック push#
すべてのローカルブランチをプッシュする。
git push
log#
commit が完了すると、コミットの SHA-1、コミットの作成者、コミットの時間が記録されます。
git log
変更内容の log を表示する#
詳細なファイルの変更内容を表示します。
git log -p
簡単な log を表示する#
ファイルの変更統計のみを表示します。
git log --stat
show#
現在の commit 情報のみを表示する#
git show
特定の commit 情報を表示する#
git show SHA-1
特定の commit 情報内のファイルを表示する#
git show SHA-1 <ファイル>
pull#
git pull
は実際にはgit fetch
とgit merge
の組み合わせであり、ターゲットブランチのすべての commit と現在の commit をマージして新しい commit を生成します。
git pull <ホスト名> <ブランチ名>
pull 操作は一定程度自動的にマージを行います:
- 1 つのブランチで A ファイルを変更し、別のブランチで B ファイルを変更した場合、マージ後に両方のファイルが変更されます。
- 1 つのブランチで A ファイルの 1 行目を変更し、別のブランチで A ファイルの 2 行目を変更した場合、マージ後に A ファイルの 1 行目と 2 行目が変更されます。
- ただし、1 つのブランチで A ファイルの 1 行目を変更し、別のブランチでも A ファイルの 1 行目を変更した場合、問題が発生し、手動で競合を解決する必要があります。
競合の解決が完了したら、再度 add、commit する必要があります。この時、git は自動的に log 情報を埋めてくれるので、そのままコミットすればよいです。
branch#
git と他のバージョン管理システムの主な違いは、git にはbranch
の概念があることです。branch
は、commits への参照です。
参照
は、commit のショートカットです。私たちはそれぞれのcommit
に SHA-1 のハッシュ値があることを見てきましたが、この値は非常に低い重複率を持っており、上の例では7800ba
を使用して前回の commit を代表することができます。HEAD -> master
、github/master
などの後ろにあるものも、この commit への参照を指しています。
HEAD:現在のブランチの参照#
現在のブランチの参照は、現在の作業ディレクトリ
に対応するcommit
を指します。コミットが行われると、HEAD も自動的に現在のcommit
を指すようになります。つまり、現在のcommit
がどこにあるかに関係なく、HEAD を使用して現在のcommit
を操作できます。
branch:ブランチ#
HEAD
はcommit
だけでなく、branch
を指すこともできます。branch
を指している場合、間接的に対応するcommit
を指しています。現在のブランチがコミットされると、HEAD
は対応するbranch
を一緒に移動させます。
main:デフォルトのブランチ#
main ブランチは、プロジェクトがクローンされたときにデフォルトで作成されるものです。
Note
すべてのブランチは平等です。
ブランチの操作#
ブランチの作成#
git branch <ブランチ名>
ブランチの切り替え#
git checkout <ブランチ名>
これは少し手間がかかるので、2 つのステップを組み合わせることができます:
ブランチを作成してすぐに切り替える。
git checkout -b <ブランチ名>
ブランチの削除#
git branch -d <ブランチ名>
Note
- 削除する場合は、他のブランチに切り替えてから削除してください。
- ブランチの削除は、commit への参照の削除であり、ブランチのコミットは削除されません。
-master とマージされていないブランチは削除できません(セキュリティ上の理由から)。大文字の-D
に変更すると削除できます。
ワークフロー:フィーチャーブランチング#
最も一般的なワークフローです。
- プロジェクトで機能を開発する必要がある場合、プロジェクト上で新しいブランチを作成します。
git checkout -b zhang
- 開発が完了したら、リモートブランチにプッシュできます:
git add .
git commit -m "開発完了"
git push origin zhang
- その後、同僚にコードをレビューしてもらうように伝えます。同僚が OK と言ったら、同僚は次のようにします:
git pull
git checkout zhang
- 同僚が問題がないと言ったら、zhang を master にマージします。 もし問題があると言われた場合は、コードを修正して手順
2
を繰り返します。
git checkout master
git pull
git merge zhang
最後にリモートリポジトリにプッシュし、ローカル / リモートブランチを削除します:
git push
git branch -d zhang
git push origin -d zhang