How do I force "git pull" to overwrite local files?
⚠ Warning:
Any uncommitted local changes to tracked files will be lost.
Any local files that are not tracked by Git will not be affected.
First, update all origin/<branch>
refs to latest:
git fetch --all
Backup your current branch (e.g. master
):
git branch backup-master
Jump to the latest commit on origin/master
and checkout those files:
git reset --hard origin/master
Explanation:
git fetch
downloads the latest from remote without trying to merge or rebase anything.
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
WARNING: git clean
deletes all your untracked files/directories and can't be undone.
Sometimes just clean -f
does not help. In case you have untracked DIRECTORIES, -d option also needed:
# WARNING: this can't be undone!
git reset --hard HEAD
git clean -f -d
git pull
WARNING: git clean
deletes all your untracked files/directories and can't be undone.
Consider using -n
(--dry-run
) flag first. This will show you what will be deleted without actually deleting anything:
git clean -n -f -d
Example output:
Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
This will remove all uncommitted changes and then pull:
git reset --hard HEAD
git pull