2011-12-20 3 views
4

ブランチ上でコミットを移動させると、できるだけ早く競合が起こらないようにするにはどうしたらいいですか? CとDとXを交換するコンフリクトを有さないが、BとXを交換することは、競合を生じる場合git - できるだけ早く矛盾のないブランチでコミットを再実行する

Egが

A-B-C-D-X

A-B-X-C-D

なるはずです。

ありがとうございました。

+0

面白い問題。履歴内のポイントを見つけることが自動化され、競合が発生しなくても、結果ファイルが正しくコンパイルされ、正しく実行されることは保証されません。 – toddsundsted

+0

結果の先頭のツリーは、クリーンコミットのリオーダが意味することを誤解していますか? – CoderBrien

+0

大丈夫ですよね...あなたは頭を考えています。私は歴史の初期の点、具体的にはXの新しい場所(Dではない)のビルドの状態での変更の影響について考えていました – toddsundsted

答えて

0

これはかなり機能しますが、クリーンアップが必要です。

しばらくの間作業した後、私は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" 

2

git rebase -i X~を使用してください。X~は、Xより前のリビジョンです。

次に、リベースログ内の行を希望の順序に並べ替えます。

More about interactive rebase

+0

ブランチに何百ものコミットがあるので、私は自動化された方法で(rebase -iではなく)実行する必要があります。また、私の希望する注文は事前に知られていません。 – CoderBrien

+0

私が誤解しない限り、これは編集ファイルのXコミットだけを表示します。 – toddsundsted

+0

@toddsundsted私は 'X'が最も早いコミットであると仮定したので、' X..HEAD'を表示するはずです。 – m0tive

2

ここでは、15分のハッキングの後に私が思いついたことのデモンストレーションがあります。これは、問題が発生した場合の完全な解決策ではありませんが、関連する作業を減らす必要があります。

目的は、git bisectを使用して、将来のコミットのための最も早い競合のないマージポイントを見つけることです。この解決策は、ステップを削減するためにgit bisectに固有のバイナリ検索機能を利用しています。

残念ながら、このは、後で矛盾することを避けるため、結果を検証するために対話型のリベースが必要です(しかし、それは要点です)。

パッチをテストするときにステップが失敗したかどうかについてgitに指示するときに、goodbadの感覚を逆にしなければならないという欠点があります。

以下の手順のいずれかが不明な場合は、教えてください。私は詳しく説明します。

まず、次のファイルを一連のコミットで作成します。それぞれのコミットは、一連の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 

予想したように、内編集はXCをコミット直後に移動することができますコミット。対話型のリベースによって、これは次のように確認されます。

91e92489 * Added d. 
6c082b1f * Replaced a few lines with x. 
a60ae2a9 * Added c. 
4d5e78f2 * Added b. 
7d2ff759 * Added a. 
74d41121 * Initial commit. 
+0

試してくれてありがとう。私はすぐに解決できると思っています。ループ内で 'git format-patch'と' git am'を使うスクリプトを書いて、ブランチを後方に歩き、 'git am'がどこで失敗するかを見てみましょう。うまくいけば:-)。 – CoderBrien

関連する問題