質問: 前提・実現したいこと ---------- gitで現在出しているプルリクエスト より一個前にmergeコマンドを打ったブランチがlogを見るとmergeされていなかったのでmergeさせて、現在プルリクエスト を出しているブランチから新しくブランチを切って、そのブランチとmasterブランチの差分をとり、新しくプルリクエスト を作成する方法 発生している問題 -------- 現在、エンジニアとしてインターンを行っている会社で、先輩の方に、自分の書いたコードをPull Requestしてレビューしてもらっています。 前回のレビューでokをもらったので、Pull Requestのブランチを、いつもはgithub上のマージボタンを押して行っていたのですが、コマンドでもマージする練習をしようと思いコマンドを使用して、masterブランチにgit mergeしました。 そして今日、新しく作ったブランチでPull Requestを作成して、レビューしてもらったところ 先輩から「レビューでされた指摘が反映されいません、修正後、Pull Requestをし直してください」と言われました。 gitのコミットログを見て見ると、 普通の場合 マージした後 Merge pull request #8 from アカウント名/ブランチ名 と表示されますが、 今回は表示されていませんでした。 リモートとローカルでは、Pull Request用のブランチで行ったコミットは反映されていますが、 Merge pull request #8 from アカウント名/ブランチ名というコミットログが表記されません。 これを反映させるにはどうすればいいのでしょうか? また、新しくPull Requestを作り直す際に、 masterブランチと差分を取るために、現在Pull Requestをしているブランチからブランチを切って、その内容を引き継ぎ、masterブランチと差分をとってPull Requestをし直すという認識であっているのでしょうか? 問題の状況を別のリポジトリで再現 ---------------- $ git checkout -b sample Switched to a new branch 'sample' $ echo "sample">>sample.txt $ git add . $ git commit -m "sample.txt" [sample 76883f7] sample.txt 1 file changed, 1 insertion(+) create mode 100644 sample.txt $ git push origin sample $ git switch master Switched to branch 'master' $ git merge sample Updating 814cd8a..76883f7 Fast-forward sample.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 sample.txt $ git log commit 76883f716a3ff205d7a4775fb14770a30a781768 (HEAD -> master, origin/sample, sample) Date: Fri Nov 29 00:32:19 2019 +0900 sample.txt 自分が行った流れを再現したところ、masterに移動してgit merge ブランチ名をして git push origin masterしたという流れでlogを 確認するとmergeされていませんでした。 この場合、この後どのようにすればmergeされるのでしょうか?
回答: こんにちは。 まず一つ目に、`Merge pull request ...` のメッセージを持つマージコミットは、Git 自体には本来存在しない「Pull request」という GitHub 独自のシステムによるものなので、Web 上からボタンでマージしないと作成されません。 次に、マージコミット自体が作成されない条件があります。 Git のマージには2種類あり、マージコミットを作成する通常のマージと、マージコミットを作成しない Fast-forward マージというものがあります。 マージしたいブランチが自身の「先端から伸びている」場合には分岐と合流が存在しなくなるため、マージコミットを作成する必要が無くなり、自身をマージ対象のブランチまで「追いつかせる」ことでマージ作業を完了できます。これを Fast-forward マージと呼びます。 以下の2つの例を見て下さい。 どちらであっても `(master)` の「中身は全く同じ」であることが分かると思います。 そのため、Git は、可能な場合は Fast-forward マージを選択するようになっています。 ``` # Non Fast-forward merge * (master) マージコミット |\ | * (sample) サンプル3 | * サンプル2 | * サンプル1 |/ * (origin/master) マージベース ``` ``` # Fast-forward merge * (master, sample) サンプル3 * サンプル2 * サンプル1 / * (origin/master) マージベース ``` コマンドでマージする場合、`git merge` に `--no-ff` オプションを付けることで、Fast-forward ができる場合でも Non Fast-forward マージを行うように強制することができます。 ところで、Pull request を使った master へのマージを行う運用の場合は、master の直接操作を禁止している場合が多いため、レビューからのマージを行う場合は Web のボタンを使うのが一般的です。 ローカルでのマージは、通常 Pull request にはしない自身や他人のブランチ同士をマージする場合に使うことが多いです。