3

タコのマージを実行するときに git merge に指定されたブランチの順序に基づいているように見える予期しない結果がいくつかあります。

次のスクリプトは私の状況を再現します

#!/usr/bin/env bash

rm -rf TEMP

# create area to work in
mkdir TEMP
cd TEMP/
git init

# work on master
echo "hello world" > file
git add file 
git commit -m "initial commit"

# create branch which is at the same point as master
git branch hasnt_moved

# create another branch 1 commit ahead
git checkout -b feature_branch_with_work
echo "some interesting work" > other_file
git add other_file 
git commit -m "work on feature branch"

git checkout master

# always should also have some work ahead of master
git checkout -b always
echo "some work on always" > other_other_file
git add other_other_file 
git commit -m "work on always branch"

# back to master
git checkout master

# now try a merge
#git merge --no-edit --strategy=octopus always hasnt_moved feature_branch_with_work

# however if I had ran this then it would be merged in
#git merge --no-edit --strategy=octopus hasnt_moved always feature_branch_with_work

# I would also expect this to give the same resutls
#git merge --no-edit --strategy=octopus always feature_branch_with_work hasnt_moved

上記のスクリプトを実行した後の私のgitツリーの状態は次のとおりです マージ前のブランチ

最後にコメントアウトされた 3 行が表示されます。以下は各行と、ツリーでそのコマンドを実行した結果のグラフです ( を介して作成されgitk --all、各コマンドを実行した後、 を介して最初に戻ることができますgit reset --hard hasnt_moved) 。

次の 2 つのケースは想定どおりです (分岐引数の順序に注意してください)。

git merge --no-edit --strategy=octopus hasnt_moved always feature_branch_with_work

マージからの期待される結果

git merge --no-edit --strategy=octopus always feature_branch_with_work hasnt_moved

マージからの期待される結果

この最後のケースでは、always ブランチが最終的にマージされた master ブランチに含まれていないため、予期しない結果が生じます (ブランチ引数の順序に注意してください)。

git merge --no-edit --strategy=octopus always hasnt_moved feature_branch_with_work

マージの実際の結果

マージを 1 つずつ実行すると、期待どおりの結果が得られます。

git merge --no-edit --strategy=octopus always
git merge --no-edit --strategy=octopus hastn_moved
git merge --no-edit --strategy=octopus feature_branch_with_work

期待される結果を与えられた手動の結果

alwaysタコのマージに与えられたコミットの順序によって、ブランチがマスターにマージされないことがあるのはなぜだろうかと思っています。

4

1 に答える 1

0

古い構文に出くわしているようです。git merge以前は次の形式であることがわかりました。

git merge <msg> HEAD <commit>...

従来の理由から、引き続きサポートされています。マージ コマンド:

git merge --no-edit always hasnt_moved feature_branch_with_work

偶然それにつまずきます。この場合always、メッセージとして表示さhasnt_movedれ、HEAD と同じリビジョンです。その結果、git はこのコマンドを次のように扱います。

git merge --no-edit -m "always" feature_branch_with_work

git の以前の構文についてはよくわかりませんが、実際の単語HEADが表示されると予想される場合は、この構文にドロップする前に git をもう少し厳密にする必要があるように思えます。しかし、私はそうであったとは思わない。

-mパラメータを使用してメッセージを明示的に指定することで、これを回避できます。

git merge --no-edit -m "Merge always, hasnt_moved, and feature_branch_with_work"
    \ always hasnt_moved feature_branch_with_work

その後、タコのマージが期待どおりに行われます。

ところで、古い構文はgit mergeマニュアルgit-mergeページで確認できます。

于 2013-09-10T23:23:51.230 に答える