質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

BitBucket

BitBucketは無料のリポジトリ管理ホスティングサービスです。 MercurialとGitのVCSに対応しています。プライベートリポジトリを、制限なく作成することが可能です。

Q&A

1回答

1349閲覧

[Git]ブランチ: プルリクエストで受けたブランチが汚いので綺麗にしたい。

RInwieoa

総合スコア0

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

BitBucket

BitBucketは無料のリポジトリ管理ホスティングサービスです。 MercurialとGitのVCSに対応しています。プライベートリポジトリを、制限なく作成することが可能です。

0グッド

0クリップ

投稿2022/02/01 00:22

編集2022/02/01 05:14

Gitでプルリクエストを受けたのですが、対象のリモートブランチ(origin/foo)が「コミット履歴が汚い(testなどが一部含まれている)」、「変更しないで良い箇所の差分がある(インデント、シングルクォーテーション→ダブル...など)」のでそのような箇所が含まれないクリーンなブランチへ変更したいです。

私が思いつく方法としては、

  1. リモートブランチ(origin/foo)を拒否、削除し、リモートブランチの始点から再度別ブランチ(origin/bar)を作成しやり直す
  2. リモートブランチ(origin/foo)を拒否、削除し、ローカルブランチ(foo)を整理、コミット、rebaseし、コミットを適度いまとめ再度pushする。 ※ この方法は例がありました(https://senooken.jp/post/2021/01/14/)
  3. リモートブランチ(origin/foo)は削除せず、次のコミットでリファクタリングし、再度pushする。

などがあります。

①が余計なコミット含まれず、0からやり直せるので良いと思いましたが、どの手法が適切でしょうか。

補足:
現時点で、origin/fooはどのブランチにもマージされておりません。プルリクエストの段階です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Gitでプルリクエストを受けたのですが

状況が少し分かりづらいです。

  1. 質問者さんがレビュワーで、今回のひどいプルリクエストをレビューして直してほしい
  2. 質問者さんがプルリクエストを作った側で、先輩のレビュワーにボロクソ書かれた

上記で取るべき手段が変わってきます。

1なら他人の作ったコミット履歴を勝手に改竄する事は危険なので、
プルリクエストを作った作業者さんとペアプログラミングするなりして対処してください。


さて、2だったと仮定して話をすすめていきます。

まずどれを選ぶかの軸になりますが、
プルリクエストは「○○機能の開発しましたよ、確認後取り込んでください」という要望です。
要望自体が的外れであったなら兎も角、挙動は要望どおりで、コードが汚い程度なら跳ね除けてクローズというのは微妙ですね。
どうせ全く同じプルリクエストがもう1個生えてきてプルリクエストの履歴を汚す事になるので……

ここは同じプルリクエストを使いつつ、
「きれいに修正してもう一度もってこい」という要望を出して修正させる形にするのが良いでしょう。

次に「どの程度の酷さ」かにもよりますが、
コミット履歴を改ざんするほどでもない軽微な指摘ならば
普通に追加のコミットを積み上げる3の手法で十分です。

3.リモートブランチ(origin/foo)は削除せず、次のコミットでリファクタリングし、再度pushする。

そしてそれじゃちょっと辛いやらかしがあった場合、
私が職場でやっている手法は3を改良した感じですね。

GitHubのプルリクエストは開いたまま、
全く別のコミット履歴をgit push -f origin fooという風に-fの強制プッシュを使って上書きすることが出来ます。
また、それに伴いプルリクエストの履歴に「強制プッシュを使って全く別のコミット履歴を上書きしました」という趣旨のメッセージが追加で表示されます。

一度fooブランチのコミットをrebaseで潰すか、
git resetとやってファイルの状態を維持しつつmasterのコミット履歴まで戻り、
改めてfooブランチをキレイな状態に構築しなおします。

コマンドの流れを使って解説するとこんな感じ。

bash

1$ git branch 2* foo 3 master 4 5# なにはともあれコミット履歴が消し飛んでも良いようにバックアップ 6$ git checkout -b tmp 7$ git checkout foo 8 9# fooブランチのコミット履歴をmaster相当まで戻す 10$ git reset master 11 12# エディタで開いてリファクタリングを行う 13$ git add . 14$ git commit -m "fix: fooモジュールの開発" 15 16# forceオプションをつけてプッシュ 17$ git push -f origin foo 18 19# 不要になったtmpブランチを削除 20$ git branch -D tmp

投稿2022/02/01 02:36

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RInwieoa

2022/02/01 04:28

miyabi-sun とても丁寧に解説していただきありがとうございます!miyabiさんの手法は全く思いつかなかったのでとても勉強になりました。ご回答をうけて、追加で2点質問があります。 追加質問の前に、最初の質問の補足させていただきます。 まず状況に関しては1です(私がレビュアー)。 ※レビュアー対象はBさん。 ただ、Bさんとペアプログラミングする環境ではなく時間がないので。レビュアーである私がBさんの許可を得て改良することも想定しておりました。 まず1つ目の質問として、このような状況で私がgit push -f origin fooを行い、Bさんはローカルのブランチを削除、その後リモートから改良後のorigin/fooをfetchすれば大きな問題はないと認識していますが、この手法で問題ないでしょうか。 続いて2つ目の質問として、例示したコマンドの流れを以下のように変更しても問題ないでしょうか。reset masterだと元のコードを参照しながら記述しづらくなるので、リファクタリングのコードを記述し、その後rebaseする流れです。 ``` # なにはともあれコミット履歴が消し飛んでも良いようにバックアップ $ git checkout -b tmp $ git checkout foo # エディタで開いてリファクタリングを行う $ git add . $ git commit -m "fix: fooモジュールの開発" # fooブランチをrebase $ git rebase -i HEAD~N # forceオプションをつけてプッシュ $ git push -f origin foo ``` お忙しいところ恐れ入りますが、2点回答いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問