How to merge all files manually in Git?

I want to merge all files manually with meld or any other diff tool, how can I do this with Git?
When I run git mergetool it says no files need merging. So I suppose I can do it only if I have conflicts.


Solution 1:

There is much simpler way:

git merge --no-commit merge_branch

As man says:

With --no-commit perform the merge but pretend the merge failed and do not autocommit, to give the user a chance to inspect and further tweak the merge result before committing.

Solution 2:

I had a scenario where:

git merge --no-commit merge_branch 

just caused a Fast Forward.

If this happens you can use:

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

and then you'll be able to review your changes

Solution 3:

A similar question is How to prevent an automerge using git?

FractalSpace gave an answer which I think useful:

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

The idea is using difftools instead of auto-merging tools to manually pick what you need and create new files.

Solution 4:

For anyone who just needs to micromanage a merge, jump to the Hybrid section below.

For anyone who is wondering about the difference between @True's answer using git difftool and the other answers that use git merge, see Git mergetool vs difftool.

Here are more details:

Difftool

If you have git configured to use a modern diff.tool such as kdiff3, meld, or vimdiff, you'll be able to manually merge using that diff tool, and the command line can be simple:

git difftool other_branch

...this will let you do a two-way manual merge between your current branch and other_branch (described as $LOCAL and $REMOTE in man git-config).

Mergetool

The "correct" way the other answers discuss would be to instead configure git to use e.g. kdiff3 or vimdiff as your merge.tool, and use:

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

...this command can do an N-way manual merge between $BASE, $LOCAL, and $REMOTE, into $MERGED. See https://stackoverflow.com/a/2235841/1264797 for one example of how to configure git. You many not need to configure the mergetool.*.cmd entry at all if you use one of the tools git already knows about. (Meld can only show three panes, so if you use meld with the default settings, you'll not see $BASE.)

Difftool vs mergetool

Someone might jump in to correct me, but the main differences between the above difftool and mergetool techniques seem to be:

  • mergetool can do an N-way merge if configured accordingly
  • mergetool adds other_branch as a parent on the new commit so history works correctly
  • difftool lets you manually see and select each and every changed line, but you lose the above two benefits of mergetool

Hybrid -- best of both worlds

A method that combines merging and diffing would look something like this:

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

...this does the N-way merge to resolve conflicts and make history work right, and then shows you the complete set of diffs so you can review and tweak before you commit.