4

gitリポジトリに次の変更履歴があります。

---X---Y---Z---A---B---C

私はコードZのベースから作業を開始し、A、B、Cの3つの変更を加えました。これらの変更はそれぞれGerritの個別のレビューとしてアップロードされており、それぞれが以前の変更に依存しています。

レビューに続いて、変更Aを削除したいので、変更履歴は次のようになります。

---X---Y---Z---B---C

git rebase -iこれを機能させるための正しいフローは何git commitですか?

私は次のことを想定しました:

  1. git rebase -i HEAD~3最後の3つのコミットを表示するために使用します。これにより、ファイルの内容が表示されます。

    pick 1234567 Commit A message
    pick 1a2b3c4 Commit B message
    pick abcdefg Commit C message

  2. 次に、最初の行を削除し、ファイルを保存して最初のコミットを削除します。

  3. これは私が立ち往生しているところです...私がしようとするgit commit --amendと、Cのコミットを修正することしかできません。したがって、repo upload .またはを使用してレビューのためにリベースの変更をGerritにプッシュする方法がわかりませんgit push

Gerrit 2.2を使用しているので、レビューページにリベースボタンがありません。

4

2 に答える 2

5

次の手順がうまくいきました:

  1. git rebase -i HEAD~3 を使用して、最後の 3 つのコミットを表示します。これは、ファイルの内容を示しています。

    pick 1234567 Commit A message
    pick 1a2b3c4 Commit B message
    pick abcdefg Commit C message

  2. 次に、最初の行を削除してファイルを保存し、最初のコミットを削除します。

  3. Agit logは、新しい SHA-1 値を使用して、Z のベースの後に B と C が変更されたことを示しています。

  4. 次に、各変更をそれぞれのレビューに個別にプッシュできます。

    git push ssh://myserver:29418/project SHA1_of_B:ref/changes/123
    git push ssh://myserver:29418/project SHA1_of_C:ref/changes/789

ここ123で、 と789は、それぞれ変更 B と C のレビュー番号です。私の B と C の変更にはそれぞれ、適切にリベースされた新しいパッチがあります。

私の問題は、git push両方の変更を個別に行う必要があることを理解することでした。

于 2012-08-14T14:56:59.540 に答える
1

ステップ 2) の後、リベースは完了です。どのコミットを選択するかを選択した後。マージの競合が発生する可能性があります。それらを修正してgit mergetoolgit rebase --continue

編集:リベースは履歴を変更するためです。ゲリットがこれにどう反応するかはわかりません。たとえば、強制フラグを追加しようとすることもできますがgit push -f、これは履歴が変更されるため危険であることを忘れないでください。

于 2012-08-14T14:38:33.640 に答える