web-dev-qa-db-ja.com

Gitですべてのファイルを手動でマージする方法は?

すべてのファイルをマージしたい手動 meldまたは他のdiffツールで、Gitでこれを行うにはどうすればよいですか?
実行時git mergetoolno files need merging。だから、私は衝突がある場合にのみできると思います。

59
gennad

もっと簡単な方法があります:

git merge --no-commit merge_branch

男が言うように:

--no-commitマージを実行しますが、マージが失敗するふりをし、自動コミットしないで、ユーザーがコミットする前にマージ結果を検査し、さらに微調整する機会を与えます。

95
skywinder

次のようなシナリオがありました。

git merge --no-commit merge_branch 

早送りしました。

この場合、次を使用できます。

git merge --no-commit --no-ff merge_branch

その後、変更を確認できるようになります

40
NSjonas

同様の質問は gitを使用して自動マージを防ぐ方法? です。

FractalSpaceは私が役に立つと思う答えを与えました:

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD

アイデアは、自動マージツールの代わりにdifftoolsを使用して、必要なものを手動で選択し、新しいファイルを作成することです。

18
True

(おそらく特定のクラスのファイルに対して)手動でマージする場合、merge driverを定義できることに注意してください。
Git-選択したファイルでマージ競合と手動マージを強制する方法 」の具体例があります。

そのようにして、マージドライバースクリプトは、必要なマージツールを呼び出すことができます。

7
VonC

ここに来て、git difftoolを使用する@Trueの回答とgit mergeを使用する他の回答の違いについて疑問に思っている人は、 Git mergetool vs difftool を参照してください。

要するに、kdiff3、meld、vimdiffなどの最新のdiff.toolを使用するようにgitを構成している場合、diffツール自体を使用して異なるファイルを手動でマージでき、コマンドラインは簡単になります。

git difftool other_branch

...これにより、現在のブランチとother_branch(man git-configで$ LOCALおよび$ REMOTEとして説明)との間で双方向の手動マージを実行できます。

他の答えが議論する「正しい」方法は、代わりに、例えばmerge.toolとしてkdiff3またはvimdiffを使用し、以下を使用します。

git merge --no-commit --no-ff other_branch
git mergetool

...このコマンドは、$ BASE、$ LOCAL、および$ REMOTEから$ MERGEDへのN方向の手動マージを実行できます。 gitの設定方法の一例については、 https://stackoverflow.com/a/2235841/1264797 をご覧ください。 gitがすでに知っているツールのいずれかを使用する場合、mergetool.*.cmdエントリを設定する必要はほとんどありません。 (Meldは3つのペインのみを表示できるため、デフォルト設定でmeldを使用すると、$ BASEは表示されません。)

誰かが私を修正するために飛び込むかもしれませんが、N-wayマージ機能以外では、2つの方法は同じ結果を生成するように見えます。 difftoolmergetoolも新しいコミットにother_branchを親として追加しないため、どちらの場合も、マージは明らかではありません。 gitkをコミットメッセージに記載する必要があります(後で通知する必要があります)。

3
stevegt

私は戦略ours(TortoiseGitのピックとしても存在します)を選択します。

From: https://git-scm.com/docs/merge-strategies

マージメカニズム(git mergeおよびgit pullコマンド)を使用すると、バックエンドの 'merge strategy'を-sオプションで選択できます。いくつかの戦略は独自のオプションを取ることもできます。これはgit mergeおよび/またはgit pullに-X引数を与えることで渡すことができます。

ours

これにより、任意の数のヘッドが解決されますが、マージの結果ツリーは常に現在のブランチヘッドのものであり、他のすべてのブランチからのすべての変更を事実上無視します。これは、サイドブランチの古い開発履歴に取って代わるために使用されることを意図しています。これは、「再帰的」マージ戦略の-Xoursオプションとは異なることに注意してください。

しかし、後でBitbucketに表示されるのは謎です。コミットはマージとして認識されますが、実際にはブランチをマージできません(プルリクエストは解決しません)。私はその可視性を持っていないのでログ/エラーメッセージ-git/TortoiseGitはまったく文句を言いません。

0
Tomasz Janicki