How do I force “git pull” to overwrite local files?

前端 未结 30 3431
失恋的感觉
失恋的感觉 2020-11-21 11:35

How do I force an overwrite of local files on a git pull?

The scenario is the following:

  • A team member is modifying the t
相关标签:
30条回答
  • 2020-11-21 12:07

    Instead of doing:

    git fetch --all
    git reset --hard origin/master
    

    I'd advise doing the following:

    git fetch origin master
    git reset --hard origin/master
    

    No need to fetch all remotes and branches if you're going to reset to the origin/master branch right?

    0 讨论(0)
  • 2020-11-21 12:07

    I believe there are two possible causes of conflict, which must be solved separately, and as far as I can tell none of the above answers deals with both:

    • Local files that are untracked need to be deleted, either manually (safer) or as suggested in other answers, by git clean -f -d

    • Local commits that are not on the remote branch need to be deleted as well. IMO the easiest way to achieve this is with: git reset --hard origin/master (replace 'master' by whatever branch you are working on, and run a git fetch origin first)

    0 讨论(0)
  • I know of a much easier and less painful method:

    $ git branch -m [branch_to_force_pull] tmp
    $ git fetch
    $ git checkout [branch_to_force_pull]
    $ git branch -D tmp
    

    That's it!

    0 讨论(0)
  • 2020-11-21 12:07

    I have a strange situation that neither git clean or git reset works. I have to remove the conflicting file from git index by using the following script on every untracked file:

    git rm [file]
    

    Then I am able to pull just fine.

    0 讨论(0)
  • 2020-11-21 12:08

    Like Hedgehog I think the answers are terrible. But though Hedgehog's answer might be better, I don't think it is as elegant as it could be. The way I found to do this is by using "fetch" and "merge" with a defined strategy. Which should make it so that your local changes are preserved as long as they are not one of the files that you are trying to force an overwrite with.

    First do a commit of your changes

     git add *
     git commit -a -m "local file server commit message"
    

    Then fetch the changes and overwrite if there is a conflict

     git fetch origin master
     git merge -s recursive -X theirs origin/master
    

    "-X" is an option name, and "theirs" is the value for that option. You're choosing to use "their" changes, instead of "your" changes if there is a conflict.

    0 讨论(0)
  • 2020-11-21 12:10

    ⚠ Important: If you have any local changes, they will be lost. With or without --hard option, any local commits that haven't been pushed will be lost.[*]

    If you have any files that are not tracked by Git (e.g. uploaded user content), these files will not be affected.


    First, run a fetch to update all origin/<branch> refs to latest:

    git fetch --all
    

    Backup your current branch:

    git checkout -b backup-master
    

    Then, you have two options:

    git reset --hard origin/master
    

    OR If you are on some other branch:

    git reset --hard origin/<branch_name>
    

    Explanation:

    git fetch downloads the latest from remote without trying to merge or rebase anything.

    Then the git reset resets the master branch to what you just fetched. The --hard option changes all the files in your working tree to match the files in origin/master


    Maintain current local commits

    [*]: It's worth noting that it is possible to maintain current local commits by creating a branch from master before resetting:

    git checkout master
    git branch new-branch-to-save-current-commits
    git fetch --all
    git reset --hard origin/master
    

    After this, all of the old commits will be kept in new-branch-to-save-current-commits.

    Uncommitted changes

    Uncommitted changes, however (even staged), will be lost. Make sure to stash and commit anything you need. For that you can run the following:

    git stash
    

    And then to reapply these uncommitted changes:

    git stash pop
    
    0 讨论(0)
提交回复
热议问题