8

'git merge'では、通常はマージの競合ではない場合でも、違いをマージの競合と見なしたいと思います。次に、「git mergetool」を使用して、すべての違いを確認して解決できます。.gitattributesで'*-merge'を指定しようとしましたが、うまくいかなかったようです。

$ git checkout master
Switched to branch 'master'
$ ls
foo.c
$ git merge add-on
Updating a628824..2219552
Fast-forward
  0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar.c
$ cat .gitattributes 
* -merge
$ ls
bar.c   foo.c

上記の「gitmergeadd-on」では、ベースバージョン、ローカルバージョン、リモートバージョンがない「bar.c」のマージの競合が予想されました。[編集]ある回答で示唆されているように、上記ではマージは発生しませんでした。これは、マージを強制したが、それでも望ましいマージの競合がない場合です。

$ git merge --no-ff add-on
Merge made by the 'recursive' strategy.
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bing.c

上記の「bing.c」は実際には空であることに注意してください。ただし、空でないファイルを提供してもマージされるため、これは問題ではありません。[編集2]この結果で--no-commitを試しました:

$ git merge --no-ff --no-commit add-on
Automatic merge went well; stopped before committing as requested
$ git status
# On branch master
# Changes to be committed:
#
#   new file:   boom.c
#
$ git mergetool
No files need merging
$ cat .gitattributes 
* -merge

私は何が欠けていますか?'.gitattributes'が使用/読み取りされていることを確認する方法はありますか?

4

3 に答える 3

6

あなたは合併しませんでした。コマンドgit merge add-onは「早送り」を実行しました。これは、ブランチヘッドを移動しただけであることを意味します。これは、add-onブランチがすでにブランチの先端から派生しているmasterため、マージは必要ありませんでした。実行するgit logと、マージコミットがないことがわかります。

基本的に、マージ前は次のようになりました。

              master
             /
o---o---o---o           add-on
             \         /
              o---o---o

マージにより、masterポインタが行の終わりに移動しました。

                          master, add-on
                         /
o---o---o---o---o---o---o

マージを強制する場合は、の--no-ffようにフラグを渡しgit merge --no-ff add-onます。


さらに考えてみると、merge属性はあなたが望むことをしません。これはファイルレベルのマージにのみ適用されます。つまり、マージの両側で特定のファイルに変更が加えられます。片側だけに変更がある場合(これはあなたの場合です)、ファイルレベルのマージは行われず、変更されたファイルは無条件に受け入れられます。

最善の策は、おそらくgit merge --no-ff --no-commit add-onマージを生成するために使用することですが、実際にはコミットしないでください。これで、マージをコミットする前に、結果を調べて満足のいくように調整できます。ハンクごとに変更を受け入れたい場合はgit reset、インデックスをリセットしてから、git add -pハンクごとのステージングを実行するなどの操作を実行できます。

于 2012-04-12T20:53:54.540 に答える
3

あなたは試してみたいかもしれません:

git merge --no-commit

これにより、GITはマージの変更をコミットしなくなります。または、競合がないときにコミットしたいが、ソースブランチを失わないようにしたい場合は、no-ffです。

git merge --no-ff

必要に応じて両方を使用できます。

詳細はこちら:gitがデフォルトでマージを早送りするのはなぜですか?

于 2012-04-12T20:55:06.857 に答える
2

私も同じような願望を持っており、自動ツールではそれを行うことができませんでした。半自動化されたソリューションは次のとおりです。

からmaster、変更をマージadd-onして手動で解決します。

皮切りに:

git merge --no-ff --no-commit add-on

次に、変更されたファイルごとに次の手順を実行します。

git show master:path/to/file > from_master
git show add-on/to/file > from_add-on
kdiff3 --qall from_master from_add-on -o path/to/file
git add path/to/file

ついに、

git commit

なぜこの90%のソリューションなのですか?

このソリューションは「明らかな状況」でもマージし、.gitattributesを設定する必要がないため、マージするファイルではなく、マージ元のユーザーと理由に応じて「手動マージ」動作を実行できます。

于 2014-04-16T21:21:35.680 に答える