750

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?

4
  • 29
    By "ignores" do you mean "overwrites"?
    – Cascabel
    Commented Nov 11, 2010 at 17:21
  • 5
    @Cascabel It means to revert all the local changes, uncommit all the local commits, delete all the local new files and directories, undelete all the locally deleted files and directories, etc. In short, just run a command as if rm -rf local_repo && git clone remote_url.
    – Victor
    Commented Mar 12, 2018 at 8:07
  • 1
    Does this answer your question? How do I force "git pull" to overwrite local files? Commented Dec 4, 2020 at 15:21
  • 2
    11 years later, and I'm still waiting for a simple, reliable way to do this. I loathe "git" so much... it wastes so much of my time. Commented Mar 23, 2022 at 8:41

16 Answers 16

1158

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 -f to remove untracked files
  • -df to remove untracked files and directories
  • -xdf to 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.

11
  • 5
    If after git reset your files still differ from the remote, read stackoverflow.com/questions/1257592/… Commented Aug 30, 2012 at 22:31
  • 4
    Git is the strangest thing ever. Git reset --hard done. Then git status: Your branch is ahead by 2 commits.
    – Shailen
    Commented Mar 8, 2013 at 15:19
  • 49
    @shailenTJ "Local changes" here means uncommitted changes, not local commits. 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.
    – Cascabel
    Commented Mar 8, 2013 at 15:23
  • 3
    So this is the same thing as destroying the local repository and re-downloading, right? I just want to be able to force the pull and overwrite changes for convenience. 99% of the time I get this error message when I've accidentally messed something up locally and just want to start over from the repo.
    – sudo
    Commented Dec 15, 2013 at 19:26
  • 2
    @adelriosantiago Artur's answer also has a reset --hard. It throws away exactly the same as the part of this answer. And yes, throwing things away is potentially dangerous, but it's what the OP asked to do. Their alternative was deleting the directory and re-cloning. They wanted to throw things away. If you want to, say, commit to a local branch and also separately fetch origin's master, great, that's a more common thing to want to do - it's just not what this question was about.
    – Cascabel
    Commented Oct 3, 2017 at 18:41
557

For me the following worked:

(1) First fetch all changes:

$ git fetch --all

(2) Then reset the master:

$ git reset --hard origin/master

Note - 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/main

(3) Pull/update:

$ git pull
10
  • 8
    this even works when u have committed ur local changes, but still u want to revert
    – agsachin
    Commented Nov 2, 2016 at 11:05
  • 5
    @Marco Servetto: You first fetch all your git changes, but don't apply them yet. Then you reset the master to the last state (updated). If you skip the first step, you will revert changes to the old master (local). From my experience, the way I described it, never causes problems. All other attempts do at the end. Commented Jul 18, 2017 at 7:25
  • 1
    This worked for me, I wanted to ignore all my local changes including recovering deleted files
    – Neri
    Commented Jul 30, 2018 at 17:02
  • 1
    Correct answer.
    – Sandwich
    Commented Jul 29, 2019 at 11:33
  • 2
    I just did steps 1 and 2, and it seemed sufficient. What is the purpose of step 3? Commented Feb 8, 2020 at 16:03
54

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
  • That's what really works, even when you already have local commits that you want to remove. Commented May 11, 2018 at 17:09
  • 10
    Warning guys!! git clean -fxd removes files from .gitignore also. Commented Dec 5, 2018 at 5:44
  • @RameshNavi Sure. This is exactly what is wanted. What is wanted is to have a faster way to re-clone it, i.e. to delete the entire local repo and then clone it.
    – Victor
    Commented Nov 18, 2019 at 13:30
41

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
  • 5
    YES. This is what I needed for an ultimate "don't give an F about what's local" approach. Thanks. :)
    – Adambean
    Commented Oct 19, 2016 at 10:35
  • To completely remove all the local changes, you need the command git clean -fxd
    – Victor
    Commented Mar 5, 2021 at 2:16
  • Just be careful with git-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.
    – DrBeco
    Commented Mar 7, 2021 at 1:46
32

shortest way to do it is:

git pull --rebase --autostash
0
13

this worked for me

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

with the accepted answer I get conflict errors

5
  • That's very similar to the 2015 answer of Artur Barseghyan... but I'd still like to know what the purpose of the 3rd command is: the working files have changed after the 2nd command, and the 3rd command says "Already up to date" Commented Feb 24, 2020 at 19:14
  • that is the only combination that worked on my environment, maybe you are seeing a different thing, for me, I needed the three commands Commented Feb 25, 2020 at 20:10
  • Interesting. Might be a version thing. I'm on git 2.7.4. But I've also just seen a new comment from Artur Barseghyan: "Otherwise you might find yourself working on accidentally outdated master." Commented Feb 25, 2020 at 20:25
  • maybe, but the only thing I can say is "this worked for me when no other solution did", so it might help others Commented Feb 26, 2020 at 0:49
  • To completely remove all the local changes, you need the command git clean -fxd
    – Victor
    Commented Mar 5, 2021 at 2:16
13

I usually do:

git checkout .
git pull

In the project's root folder.

2
  • 1
    It will delete local changes
    – Ujjwal Roy
    Commented Jul 13, 2020 at 9:47
  • 3
    @UjjwalRoy From the comment on the question, I believe that was the intention. But when I want to save local changes I use git add -A git stash Commented Jul 14, 2020 at 14:20
12
git fetch --all && git reset --hard origin/master
11

If 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
  • I rely on this one
    – Marin
    Commented Nov 21, 2022 at 21:59
  • this worked, what I like in this answer his - In" git reset --hard origin/<branch_name>" . Branch name varies so we need to enter the branch name we want to reflect
    – coder kemp
    Commented Apr 19, 2023 at 18:32
10

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.

9

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
  • I think you meant "tracked files" which is exactly what I need, thanks.
    – Ali
    Commented Oct 24, 2013 at 16:16
  • any equivalent for Powershell?
    – Earlee
    Commented Jun 6, 2019 at 4:10
  • great solution, it worked for me to overwrite a sqlite DB only if there are changes from the repo and keep the locally changed version on the prototype deploy.. thanks!
    – Roberto
    Commented Nov 18, 2022 at 14:41
5

It's late but someone can find this useful.(Worked for me)

  1. git restore < fileName> or git restore .
  2. git pull
3

This will fetch the current branch and attempt to do a fast forward to master:

git fetch && git merge --ff-only origin/master
1
  • This should be the answer! Commented Apr 25, 2022 at 3:03
1

.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

0

Also, it's possible to keep changes from local commits and push them as a new commit. I use these steps when I have a mess in my local commits.

  1. git reset --soft origin/main
  2. git stash
  3. git pull --rebase
  4. git stash pop
0

git pull will give error if we change any thing in any files in our local system, So we need to git stash

  1. 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

  2. git stash Saved working directory and index state WIP on ....

  3. git pull Updating... 10 files changed, 291 insertions(+), 169 deletions(-)

Not the answer you're looking for? Browse other questions tagged or ask your own question.