😊

git feature flowで使う一連のgitコマンド

2025/01/28に公開

前提

gitの操作はsource tree等々のGUIツールを使っている方が多いと思いますが、セキュリティの関係でそういったツールが使えずCUIでやらざるを得ない現場もあるでしょう。
そんなときに備えて、普段使いレベルで必要であろうコマンドをまとめます。
※git feature flowについてはこちら参照。
※今回も上記記事と同様に、大元のリポジトリと、そこからforkしたリポジトリを使用して開発をする想定になっています。

まず最初に

  • リモートリポジトリからクローン
// まずはforkしたリポジトリをclone
// git clone <リモートリポジトリのURL>
git clone git~~~ ←originという名前でリモートリポジトリが登録されます。

// 次は大元のリポジトリをリモートリポジトリとして登録
// git remote add <リモートリポジトリに登録したい名前> <リモートリポジトリのURL>
git remote add upstream git~~~
  • リモートリポジトリからローカルブランチを作成
// upstreamリポジトリのmasterブランチから、ローカルブランチfeature/hogehogeを作成
// ※-bオプションはローカルブランチを新規作成
git checkout -b feature/hogehoge upstream/master

// ※-bオプションを付けなければ、既存のローカルブランチに作業ブランチを切り替える
git checkout feature/hogehoge
// 下記も作業ブランチの切り替えに使用可能
git switch feature/hogehoge
  • リモートリポジトリの最新の状態を、ローカルの追跡ブランチに反映する
// リポジトリ指定
git fetch <リポジトリ名>
// 登録している全てのリモートリポジトリ指定
git fetch --all 

ローカルリポジトリには、リモートリポジトリを追跡するブランチがあります。
例)origin/master ⇒ originリポジトリのmasterブランチを追跡
fetchではその追跡先の最新の状態を取得します。

開発を進めたら

  • 変更したファイルを確認
// modified:修正したファイル
// deleted:削除したファイル
// Untracked files:新規作成したファイル
git status
  • 変更したファイルの差分を確認
// 変更したコード内容(ワークディレクトリ)と、ローカルリポジトリを比較。
git diff
git diff <ファイル名>

// ステージにあるファイルとローカルリポジトリを比較する場合
git diff --staged
  • 変更の破棄
// ファイル指定、ディレクトリ指定
git checkout -- <ファイル名>
git checkout -- <ディレクトリ名>

// 全ファイルの変更の破棄
git checkout -- .
  • コミット準備

    • 修正・新規作成ファイルをコミット対象へ
// ファイルを指定する場合
git add hoge.js

// とりあえず全部対象にしたい
git add .
または
git add -A
または
git add --all

// 変更があるファイル(ファイル削除も含む)を全部対象にしたい
git add -u
または
git add --update

// 新規作成及び更新したファイルを対象にしたい(削除したファイルは含まない)
git add --no-all
  • ステージからワークディレクトリへ戻したい場合
// ファイル指定、ディレクトリ指定
git reset HEAD <ファイル名>
git reset HEAD <ディレクトリ名>

// 全ての変更を戻す
git reset HEAD .

コミットしよう

git commit -m "コミットメッセージ"

// 複数行のコミットメッセージを付けたいとき
// ※空行を挟んで複数行のコミットメッセージを付けられる
git commit -m "コミットメッセージ" -m "コミットメッセージ"

// このコマンドでvimエディタが開くので(開くエディタは設定に依る)、そこでコミットメッセージを編集できる
git commit
  • リモートリポジトリへ
// [origin]=リポジトリ [hogehoge]=リモートリポジトリのブランチ名
git push origin feature/hogehoge

// -uオプションを付ければ、pushしたブランチを追跡ブランチに出来ます。
git push -u origin feature/hogehoge

変更履歴の確認

git log
// ファイル指定して履歴を確認したい場合
git log -p <ファイル名>

やっちまった・・・そんなときに

リモートリポジトリへpushしたあとに、誤字脱字に気づいた・・・
こんなことでコミット履歴増やしたくないですね。そんなときは、

対応案1 commit --ammend

一番シンプルなやり方。基本的にこれを使っておけば良い。
1個前のコミットを上書きします。
ファイル修正はなくて、単にコミットメッセージを修正したい場合もこれ。

git commit --ammend -m "コミットメッセージ"
※ -m "コミットメッセージ"は無くてもいい。その場合はコミットメッセージは1個前のコミットのまま。

対応案2 reset

// 最新のコミットを無かった事にしよう。
git reset --mixed HEAD^

// オプション
// --mixed:git addをする前の状態まで戻ります(ワークディレクトリに編集ファイルが戻る)
// ※オプションを書かなければデフォルトでこれになります
// --soft:git addをした状態まで戻ります(ステージに編集ファイルが戻る)
// 基本的にはこのどちらかを使うかなと。

リモートリポジトリのコミット履歴を変える場合

上記の対応は、ローカルリポジトリにコミットして、リモートリポジトリへPUSH前であれば特にもんだにありません。
ただ、リモートリポジトリへPUSH済みのコミットを変更する場合は、普通にpushができなくなります。
この場合、強制pushする必要があります。
※強制pushはそれなりに害を生みますが、forkしたoriginのリポジトリへであればそれほど気にしなくても大丈夫。

git push --force-with-lease origin feature/hogehoge

複数コミット分を巻き戻したい・・・

1個前のコミットなら上記の対応方法で済みますが、複数コミット前までさかのぼって変更したい場合、コミットIDを指定してresetする必要が出てきます。
面倒なのでなるべくこれをやらずに済むように気を付けましょう。

  • コミットIDの調べ方

gitkコマンドでgitのGUIを開いて、元に戻したいコミットのIDを探すのが簡単だと思います。(mac OSの場合、homebrewでgit-guiをインストールする必要あり)

git reset --mixed <コミットID>

これ以降の手順は、修正⇒コミット⇒矯正プッシュ。

※おまえなんかしんじゃえー! なコミットの場合

明らかにおかしな内容のコミットや、要件が全く変わって意味の無くなったコミットは、--hardオプションを使って記憶からも記録からも消しましょう。ステージにもワークディレクトリにも戻る事は無く消え去ります。(まぁコミット履歴が完全に抹消される訳では無いので元には戻せるんですが)

git reset --hard HEAD^ // ませんこーう!
git reset --hard <コミットID> // フルパワーだーーー!

番外編:エイリアスを活用しよう

長いコマンドやオプションは、エイリアス登録して入力を短縮出来るようにすると便利です。

例)

git config --global alias.co "checkout"
git config --global alias.com "commit"
git config --global alias.com-a "commit --amend"
git config --global alias.rem "remote -vv"
git config --global alias.br "branch -vv"
git config --global alias.res-s "reset --soft"
git config --global alias.push-o "push origin"
git config --global alias.push-f "push --force-with-lease"

Discussion