376

Githubのオープンソースプロジェクトに変更を送信し、コアチームメンバーの1人からコードレビューコメントを受け取りました。

レビューコメントを考慮してコードを更新し、再送信したいと思います。これを行うための最良のワークフローは何ですか?git / githubに関する私の限られた知識から、次のいずれかを実行できます。

  1. コードを新しいコミットとして更新し、最初のコミットと更新されたコミットの両方をプルリクエストに追加します。

  2. どういうわけか(??)リポジトリから古いコミットをロールバックし、すべてを含む単一の新しいコミットを作成してから、そのためのプルリクエストを発生させますか?

  3. git commit修正機能がありますが、コミットをローカルリポジトリの外にプッシュした後は、それを使用すべきではないと聞きました。この場合、ローカルPCで変更を加え、プロジェクトのgithubブランチにプッシュしました。'amend'を使用しても大丈夫ですか?

  4. 他に何かありますか?

オープンソースプロジェクトの履歴にはすべてを実装するコミットが1つしかないため、オプション2/3が適切なようですが、これを行う方法がわかりません。

注:これが回答に影響するかどうかはわかりませんが、別のブランチで変更を加えたのではなく、マスターの上でコミットしただけです。

4

2 に答える 2

250

プルリクエストを更新するには

プルリクエスト(ポイント#1)を更新するには、プルリクエストと同じブランチをチェックアウトして再度プッシュするだけです。

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

オプション-コミット履歴のクリーニング

リポジトリの履歴をクリーンにするためにコミットをまとめるように求められる場合があります。または、プルリクエストの「メッセージ」の邪魔になる中間コミットを削除したい場合があります(ポイント#2)。たとえば、コミット履歴が次のようになっている場合:

$ git remote add parent git@github.com: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

物事を一緒に押しつぶして、単一のコミットとして表示されるようにすることをお勧めします。

$ 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 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 git@github.com: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
于 2013-02-24T19:27:40.170 に答える
237

プルリクエストで使用されるブランチに新しいコミットを追加し、ブランチをGitHubにプッシュするだけです。プルリクエストは、追加のコミットで自動的に更新されます。

#2と#3は不要です。ブランチがマージされた場所のみを表示したい場合(追加のコミットは表示したくない場合)、git log --first-parentログ内のマージコミットのみを表示するために使用できます。

于 2011-10-30T19:45:02.187 に答える