Gerritとそのプロセスの使い方をまだ学ぼうとしています。私が行った手順
change1
をgerritにプッシュして、HEAD:refs/for/developにレビューします。change2
を押してgerritに移動し、HEAD:refs/for/developにレビューします。両方のコミットにgerritChange-ID行があります
だから今私はchange1
の問題に対処したいので
git checkout -b change1 <change 1's commit id>
変更を加えてコミットしました(コミットメッセージにChange-IDを追加します)
git add .
git commit
今私がするとき
git Push Origin HEAD:refs/for/develop
私は得る
! [remote rejected] HEAD -> refs/for/develop (squash commits first)
error: failed to Push some refs to 'ssh://[email protected]:29418/CommunicationsLibrary'
積み重ねられたレビューの問題を修正し、さらに別のレビューを作成せずにgerritに投稿するにはどうすればよいですか?
Gerritに依存レビューがある場合(つまり、同時にレビューされている以前の変更に依存するレビューの1つの変更)、以前の変更に変更を加える必要がある場合は、両方の変更を効果的に再送信する必要があります( 2番目の変更は、別の「親」コミットに依存するようになります)
したがって、次のように、メインの開発ブランチから離れた1つのブランチに2つのコミットがあるという状況になります。
o master
\
o Commit A (in review, requires change)
o Commit B (in review, no changes required)
この状況で私が一般的に行うことは、3番目のコミットでコミットAに要求された変更を行うことです。コミットグラフは次のようになります。
o master
\
o Commit A (in review, requires change)
o Commit B (in review, no changes required)
o Commit C (modifications to Commit A)
今私がやります git rebase -i master
そしてコミットCをコミットAの後、コミットBの前に並べ替えてから、コミットAに押しつぶします。コミットグラフは次のようになります。
o master
\
o Commit A' (Commit A, incorporating the changes from Commit C)
o Commit B' (the same changes made in Commit B, but applied to Commit A' instead of A)
最後に、 git review
(またはgerritへの変更を送信するために使用するコマンド)を使用して、両方のコミットをGerritに再送信します。
このような複雑さのために、ほとんどの人は、依存する変更がレビューされているこのような状況に対処する必要があるのではなく、Gerritに送信する前に、個別のブランチでそれぞれの個別の変更に取り組み、単一のコミットに押しつぶすことを強くお勧めします同時に。
あなたの問題は、1番目のコミットの修正に2番目のコミットが依存関係として含まれているという事実に関連していると思います。これは私が個人的に行うことですが、もっと良い方法があるかもしれません。コミットの方法をリベースしたいので、最後の3を処理しているように見えます。したがって、「git rebase -iHEAD〜3」を実行します。これにより、順序を切り替えるか、それらを相互にマージすることで、最後の3つのコミットをリベースできます。コミットが最も古いものから順にリストされていることに注意してください。次に例を示します。
gitログは次のとおりです。
コミット情報:....。
メッセージ:foo2
コミット情報:....。
メッセージ:bar1
コミット情報:....。
メッセージ:foo1
上記のコマンドを実行すると、エディターに次のメッセージが表示されます。
foo1を選択します。
bar1を選択します。
foo2を選択します。
(これは、2番目のfooの変更で、bar1が変更したファイルが変更されなかったと想定しています。これは機能しない可能性があるためです。変更した場合は、とにかくコミットを修正する必要があります。)次に、リストを次のように変更します。
foo1を選ぶ
修正foo2
ピックバー1
その後、foo1とfoo2が1つのコミットに押しつぶされ、bar1が次のコミットになります。次に、「git reset --soft HEAD〜1」を実行して最新のコミットをリセットし、続いて「git commit --amend」を実行して、最初のレビューのコミットメッセージを変更し、change-idを含めるようにします。 。次に、プッシュを試してください。その後、新しいパッチを設定する必要があります。2番目に変更されたすべてのファイルが変更され、作業ディレクトリに残ります。
状況は@Trevorが説明したのとまったく同じです。 rebase -i
は、この状態にあるときに行うのに適した方法です。
個人的には、このコマンドも使用しますが、少し異なります。
1。 --fixupと--autosquashを使用します
2つのコミットがあります:
old commit
new commit
古いコミットを変更したいときは、
git commit --fixup <old_commit_id>
次に、オートスカッシュでリベースします。
git rebase -i --autosquash <commit_id_before_old_commit>
私のコメントが不明な場合は、次のURLで詳細を確認できます: https://fle.github.io/git-tip-keep-your-branch-clean-with-fixup-and-autosquash.html
[〜#〜]または[〜#〜]
2。 Gerritを活用する
2つの変更をコミットすると、GUIで2つのopen-reviewsの変更が行われます。
次に、「古い変更」に移動し、ダウンロード->この変更をチェックアウトします。実際にチェックアウトした後、この変更のブランチに移動します。次に、コードを修正し、修正し、リベースし、プッシュします...いつものように。
git commit --amend then gitreview
コール
commit --ammend
代わりに2回目の変更