Git よく使うコマンド

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 はリリース用にしてしまう。

・開発は、機能毎など各トピックブランチを作成して進める。

つまり、以下の様な運用フローを作る。

  1. master ブランチは常にデプロイできる状態に保つ。
  2. 新開発は、master ブランチから新しいブランチを作成してスタートする。
  3. 作成した新しい ブランチ上で作業し、コミットを実施し、定期的にPushする。
  4. ブランチは、master にマージする為、プルリクエストを都度、実施する。
    –  これにより必ずレビューを受けることになる。
  5. master ブランチにマージしたら即デプロイする。
    –  テストとデプロイ作業は可能ならば自動化する。

 

Gitは、とても便利で、使用している人が多いと思いますので、このコマンド一覧が、一助になればと思います。

でわ

 



❏❏ TOPIC ❏❏ ------------------------------------------------------------

カスタム自由!フリーECサイトパッケージ
チャットボット導入サービス
WEBシステム開発・スマホアプリ開発はSRIAへ