ChatGPT解决这个技术问题 Extra ChatGPT

How do I ignore an error on 'git pull' about my local changes would be overwritten by merge?

How do I ignore the following error message on Git pull?

Your local changes to the following files would be overwritten by merge

What if I want to overwrite them?

I've tried things like git pull -f, but nothing works.

To be clear, I only want to overwrite specific changes, not everything.

Related but no duplicate: stackoverflow.com/questions/52704/…
@BrianKnoblauch totally agree! Plus, it's not much of a 'merge' if it's 'overwriting' is it? I miss SVN every day...
git config core.fileMode false save my times
What if I don't want to overwrite them?

D
Daniel Hilgarth

If you want remove all local changes - including files that are untracked by git - from your working copy, simply stash them:

git stash push --include-untracked

If you don't need them anymore, you now can drop that stash:

git stash drop

If you don't want to stash changes that you already staged - e.g. with git add - then add the option --keep-index. Note however, that this will still prevent merging if those staged changes collide with the ones from upstream.

If you want to overwrite only specific parts of your local changes, there are two possibilities:

Commit everything you don't want to overwrite and use the method above for the rest. Use git checkout path/to/file/to/revert for the changes you wish to overwrite. Make sure that file is not staged via git reset HEAD path/to/file/to/revert.


@user1132363: It works for me. Please test it first with a single file. Also, you have make sure that the file you want to overwrite is not staged.
The trick was to use git checkout HEAD^ path/to/file/to/revert. Using HEAD^ made all the difference.
@user1132363: That checks out the previous version and not the one currently checked in. I don't believe that this is the correct approach.
What if I am not able to do a stash because I have no changed files in my working copy? I get the error message despite having no local changes.
I don't have any unstashed local changes and I still got this error.
m
mae

Alright with the help of the other two answers I've come up with a direct solution:

git checkout HEAD^ file/to/overwrite
git pull

This worked for me. Could you expand on this answer, ie. what is this actually doing?
It's dropping local changes, reverting to the HEAD reference which is probably the last commit in the master branch
why HEAD^ instead of HEAD?
HEAD^ is short for HEAD^1, which essentially means the one commit before HEAD. You could also do HEAD^2 for the commit before that one. For more information see git-scm.com/book/en/v2/… and stackoverflow.com/questions/1955985/….
please explain what this does in the answer
k
kravits88

This works for me to override all local changes and does not require an identity:

git reset --hard
git pull

SO needs to work on their ranking algo, cumbersome to find a working, highly rated answer so far down the thread.
@BenedictK. I believe that the ranking system appropriately reflects "what the most people find the most helpful." They're ranked by votes. More people prefer the other solutions. This is a good solution, but more people find the other answers more helpful.
Works just fine for me
This is the easiest solution if you just want to start over and make your git pull work.
Great answer, helped me out, I was completely lost.
E
Eugen Konkov

So many answers here that I hate to add yet another, but all of the above are clunkier than they need to be. I have to do this all the time as Git seems to become confused and says I have modified files that have not changed (can't revert because they didn't change, but I can't pull because they supposedly have changed) Simplest and fastest I've found so far is:

git stash
git stash drop
git pull

NOTICE: local changes will be lost


Hm... Dangerous advice. After stash and drop you will loose your local changes =(
@EugenKonkov That's the whole point... Git sees things as local changes that aren't really changes we want to be kept and we've made no changes that need to be kept. This way you can quickly toss all local changes and then move on!
Works perfect. Saved my day. Thank you.
imagine if you didn't read that to the end!
@jimsmith Since tossing local changes is the whole point of this, I still struggle with that last part really being necessary at all!
M
Moonlight Knight

Here is a solution that throws away staged changes:

git reset file/to/overwrite
git checkout file/to/overwrite

Annoyingly, if the perceived difference comes from the fact that the file had its newlines changed when it was checked out, this will not fix the problem.
this is the best answer, imo, because it does not disrupt any staged items, but addresses the problem of the file preventing the pull
@Timo I do not remember, it was seven years ago.
E
Eugen Konkov

You can either commit your changes before you do the merge, or you stash them:

git stash save git merge origin/master git stash pop


Point is, you shouldn't have to do this. Just take the current HEAD material and ..... merge it in! It's really simple, Git, all other VCS's do it... but nope. Linus had to make it annoying to use.
@Jon This solution is for Ubuntu, I have not found anything better then this.
Unfortunately --autostash option is available only with --rebase option (
thats going to introduce so many problems its not worth it. Takes 5 mins at least to load also. Also introduces "Unlink of file" errors. downvote
Is save option similar to git stash without save? git stash pop means take the last stash from the stack, so apply it to the index.
p
pabloasc

If you want to discard your local changes on one file you can do the following:

git checkout -- <file>

Then you could overwrite the file[s] with the latest version just doing:

git pull

@pabloasc This is destroy your local changes in that file.
Yes it does: "What if I want to overwrite them?"
Original question is not able this, this answer can give someone nightmare who can blindly copy paste the command.
In case you staged a commit already, you first have to revert the commit via git reset HEAD~ and then do the git checkout
git checkout -- <file> fails with error: pathspec '<file>' did not match any file(s) known to git.
E
Eugen Konkov
git pull --rebase --autostash

-r, --rebase[=false|true|merges|preserve|interactive] When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream

--autostash, --no-autostash Before starting rebase, stash local modifications away if needed, and apply the stash entry when done

I do not know why this is not answered yet, but solution, as you can see is simple. All answers here suggest same: to delete/save your local changes and apply upstream, then (if you save) apply your local changes on top.

What git pull --rebase --autostash does step-by-step:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

My case (probably yours too):

I have local changes (changes at working directory):

https://i.stack.imgur.com/EO6CF.jpg

When I try to pull remote changes I get error:

https://i.stack.imgur.com/KWldG.jpg

This changes do not intersect with local changes:

https://i.stack.imgur.com/dxEai.jpg

So when I pull --rebase --autostash local changes saved and applied without any problem automatically

https://i.stack.imgur.com/vX1XC.jpg

https://i.stack.imgur.com/Csxqj.jpg


Nicely done! Can you take out the "TLDR" you have at the top? Perhaps "This is a better answer - PLEASE read."
@learning2learn: May you please describe why you dislike TLDR?
Because I think it's worth reading and to me "TL;DR" (too long; didn't read), implies it's too verbose and perhaps not worth reading. But for me of all the different answers on this question, it most closely reflected my issue at the moment, and did exactly what I was looking for. (I'd used stash before, but somehow didn't know of autostash cli option). I think your answer should get more upvotes.
error: Pulling is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm ' hint: as appropriate to mark resolution and make a commit.
This answer is unique and very important
P
Peter Mortensen

If your repository contains a few files which are removed from master:

git checkout master git fetch origin git reset --hard origin/master git checkout -b newbranch


git reset --hard origin/master is the only thing that worked, out of all these solutions. Thank you.
Thank you very much! I've tried all the answers above but none of them worked. I haven't changed anything and still got this error for file A, and when I tried stash, I got this error with 10 other files. Repeating endlessly... git reset --hard origin/<branch> did help!
This was the only one that worked for me. Thank you! git checkout -b newbranch is out of scope. Question was to pull, so it would be git pull.
J
Jeremy Holovacs

Sometimes, none of these work. Annoyingly, due to the LF thing I think, what will work is deleting the files, then pulling. Not that I recommend this solution, but if the file doesn't exist, git won't uselessly inform you that your changes (which may not even be changes) will get overridden, and will let you continue.

Use at your own risk.


When your stuck due to line endings, this method is a life saver
This isn't working for me. The files don't exist locally and I am still getting the error.
this even worked for a git merge master, when none of the other suggestions did
What happened in me is that, I deleted the file on my local repo, and when I pull, the "about my local changes would be overwritten by merge" came up.
True for me too. Tried git checkout HEAD^ and git checkout HEAD -- and git checkout --. I'm working on my own files and never touched the files with conflicts. I didn't want to stash and then overwrite everything, just the conflicts...so I ended up deleting the file(s) and repulling.
K
Khemraj Sharma

git stash save --keep-index did not worked for me.

below command worked as expected.

git reset --hard
git pull

It override all local changes if you don't need them.


K
Kasyful Anwar

Try this

git fetch --all 

git reset --hard origin/master

git pull origin master

It's work for me to force pull


k
kenorb

In the recent Git, you can add -r/--rebase on pull command to rebase your current branch on top of the upstream branch after fetching. The warning should disappear, but there is a risk that you'll get some conflicts which you'll need to solve.

Alternatively you can checkout different branch with force, then go back to master again, e.g.:

git checkout origin/master -f
git checkout master -f

Then pull it again as usual:

git pull origin master

Using this method can save you time from stashing (git stash) and potential permission issues, reseting files (git reset HEAD --hard), removing files (git clean -fd), etc. Also the above it's easier to remember.


Y
Yamen Ashraf

git reset --hard && git clean -df

Caution: This will reset and delete any untracked files.


One does not use axe to remove fly from friend's forehead.
DO NOT use this without the awareness that some files will be DELETED.
P
Peter Mortensen

Here is my strategy to solve the problem.

Problem Statement

We need to make changes in more than 10 files. We tried PULL (git pull origin master), but Git shouted:

error: Your local changes to the following files would be overwritten by merge: Please, commit your changes or stash them before you can merge.

We tried to execute commit and then pull, but they didn't work either.

Solution

We were in the dirty stage actually, because the files were in the "Staging Area" a.k.a "Index Area" and some were in the "Head Area" a.k.a "local Git directory". And we wanted to pull the changes from the server.

Check this link for information about different stages of Git in a clear manner: GIT Stages

We followed the following steps

git stash (this made our working directory clean. Your changes are stored on the stack by Git).

git pull origin master (Pull the changes from the server)

git stash apply (Applied all the changes from stack)

git commit -m 'message' (Committed the changes)

git push origin master (Pushed the changes to the server)

git stash drop (Drop the stack)

Let's understand when and why you need stashing

If you are in the dirty state, means you are making changes in your files and then you are compelled, due to any reason, to pull or switch to another branch for some very urgent work, so at this point you can't pull or switch until you commit your change. The stash command is here as a helping hand.

From the book ProGIT, 2nd Edition:

Often, when you’ve been working on part of your project, things are in a messy state and you want to switch branches for a bit to work on something else. The problem is, you don’t want to do a commit of half-done work just so you can get back to this point later. The answer to this issue is the git stash command. Stashing takes the dirty state of your working directory – that is, your modified tracked files and staged changes – and saves it on a stack of unfinished changes that you can reapply at any time.


P
Peter Mortensen

This problem is because you have made changes locally to file/s and the same file/s exists with changes in the Git repository, so before pull/push you will need stash local changes:

To overwrite local changes of a single file:

git reset file/to/overwrite
git checkout file/to/overwrite

To overwrite all the local changes (changes in all files):

git stash
git pull
git stash pop

Also this problem may be because of you are on a branch which is not merged with the master branch.


P
Peter Mortensen

This worked for me to discard changes on the live remote server and pull from the source control GitHub:

git reset --hard
git pull origin master

D
Deepika Patel

You can use this for overwrite file

git checkout file_to_overwrite

F
Forhadul Islam

The best way to solve this problem is:

git checkout -- <path/file_name>

After that you can overwrite the file by:

git pull origin master

I had the problem mentioned because I'd updated the index to assume the files were unchanged. It still wouldn't let me do the pull. I used git checkout -- path/* just once, and it allowed me to execute the pull after.
P
Peter Mortensen

If you want to keep production changes on the server, just merge into a new configuration item. The processing method is as follows:

git stash
git pull
git stash pop

Maybe you don't execute all operations. You can know what you can do next.


You can then use the Git diff - w + name of the file to confirm the code merge automatically
W
Will Vousden

If you want to overwrite specific changes, you need some way of telling it which ones you want to forget.

You could try selectively stashing the changes you want to abandon using git stash --patch and then dropping that stash with git stash drop. You can then pull in the remote changes and merge them as normal.


J
Jackkobec

The simplest solution is:

git reset --hard && git pull

A
ASR

Error "Your local changes to the following files would be overwritten by merge" comes because you have some changes in the local repo that have NOT been commited yet, so before pulling from remote repo just commit the changes in local repo.

Lets say your remote repo has some branch xyz and you want that remote repo xyz branch to be merged into (copied to) local repo xyz branch then,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

After you ran git commit command doesn't it ask for git push?
佚名

I had a special case of this: I had a file with --assume-unchanged on it. It was hard to locate, as the git status command was not showing any changes


I have this same problem. Did you find a way to get around it? I suppose I could remove and then re-add assume-unchanged... what I did was just checkout those files manually to get unchanged versions... just wondering if there is a way to just make the checkout / rebase / merge just overwrite them.
No, I had to abandon the whole "assume unchanged " thing.
N
NikeCon

Due to your branch is behind 'origin/dev' by xx commits, and can be fast-forwarded. Try this command:

git checkout .
git pullenter code here

Hope that fix your issue.


D
Dmitry

I was ignoring a file in my repo and when I did git pull upstream master I got the following error:

error: Your local changes to the following files would be overwritten by merge: myfile.js Please, commit your changes or stash them before you can merge. Aborting

To resolve it I did the following

git update-index --no-assume-unchanged myfile.js

I then did git status and got this message

On branch master Your branch is behind 'origin/master' by 4 commits, and can be fast-forwarded. (use "git pull" to update your local branch) Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: myfile.js no changes added to commit (use "git add" and/or "git commit -a")

Then I did git checkout myfile.js followed by git pull upstream master. This time the git pull operation was successful.


I recommend dealing with individual files. What I do in this case is first git diff foobar.js and then once confirmed nothing precious will be lost: git restore foobar.js
u
user60561

If this error is because of line endings,

git add
git checkout mybranch

will work. I'm not really sure why it works.


A
AJ Macapaz

I encountered this when pulling from the master.

The way I handled it, using Visual Studio;

First, I performed Undo commit on my solution. Then I did the Git pull process.

Hope this helps!


T
TaQuangTu

I have tried and it successfully, before pulling, let commit all file that you have not committed, then you will not receive that messages from AS.


M
Milad Safaei

I'm new in git and not sure if my solution is a good idea.

I've tested ALL of answers and none of them worked for me!

But I found another solution:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Hope this helps.