Choose Git merge strategy for specific files (“ours”, “mine”, “theirs”)

后端 未结 3 1979
感情败类
感情败类 2020-11-29 15:00

I am in the middle of rebasing after a git pull --rebase. I have a few files that have merge conflicts. How can I accept \"their\" changes or \"my\" changes f

相关标签:
3条回答
  • 2020-11-29 15:44

    For each conflicted file you get, you can specify

    git checkout --ours -- <paths>
    # or
    git checkout --theirs -- <paths>
    

    From the git checkout docs

    git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

    --ours
    --theirs
    When checking out paths from the index, check out stage #2 (ours) or #3 (theirs) for unmerged paths.

    The index may contain unmerged entries because of a previous failed merge. By default, if you try to check out such an entry from the index, the checkout operation will fail and nothing will be checked out. Using -f will ignore these unmerged entries. The contents from a specific side of the merge can be checked out of the index by using --ours or --theirs. With -m, changes made to the working tree file can be discarded to re-create the original conflicted merge result.

    0 讨论(0)
  • 2020-11-29 15:47

    Note that git checkout --ours|--theirs will overwrite the files entirely, by choosing either theirs or ours version, which might be or might not be what you want to do (if you have any non-conflicted changes coming from the other side, they will be lost).

    If instead you want to perform a three-way merge on the file, and only resolve the conflicted hunks using --ours|--theirs, while keeping non-conflicted hunks from both sides in place, you may want to resort to git merge-file; see details in this answer.

    0 讨论(0)
  • 2020-11-29 15:57

    Even though this question is answered, providing an example as to what "theirs" and "ours" means in the case of git rebase vs merge. See this link

    Git Rebase
    theirs is actually the current branch in the case of rebase. So the below set of commands are actually accepting your current branch changes over the remote branch.

    # see current branch
    $ git branch
    ... 
    * branch-a
    # rebase preferring current branch changes during conflicts
    $ git rebase -X theirs branch-b
    

    Git Merge
    For merge, the meaning of theirs and ours is reversed. So, to get the same effect during a merge, i.e., keep your current branch changes (ours) over the remote branch being merged (theirs).

    # assuming branch-a is our current version
    $ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
    
    0 讨论(0)
提交回复
热议问题