ブランチ上でコミットを移動させると、できるだけ早く競合が起こらないようにするにはどうしたらいいですか? CとDとXを交換するコンフリクトを有さないが、BとXを交換することは、競合を生じる場合git - できるだけ早く矛盾のないブランチでコミットを再実行する
Egが
A-B-C-D-X
は
A-B-X-C-D
なるはずです。
ありがとうございました。
ブランチ上でコミットを移動させると、できるだけ早く競合が起こらないようにするにはどうしたらいいですか? CとDとXを交換するコンフリクトを有さないが、BとXを交換することは、競合を生じる場合git - できるだけ早く矛盾のないブランチでコミットを再実行する
Egが
A-B-C-D-X
は
A-B-X-C-D
なるはずです。
ありがとうございました。
これはかなり機能しますが、クリーンアップが必要です。
しばらくの間作業した後、私はhereという投稿した別の問題にぶつかりました。
#!/bin/sh -e # todo: integrate with git GIT_DIR=./.git/ commitid=$1 if [ "$1" = "" ]; then echo usage: $0 commitid exit 1 fi tmpdir="$GIT_DIR/bubble-work" /bin/rm -rf "$tmpdir" mkdir "$tmpdir" # checkout commit with detached head git checkout -q $commitid^0 || die "could not detach HEAD" while [ 1 = 1 ]; do # todo pipe output to avoid temp files # see git-rebase.sh patchfile=`git format-patch -k --full-index --src-prefix=a/ --dst-prefix=b/ --no-renames -o "$tmpdir" HEAD~1` echo patch = $patchfile git checkout -q HEAD~2 git am --rebasing "$patchfile" || die "git am failed" /bin/rm -f "$patchfile" echo looping done /bin/rm -rf "$tmpdir"
git rebase -i X~
を使用してください。X~
は、X
より前のリビジョンです。
次に、リベースログ内の行を希望の順序に並べ替えます。
ブランチに何百ものコミットがあるので、私は自動化された方法で(rebase -iではなく)実行する必要があります。また、私の希望する注文は事前に知られていません。 – CoderBrien
私が誤解しない限り、これは編集ファイルのXコミットだけを表示します。 – toddsundsted
@toddsundsted私は 'X'が最も早いコミットであると仮定したので、' X..HEAD'を表示するはずです。 – m0tive
ここでは、15分のハッキングの後に私が思いついたことのデモンストレーションがあります。これは、問題が発生した場合の完全な解決策ではありませんが、関連する作業を減らす必要があります。
目的は、git bisect
を使用して、将来のコミットのための最も早い競合のないマージポイントを見つけることです。この解決策は、ステップを削減するためにgit bisect
に固有のバイナリ検索機能を利用しています。
残念ながら、このは、後で矛盾することを避けるため、結果を検証するために対話型のリベースが必要です(しかし、それは要点です)。
パッチをテストするときにステップが失敗したかどうかについてgitに指示するときに、good
とbad
の感覚を逆にしなければならないという欠点があります。
以下の手順のいずれかが不明な場合は、教えてください。私は詳しく説明します。
まず、次のファイルを一連のコミットで作成します。それぞれのコミットは、一連の4つの同一の行を追加する必要があります(a、b、c、ds)。この時点で
a
a
a
a
b
b
b
b
c
c
c
c
d
d
d
d
、git log
のような何かを出力する必要があります
commit 6f2b809863632a86cc0523df3a4bcca22cf5ab17
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:45:44 2011 -0500
Added d.
commit 91ba7e6f19db74adb6ce79e7b85ea965788f6b88
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:44:26 2011 -0500
Added c.
commit f83beee55d6e060536584852ebb55c5ac3b850b2
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:44:00 2011 -0500
Added b.
commit d6d924b0a30a9720f6e01dcc79dc49097832a587
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:43:38 2011 -0500
Added a.
commit 74d41121470108642b1a5df087bc837fdf77d31c
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:43:11 2011 -0500
Initial commit.
は、今では、以下が含まれるように、ファイルを編集し、このコミット:ログを
a
a
a
a
b
x
x
b
c
x
x
c
d
d
d
d
をすべき今度はコミットを1つ追加します:
commit 09f247902a9939cb228b580d39ed2622c3211ca6
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:46:36 2011 -0500
Replaced a few lines with x.
X
コミット用のパッチを生成します。
git diff -p master~ > x.patch
アップbisect
クランクは - パッチが成功したときにパッチが失敗し、git bisect bad
ときgit bisect good
を使用することを忘れないでください:
$ git bisect start
$ git bisect good 74d41121470108642b1a5df087bc837fdf77d31c
$ git bisect bad master
Bisecting: 2 revisions left to test after this (roughly 1 step)
[f83beee55d6e060536584852ebb55c5ac3b850b2] Added b.
$ patch --dry-run -p1 < x.patch
patching file file.txt
Hunk #1 FAILED at 3.
1 out of 1 hunk FAILED -- saving rejects to file file.txt.rej
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 1 step)
[6f2b809863632a86cc0523df3a4bcca22cf5ab17] Added d.
$ patch --dry-run -p1 < x.patch
patching file file.txt
$ git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[91ba7e6f19db74adb6ce79e7b85ea965788f6b88] Added c.
$ patch --dry-run -p1 < x.patch
patching file file.txt
Hunk #1 succeeded at 3 with fuzz 2.
$ git bisect bad
91ba7e6f19db74adb6ce79e7b85ea965788f6b88 is the first bad commit
commit 91ba7e6f19db74adb6ce79e7b85ea965788f6b88
Author: Todd Sundsted <...>
Date: Tue Dec 20 22:44:26 2011 -0500
Added c.
$ git bisect reset
予想したように、内編集はX
がC
をコミット直後に移動することができますコミット。対話型のリベースによって、これは次のように確認されます。
91e92489 * Added d.
6c082b1f * Replaced a few lines with x.
a60ae2a9 * Added c.
4d5e78f2 * Added b.
7d2ff759 * Added a.
74d41121 * Initial commit.
試してくれてありがとう。私はすぐに解決できると思っています。ループ内で 'git format-patch'と' git am'を使うスクリプトを書いて、ブランチを後方に歩き、 'git am'がどこで失敗するかを見てみましょう。うまくいけば:-)。 – CoderBrien
面白い問題。履歴内のポイントを見つけることが自動化され、競合が発生しなくても、結果ファイルが正しくコンパイルされ、正しく実行されることは保証されません。 – toddsundsted
結果の先頭のツリーは、クリーンコミットのリオーダが意味することを誤解していますか? – CoderBrien
大丈夫ですよね...あなたは頭を考えています。私は歴史の初期の点、具体的にはXの新しい場所(Dではない)のビルドの状態での変更の影響について考えていました – toddsundsted