Github 上のオープンソース プロジェクトに変更を送信し、コア チーム メンバーの 1 人からコード レビューのコメントを受け取りました。
レビューコメントを考慮してコードを更新し、再送信したいと思います。これを行うための最適なワークフローは何ですか? git/github に関する私の限られた知識からすると、次のいずれかを実行できます。
コードを新しいコミットとして更新し、最初のコミットと更新されたコミットの両方をプル リクエストに追加します。
何らかの方法で (??) リポジトリから古いコミットをロールバックし、すべてを含む単一の新しいコミットを作成し、それに対してプル リクエストを発行しますか?
git commit
には修正機能がありますが、コミットをローカル リポジトリの外部にプッシュした後は使用しない方が良いと聞きました。この場合、ローカル PC で変更を行い、プロジェクトの github ブランチにプッシュしました。この場合、「修正」を使用しても問題ありませんか?他に何かありますか?
オプション 2/3 は、オープンソース プロジェクトの履歴にすべてを実装するコミットが 1 つだけあるため、良いように思えますが、これをどのように行うかはわかりません。
注: これが回答に影響するかどうかはわかりませんが、別のブランチで変更を加えたわけではなく、マスターの上にコミットしただけです。
ベストアンサー1
プルリクエストを更新するには
プル リクエストを更新するには (ポイント #1)、プル リクエストの元と同じブランチをチェックアウトして、再度プッシュするだけです。
cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push
オプション - コミット履歴の消去
リポジトリの履歴がきれいになるようにコミットをまとめるように求められたり、プル リクエストの「メッセージ」から注意をそらす中間コミットを削除したい場合があります (ポイント #2)。たとえば、コミット履歴が次のようになっている場合:
$ git remote add parent [email protected]:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem
複数のコミットをまとめて、1 つのコミットとして表示するようにすると良いでしょう。
$ git rebase -i parent/master
これにより、プル リクエストの履歴を書き換える方法を選択するように求められます。エディターには次の内容が表示されます。
pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments
以前のコミットの一部にしたいコミットの場合は、pick を squash に変更します。
pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments
エディターを閉じます。Git は履歴を書き換え、結合された 1 つのコミットのコミット メッセージを入力するように求めます。それに応じて修正すると、コミット履歴が簡潔になります。
$ git log --oneline parent/master..master
9de3202 fixing actual problem
それをフォークにプッシュします:
$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To [email protected]:me/my-fork.git
f1238d0..9de3202 HEAD -> master
プル リクエストには、以前に複数のコミットに分割されたすべての変更が組み込まれた単一のコミットが含まれます。
パブリックリポジトリの履歴を変更するのは悪いことです
履歴を書き換えてgit push -f
、他の誰かがすでにクローンしている可能性のあるブランチで使用するのは良くありません。リポジトリの履歴とチェックアウトの履歴が分岐する原因になります。
ただし、リポジトリに統合することを提案している変更を修正するためにフォークの履歴を修正することは良いことです。したがって、プル リクエストから「ノイズ」を排除することに躊躇しないでください。
ブランチに関する注意
上記では、プル リクエストがmaster
フォークのブランチから来たものとして示していますが、必ずしもそれで問題はありませんが、これが標準的な手法である場合、リポジトリごとに 1 つの PR しか開けないなど、特定の制限が生じます。ただし、提案したい個々の変更ごとにブランチを作成する方がよいでしょう。
$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets