I thought that this approach will bring me where I want to be - easily say which file from which branch I want to keep. When I do git merge tool, there is the correct content just from the 'ours' branch and when I save it, the file disappears from the unmerged list. Do exactly what it is you want to do, Except merge the one branch into the other first. It is the design choice of git authors to give the same name 'ours' to a merge strategy and to an option of merge strategy 'recursive'. You can choose the merge strategy with the --strategy option, or -s for short. This is rare enough that you can ignore it for now.
This means for one file you could use ours, another theirs, and another could be done manually. Resolving conflicts in the middle of a merge As noted above, the semantics of ours and theirs change when being used in a rebase. This colon-and-number syntax works everywhere in Git, while the --ours and --theirs flags only work in git checkout. How can I achieve the same result after the conflicting merge with existing git commands? In our case, branch1's commits are being replayed on top of master. Note also that you can, instead of checking out a branch, check out a specific commit. If git merge is able to do the merge without assistance, it normally runs git commit for you, but the actual commit is still done by running git commit.
It's around this point that Git checks to see if the work-tree file differs from the index entry, too. In fact, it would just create. It compares the changes, line by line, to see if it can combine them. For files where they made a change and you didn't, Git can just take their version. Suppose that, in our conflicted merge, Git has detected that some file was renamed. The contents from a specific side of the merge can be checked out of the index by using --ours or --theirs. Note that when you use this form of the command, Git does not check to make sure you are not overwriting your files.
Your solution is probably the option you're really looking for. The same is, in fact, true of the index as well. Suppose file new does not exist in the merge base and is added in both ours and theirs. Git makes sure this is a safe thing to do, i. This doesn't play nice with submodules however.
I'm assuming that you created a branch off of master and now want to merge back into master, overriding any of the old stuff in master. The tricky question is: just where is Git getting these files? The Git folks have a tendency to let implementation dictate interface. If you forget no damage will be done but you will have to do a hard reset back to A and start all over again. . Aha, you can: you git checkout -- path and Git copies the index version, from slot zero, back to the work-tree. The commit command works the same way as it always does: it turns the index contents into tree objects and writes a new commit.
Could you please provide me some info, how to handle this situation? In some cases, there's more than one suitable merge base. Whenever it does this, it writes the file to slot zero. The same goes for git checkout --theirs: it gets the file from the index slot 3 , and does not resolve anything. A simple diff between the two branches afterwards will show if there are any such files. The checkout command can read from either of the first two places, and always writes the result to the work-tree.
There are some tricky ways to combine squash merges and real merges but they're well out of the scope of this answer. So the below set of commands are actually accepting your current branch changes over the remote branch. Here we are presented with two really handy options Git provides us: ours and theirs. You probably will take a long time to handle all of them if you do it one at a time. But what I want is something like git merge -s theirs. This is how Git knows the file is resolved and ready for a new commit.
In instances that you know that you always want to resolve merge conflicts in the same way, you can choose a merge strategy such as ours or theirs before performing the rebase or merge. To see how this all works internally, and why you need the separate git add except when you don't, read on. If only you could get the work-tree version of the file set back to the version you git add-ed just a moment ago. This, too, extracts from a commit, so it writes to the index, resolving the file. Merge, part 3: finishing the merge Once all files are resolved—all entries are only in the zero-numbered slots—you can git commit the merge result. I am in the middle of rebasing after a git pull --rebase. It does the real merge instead anyway.
In this case, as shown by the last command, we are getting a merge that is perfectly identical to branchB, regardless of whether there would have been conflicts or not. They show up as conflicts if something other than git did the removal. The same is true e. The equivalent which keep parent order to 'git merge -s theirs branchB' Before merge:!!! However, I suspect I'm missing a convenient git command. You can also specify the algorithm to use for a recursive merge patience, minimal, histogram, or myers , but we will not cover those in this post. The merge base version of the file is recorded in slot 1, the --ours version is recorded in slot 2, and the --theirs version is recorded in slot 3. Get the content you want to keep.
Besides, those options can be a little bit tricky in different situations. If the contents are the same, Git can take it easy and just move on to the next file. It does not replace current branch with the content of the merged branch. This ensures branchA will move when doing 'commit --amend'. With that, you want to keep only the changes from your branch, which are referred to by the ours option. This git checkout gets the file from the index—in this case, from index slot 2.