Gitについて、よく使用するコマンドを纏めたので共有させて頂きます。
そもそもGitって?
個人的な主観が多分にあり、端的に言ってしまうと…
Gitは、スナップショット、それを時系列に連なねて管理する仕組み
です。個人的には、ブロックチェーン的な要素も有る様に思っています。
この記事は、以下をご理解頂いている人に向けたものです。
・リポジトリとステージ、ワークツリーの構造を理解している。
よく登場する文言とその概要
・コミット・・・スナップショット
・ブランチ・・・並行して複数機能を開発する為の仕組みで、コミットを示すポインタ
・リポジトリ・・・(以下はリポジトリに格納されているもの)
– ツリーファイル ・・・ ファイルの中身の圧縮
– コミットファイル ・・・ ツリーと策は、コメントなどの情報
– ファイル名は、ハッシュで40文字ほどの英数字に圧縮
・HEAD・・・自分が作業しているブランチを示すポインタ
・プルリクエスト・・・自分の変更したコードをリポジトリに取り込んでもらえるように依頼
・リベース・・・ブランチの基点となるコミットを別のコミットに移動
良く使うコマンド一覧
〇状態の確認
・用途 :状態の確認や、コンフリクトしたファイルの確認にも使用
・コマンド : git status
・使用例 : git status
〇ログの確認
・用途 :ログの確認
・コマンド : git log -p -n <行>
・使用例 : git log -p -n 1
・特記 : JとPキーボードで上下に移動可能。オプションで「–oneline 」「–decorate」などが存在する。
〇ワークツリーの変更の取り消し
・用途 :ログの確認
・コマンド :git checkout — <ファイル名||ディレクトリ名||. 任意の全ファイルの変更の取り消し>
・使用例 : git checkout — dirname
・特記 :「–」ブランチの変更(切替)も同じコマンドの為、「–」でオプションを付加している。
: 実際は、ステージの内容をワークツリーにコピーしているだけ。
〇ステージの変更の取り消し
・用途 :ログの確認
・コマンド :git reset HEAD <ファイル名||ディレクトリ名>
・使用例 : git reset HEAD dirname
・特記 :実際はリポジトリの内容をステージにコピーしているだけ。
: 対象がステージのみで、ワークツリーには変更が無いと言う点に注意。
〇直前のコミットをやり直す
・用途 :直前のコミットをやり直す
・コマンド :git commit –amend
・使用例 : git commit –amend
・特記 :実際は現在のステージの内容でリポジトリを修正(上書き)している
:【注意】リポジトリにpush したコミットは、使用不可
: リポジトリを書き換えてしまうので、複数人で作業している場合、AさんとBさんで差分が出る。
リモート
〇リモートリポジトリの情報確認
・用途 :リモートリポジトリの情報確認
・コマンド :git remote -v
・使用例 : git remote -v
・特記 :FETCHとPUSHでURLの切り替えも可能な為、両方のURLが表示される。
〇リモートリポジトリの追加
・用途 :リモートリポジトリの追加
・コマンド :git remote add <エイリアス名> <URL>
・使用例 : git remote add backup https://hoge.com/sample.git
・特記 :バックアップ保存などによく使う。
〇リモートから取得(FETCH)
・用途 :リモートから取得し、ローカルリポジトリを更新する。
・コマンド :git fetch <リモート名>
・使用例 : git fetch https://hoge.com/sample.git
・特記 :ローカルリポジトリのみ更新され、ワークツリーは更新(マージ)されない点に注意。
〇リモートから取得(PULL)
・用途 :フェッチして、マージするという2段階の手順を一度で実施してくれる。
・コマンド :git pull <リモート名> <ブランチ名>
・使用例 : git pull origin master
・特記 :ワークツリーが更新される。HEADがあるブランチに、マージされるので注意。
〇リモート名のあれこれ
(確認)
・コマンド :git remote
(変更)
・コマンド :git remote remote rename <旧リモート名> <リモート名>
(削除)
・git remote rm <リモート名>
ブランチ
〇ブランチ確認
・用途 :現在のブランチを確認する。
・コマンド :git branch
・使用例 : git branch
・特記 :全ブランチを確認するには、オプション「-a」を付加。例)git branch -a
〇ブランチ作成
・用途 :ブランチを新規に作成します。
・コマンド :git branch <ブランチ名>
・使用例 : git branch sample
・特記 :ブランチの切り替えは別コマンド
〇ブランチ切り替え
・用途 :ブランチ切り替え
・コマンド :git checkout <既存ブランチ名>
・使用例 : git checkout sample
・特記 :作成のみという点に注意。また、変更の取り消しにも「checkout 」を使用するので注意。
〇ブランチ作成と切替え
・用途 :ブランチ作成と切り替えを同時に実施
・コマンド :git checkout -b <新ブランチ名>
・使用例 : git checkout -b newblanch
・特記 :作成のみという点に注意
〇ブランチのマージ
・用途 :ブランチマージ
・コマンド :git merge <ブランチ名 || リモート名/ブランチ名>
・使用例 : git merge origin/master
・特記 :master に future をマージする場合、HEADはmaster で、「git merge future」を実施
※ちなみに、マージには以下の3種類ある
1.Fast Foward :早送りになるマージ・・・ブランチのポイントを前に進めます。
2.AutoMerge : 基本的なマージ・・・枝分かれして開発をした場合、マージコミットと言う新しいコミットを作成します。
3.コンフリクト:いわゆる競合・・・これは後述します。
〇コンフリクトの解決
ちょっと脱線しますが、マージ時のコンフリクトについて、これの解決について記述します。
(変更前)
<<<<<<<<<<<<< HEAD
修正内容A
=============
修正内容B
<<<<<<<<<<<<< マージ対象ブランチ名
コンフリクトすると、ファイルが上の様な内容になる。
(変更後)
修正内容A
解決には、上記の様に書き換え、その後、修正を保存し、コミットで解決となります。
※そもそも、コンフリクトが起きないようにするには?
プル やマージをする際、変更中のファイルがある状態を避ける。具体的には、commit や stash をしておくのが良い。
〇ブランチ名の変更
・用途 :ブランチ名の変更
・コマンド :git branch -m <ブランチ名>
・使用例 : git branch -m nextbranchname
〇ブランチ名の削除
・用途 :ブランチ名の削除
・コマンド :git branch -d <ブランチ名>
・使用例 : git branch -d oldbranchname
〇ブランチ名の強制削除
・用途 :ブランチ名の強制削除
・コマンド :git branch -D <ブランチ名>
・使用例 : git branch -D oldbranchname
※リモートブランチについて
ブランチを確認した際に、以下の様になっていた場合
*master
remotes/origin/master
remotes/origin/newbranch
上記の状態で、master に remotes/origin/masterをマージする際は、「remotes」を記載しなくてOK
〇リベース
・用途 :ブランチの基点となるコミットを別のコミットに移動する。
・コマンド :git rebase <ブランチ名>
・使用例 : git rebase <ブランチ名>
・特記 :マージとの違いは、分岐の有無
・リベースの一連の作業の流れ
master と Aブランチがあった場合、Aブランチで、以下コマンドを実行
git checkout A
git rebase master
次に、master で以下コマンドを実行することにより、master のコミットをFast Fowerdできる
git checkout maste
git merge A
※リベースでしてはいけないこと
・リモートにプッシュしたコミットをリベースするのはNG
– 履歴が食い違い、プッシュできなくなる。
・「git push -f」(フォースコミット)は絶対NG
– 強制コミットは、完全に履歴が壊れるので使わない事
・じゃ、マージかリベースか、どっちを使う?
– 運用次第だが…
・マージのメリット
– コンフリクトの解決が比較的簡単
・マージのデメリット
履歴が煩雑化
・リベースのメリット
履歴が綺麗
・リベースのデメリット
コンフリクトの解決が面倒
・個人的には…
※マージは、作業の履歴を残したい場合、使用
※プッシュした後は、マージを使用
※コンフリクトしそうな場合は、マージを使用
コンフリの有無は、プルリクすると分かる。
※履歴を綺麗にしたい。残さなくても良い場合、使用
※プッシュしていないローカルの変更にはリベース
〇プル
・プルには以下の2種類がある
1.マージ型
・用途 :挙動としては、「git fetch」「git marge」の実施
・コマンド :git pull <リモート名> <ブランチ名>
・使用例 : git pull <リモート名> <ブランチ名>
・特記 :履歴が残る
2.リベース型
・用途 :挙動としては、「git fetch」「git rebase」の実施
・コマンド :git pull –rebase <リモート名> <ブランチ名>
・使用例 : git pull –rebase <リモート名> <ブランチ名>
・特記 :履歴が残らない。単純にデータを取得したい場合などに使用
最後に
今や、当たり前になっていますが、個人的に良いな。と思う運用は以下です。
・master はリリース用にしてしまう。
・開発は、機能毎など各トピックブランチを作成して進める。
つまり、以下の様な運用フローを作る。
- master ブランチは常にデプロイできる状態に保つ。
- 新開発は、master ブランチから新しいブランチを作成してスタートする。
- 作成した新しい ブランチ上で作業し、コミットを実施し、定期的にPushする。
- ブランチは、master にマージする為、プルリクエストを都度、実施する。
– これにより必ずレビューを受けることになる。 - master ブランチにマージしたら即デプロイする。
– テストとデプロイ作業は可能ならば自動化する。
Gitは、とても便利で、使用している人が多いと思いますので、このコマンド一覧が、一助になればと思います。
でわ