3

数週間触れていなかった機能ブランチをリベースする前は、マスターより25コミット進んでいました。リベース後、18コミットになりました。途中で解決しなければならなかったいくつかの対立がありました。おそらく正確に7。

この番号が変わる原因は何ですか?途中で発見され、NOOPコミットに変わったチェリーピック?上記の紛争解決?

4

2 に答える 2

4

これが発生する可能性のある方法はいくつかあります。これは完全なリストではありませんが、これがどのように発生するかについてのアイデアを提供する必要があります。

1.厳選されたコミット

最初に、あなたはあなたのブランチからのコミットがあなたがリベースしている上流のブランチにチェリーピックされた可能性に言及します:これを確認するためgit rebaseに、不一致の一部を説明するかもしれないそのようなコミットをスキップします。この質問に対するVonCの回答には、それ以上のことがあります。

2.競合は正確にアップストリームバージョンに解決されました

私の最初の疑いは、リベースして競合が発生したときに、変更ではなくアップストリームバージョンを選択することで常に競合を解決したということでした。(これがベルを鳴らさない場合、私の疑いはおそらく完全に間違っています:))そのコミットによって導入された他の競合しない変更がなかった場合、競合解決はツリーを同じにするだけです変更からパッチを適用しようとする前と同じように、コミットするものはありません。

残念ながら、これが発生したときにgitが表示するプロンプトは、かなり混乱する可能性があります。git1.7.1で表示される例を次に示します。まず、origin/masterからまだマージされていない変更と競合する変更をコミットします。

$ git commit
[master 1efa20f] Add a change designed to conflict
 1 files changed, 1 insertions(+), 1 deletions(-)

...リベースを開始します:

$ git rebase origin/master 
First, rewinding head to replay your work on top of it...
Applying: Add a change designed to conflict
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
CONFLICT (content): Merge conflict in src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
Failed to merge in the changes.
Patch failed at 0001 Add a change designed to conflict

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

対立が何であったかを見てください:

$  git diff
diff --cc src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
index 36ec046,f4841ec..0000000
--- a/src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
+++ b/src-plugins/3D_Viewer/ij3d/Image3DUniverse.java
@@@ -264,7 -264,7 +264,11 @@@ public class Image3DUniverse extends De
        public void cleanup() {
                timeline.pause();
                removeAllContents();
++<<<<<<< HEAD
 +              contents.clear();
++=======
+               contents.clear(); // A change designed to conflict
++>>>>>>> Add a change designed to conflict
                universes.remove(this);
                adder.shutdownNow();
                executer.flush();

アップストリームのバージョンが好きだと判断したので、ファイルを編集して解決します。

$  vim src-plugins/3D_Viewer/ij3d/Image3DUniverse.java

その競合の解決を段階的に行います。

$ git add src-plugins/3D_Viewer/ij3d/Image3DUniverse.java

次に、通常どおりリベースを続行してみます。

$ git rebase --continue
Applying: Add a change designed to conflict
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

gitの最近のバージョンでは、すでに存在していたものへのコミットを解決した可能性があり、実行していることを検討する必要があることを示唆していると思いますgit rebase --skip。ただし、通常、人々はそれがとにかくこの状況から抜け出す唯一の方法であると考えています。

$  git rebase --skip
HEAD is now at f3a2de3 3D Viewer: Avoid NPE when closing the viewer window.
Nothing to do.

そのコミットはに表示されなくなりますgit log

3.コミットをマージします

以下のコメントで、後で2つのブランチを調べるときにいくつかのマージコミットが表示されたと述べています。これは、git rebaseコミットのリストをアップストリームに再適用する準備をするときにデフォルトでマージコミットを無視するため、コミットが欠落する原因になる可能性もあります。

于 2011-02-16T06:30:15.917 に答える
1

Jefromiのコメントを少し拡張するために、withの出力を比較して、git log --pretty=oneline -n18 <branch>どのgit log --pretty=oneline -n25 <branch>@{1}コミットが欠落しているかを確認できます。git reflog彼が述べたように、どのエントリがリベース前のブランチヘッドであるかを判断するために何らかの作業を行った場合は、少し使用する必要があるかもしれません。

于 2011-02-16T07:40:17.547 に答える