Is there a way to do a git pull that ignores any local file changes without blowing the directory away and having to perform a git clone?
16 Answers
If you mean you want the pull to overwrite local changes, doing the merge as if the working tree were clean, well, clean the working tree:
git reset --hard git pull If there are untracked local files you could use git clean to remove them.
git clean -fto remove untracked files-dfto remove untracked files and directories-xdfto remove untracked or ignored files or directories
If on the other hand you want to keep the local modifications somehow, you'd use stash to hide them away before pulling, then reapply them afterwards:
git stash git pull git stash pop I don't think it makes any sense to literally ignore the changes, though - half of pull is merge, and it needs to merge the committed versions of content with the versions it fetched.
13 Comments
git reset your files still differ from the remote, read stackoverflow.com/questions/1257592/…git reset --hard affects the former, not the latter. If you want to fully reset to the remote's state, git reset --hard origin/<branch> - but often and in this case, those two commits you're ahead of origin by are work you did, not something you want to throw away.For me the following worked:
First fetch all changes:
$ git fetch --allThen reset the master:
$ git reset --hard origin/masterNote - For users of github, "master" was replaced with "main" in October 2020. For projects created since then you may need to use "main" instead, like:
$ git reset --hard origin/mainPull/update:
$ git pull
10 Comments
You just want a command which gives exactly the same result as rm -rf local_repo && git clone remote_url, right? I also want this feature. I wonder why git does not provide such a command (such as git reclone or git sync), neither does svn provide such a command (such as svn recheckout or svn sync).
Try the following command:
git reset --hard origin/master git clean -fxd git pull 3 Comments
git clean -fxd removes files from .gitignore also.The command bellow wont work always. If you do just:
$ git checkout thebranch Already on 'thebranch' Your branch and 'origin/thebranch' have diverged, and have 23 and 7 different commits each, respectively. $ git reset --hard HEAD is now at b05f611 Here the commit message bla, bla $ git pull Auto-merging thefile1.c CONFLICT (content): Merge conflict in thefile1.c Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. and so on...
To really start over, downloading thebranch and overwriting all your local changes, just do:
$ git checkout thebranch $ git reset --hard origin/thebranch This will work just fine.
$ git checkout thebranch Already on 'thebranch' Your branch and 'origin/thebranch' have diverged, and have 23 and 7 different commits each, respectively. $ git reset --hard origin/thebranch HEAD is now at 7639058 Here commit message again... $ git status # On branch thebranch nothing to commit (working directory clean) $ git checkout thebranch Already on 'thebranch' 3 Comments
git clean -fxdgit-clean - Remove untracked files from the working tree, as this affects "untracked files", not exactly what OP asked for. But ok, good to be here in the comment, just in case someone wants to also remove untracked files.The shortest way to do it is:
git pull --rebase --autostash 2 Comments
--autostash parameter does exactly what I need. Thanks!I usually do:
git checkout . git pull In the project's root folder.
3 Comments
git add -A git stashThis worked for me:
git fetch --all git reset --hard origin/master git pull origin master With the accepted answer, I get conflict errors.
5 Comments
git clean -fxdIf you are on a branch, and want to discard any local changes on the branch and pull the remote branch, but encounter Your branch and 'origin/<branch_name>' have diverged, it can be resolved while staying on the branch by:
git fetch --all git reset --hard origin/<branch_name> 2 Comments
Look at git stash to put all of your local changes into a "stash file" and revert to the last commit. At that point, you can apply your stashed changes, or discard them.
Comments
If you are on Linux:
git fetch for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done git pull The for loop will delete all tracked files which are changed in the local repo, so git pull will work without any problems.
The nicest thing about this is that only the tracked files will be overwritten by the files in the repo, all other files will be left untouched.
3 Comments
This will fetch the current branch and attempt to do a fast forward to master:
git fetch && git merge --ff-only origin/master 1 Comment
.gitignore
"Adding unwanted files to .gitignore works as long as you have not initially committed them to any branch. "
Also you can run:
git update-index --assume-unchanged filename https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html
Comments
git pull will give error if we change any thing in any files in our local system, So we need to git stash
git pull I got the message - error: Your local changes to the following files would be overwritten by merge: Please commit your changes or stash them before you merge. Aborting
git stash Saved working directory and index state WIP on ....
git pull Updating... 10 files changed, 291 insertions(+), 169 deletions(-)
rm -rf local_repo && git clone remote_url.