ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

私のGitの定形フロー

  • 2020/12/17更新
    • 現在のブランチ状態をわかりやすくした

Gitに慣れ、だいたい以下の流れが定形になったので、備忘録として残します。

以下では、

(develop) $

上記を、developブランチにいることを表しています。

1. featureブランチの作成

機能Aを追加することになったので、developブランチから機能Aを実装する用のブランチ(feat/task-A)を作り、そこで機能Aを実装します。

# ローカルのdevelopブランチを最新の状態にする(リモートのdevelopブランチの状態にする)
(master) $ git checkout develop  # developブランチへ移動する
(develop) $ git fetch  # リモートの情報を、リモート追跡ブランチに取ってくる
(develop) $ git merge origin/develop  # リモート追跡ブランチをマージする

# developブランチからfeat/task-Aブランチを作成する
(develop) $ git checkout -b feat/task-A  # feat/task-Aブランチを作成し、移動する

2. 機能Aの実装中

機能Aを実装中、適当にきりのいい作業単位でコミットする

(feat/task-A) $ git add .             # ファイルをすべてインデックスに追加する
(feat/task-A) $ git status           # addしたファイルの確認
(feat/task-A) $ git reset piyo.txt    # インデックスから除外したいファイルがある場合はresetコマンドを使う(piyo.txtが除外される)
(feat/task-A) $ git commit        # インデックスをコミットする

# エディタが開くので、コミットメッセージを入力する
# 保存をするとコミット完了。やっぱりコミットしたくないときは保存しないで終了する

# コミットログを見たいときは以下のようにします。
(feat/task-A) $ git log     # commitのログが見れる(qで終了)

機能Aが実装完了するまで、これを繰り返します。

3. 機能Aの実装完了

feat/task-Aブランチで機能Aを実装しました。忘れずコミットします。

# 機能Aを実装完了したので、きちんとコミットする
(feat/task-A) $ git add .
(feat/task-A) $ git commit

ローカルリポジトリのコミットを、リモートリポジトリにpushします。

# ローカルのfeat/task-Aブランチのコミットを、リモートのfeat/task-Aにpushする。
(feat/task-A) $ git push origin feat/task-A

pushができたら、プルリクエストをします。プルリクエストをコマンドでやる方法はわからないので、GitHubだったらそのページに行ってぽちぽち適当にボタンをクリックします。

3-1. コンフリクトが発生したら

# 競合の解決方法例

# developブランチを最新の状態にする
(feat/task-A) $ git checkout develop
(develop) $ git fetch
(develop) $ git merge origin/develop

# developブランチをfeat/task-Aにマージする
(develop) $ git checkout feat/task-A
(feat/task-A) $ git merge develop

# 競合が発生した場合、競合を解決する必要がある
# 競合の解決は、基本的に手動でファイルを修正する
# 注意1. 自分の変更内容を必ずしも優先しない 
# 注意2. わからなければ誰かに相談する

# <<<<<<< HEAD
# 自分の環境の変更点
# =======
# マージを試みた他の環境での変更点
# >>>>>>> [commit id]

# ファイルを修正して競合を解決したら、通常通りにaddしてコミットします。
(feat/task-A) $ git add .
(feat/task-A) $ git commit -m "fix conflict"

# コミット出来たらfeat/task-Aをリモートへpushします。
(feat/task-A) $ git push origin feat/task-A

4. プルリクエストが承認されたら

ローカルのfeatureブランチはもう必要ないので削除します。

# ブランチ削除の前に、ブランチの作業分をdevelopにマージする
(feat/task-A) $ git checkout develop
(develop) $ git fetch
(develop) $ git merge origin/develop

# マージしたら削除できる
(develop) $ git branch --delete feat/task-A  # feat/task-Aブランチの削除

その他

git branch --delete feat/task-A できないとき

ローカルのdevelopブランチにfeat/task-Aの内容がマージされてない場合、エラーが出る。なので、developブランチを最新の状態にしてやれば良い。

# developブランチを最新の状態にする
$ git checkout develop
$ git fetch
$ git merge origin/develop

# 消せるようになる
$ git branch --delete feat/task-A

git checkout [ブランチ] できないとき

ブランチを移動できないとき、大抵はコミットしてないのが原因です。コミットしたくない場合、stashで一時保存すればよい。