これまでずっとSubversionを使ってきたが、Gitを使うことになったので、Gitについて学習してみた。
参考にしたのは「わかばちゃんと学ぶGit使い方入門」。
Gitとは?
- Gitとはバージョン管理システム。
- よく聞くGitHubはあくまでGitを使ったサービスの一種である。
- GitHubの他、GitLabやBitbucketなどがある。
Gitの特徴
- ファイルのバックアップが取れる
- 簡単に過去の時点に戻れる
- 複数人での作業が簡単
- 実リポジトリに変更を加えることなく、ローカルリポジトリを作っての作業が可能
リポジトリ
- リポジトリは過去の状態を保存しておく貯蔵庫のこと
- git上でリポジトリを作成すると、自動的に.gitという隠しフォルダが作成される
- この隠しフォルダには過去のファイルやディレクトリが特殊な状態で圧縮されている
リポジトリの種類
- ローカルリポジトリ
- 手元のPCで管理するリポジトリ
- 普段作業するリポジトリとして、リモートからクローンしてきたものをここで編集する
- リモートリポジトリ
- 専用のサーバーで管理されるリポジトリ
- ローカルで作業した内容を公開する先
- 他の人の変更をここから持ってくることもできる
コミット
- コミットまでの流れ
- 作業する
- ステージする(git add)
- コミットする(git commit)
- もし、コミットしたものを元に戻すなら
- 特定のコミットをチェックアウトする(git checkout)
- 単純に過去のコミットの状態に戻る
- コミットしたものを打ち消すわけではない
- 変更をリバートする(git revert)
- 変更したもの自体を打ち消す
- 特定のコミットをチェックアウトする(git checkout)
他人のリポジトリの取得
- 以下の順番でできる
- fork
- サーバー上の自分のアカウントにコピーしてくる
- clone(git clone)
- 自分のローカルリポジトリ上にコピーしてくる
- fork
ブランチ
- レポジトリの中で並行して作業ができる、枝(=ブランチ)のこと
- 本番用のコードが入っているところから、バグ修正用だったり、新機能追加をするブランチをそれぞれ追加することで、ごちゃまぜになることなくそれぞれ並行して作業が可能になる
- ブランチ間を移動したいときはそのブランチをチェックアアウトする(git checkout)
- バス修正や機能追加など、そのブランチでの作業を統合させたいときは、マージする(git merge)
- 本番用のコードが入っているのがmasterブランチ
- 最初にできているブランチ
- 常に最新の状態にしておくことが一般的
- 作業ブランチのことはtopicブランチといわれる
- 目的ごとにmasterブランチからtopicブランチをはやして作業すること
プッシュ
- ローカルのリポジトリにコミットしたものをリモートリポジトリに反映させること
プル
- 他人がリモートリポジトリへ加えた変更をローカルリポジトリへ反映させること
コンフリクト
- 同じ行に同じ時期に変更が入った場合、gitはどちらを優先すればよいか判断できないため、コンフリクトをいう状態になる
- その場合、コンフリクトが起きたファイルの対象の個所にコンフリクトが起きたことを記録してくれる。
- 解決するには、コミットした人同士でどちら正しい変更かどうかを確認し、正しい変更でファイルを修正し、コミットする
プルリクエスト
- 自分の変更をフォーク元のリポジトリへ反映してもらうように要求すること
- プルリクエストを出した後、フォーク元のリポジトリ作成者がそのコードを見て、自分のリポジトリへ反映するかどうかを判断する
- 運用方法にもよるが、この時に同時にコードレビューも実施可能
- 自分のアカウント上のリポジトリへプッシュした後、プルリクエストを出す
.gitignore
- gitの管理対象ファイルから外したいファイルがあるときに作成する
- .gitignoreに外したいファイルのファイル名を書き込んでおく
- 勝手に作成されるような隠しファイルなどを対象にすることが多い
- .gitigonore自体もコミットしておく必要がある
リベース
- ブランチを統合するにはmergeだけではなく、リベースという方法がある
- 元々のブランチ発生元からコミットが変わり、最新のコミットをベースとしたところからブランチを統合させる
- マージとの違い
- マージは実際のコードのコミットとは別に、マージするためのコミットが別途作成される
- リベースは元のコミットを改変した上で変更を反映していく
- が、masterを改変して、よからぬことも起きやすいので、基本的にはmergeを使うほうが安全
リモート追跡リポジトリ
- リモートブランチ
- リモートリポジトリの中にあるブランチ
- リモート追跡ブランチ
- ローカルリポジトリの中にある
- リモートブランチをミラーリングしただけのもの
- 読み取り専用
- ローカルブランチ
- ローカルブランチの中にある
- 普段作業するブランチ
- fetchという作業をすることで、リモートブランチから最新の変更をリモート追跡ブランチへ反映させる
- そこからmergeすることで、ローカルブランチに変更を反映させる
- pullはfetch + mergeの組み合わせ
チェリーピック
- 任意のコミットを自分のブランチへ持ってくる
- あくまで、その任意のコミットをコピーしてくるのみである