Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git refuses to reset/discard files

Tags:

git

git-status

I have a project with certain js files which I cannot update. I run OSX locally and my remote/staging server is Linux (CentOS).

Right after cloning my project locally, i noticed I have all those files with git status modified. I never modified them, so I tried to discard changes or reset them, but they come up again. The change that is in the modification is deleting all lines and adding them again.

I'm not sure why this happens or how to fix it so that my git status is clean as it needs to be.

Here is a few lines from the git status:

#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/el.js #   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/fa.js #   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/gu.js 

UPDATE 1:

I have now managed to commit the above files, but the staging server is locked because it won't pull new edits:

error: Your local changes to the following files would be overwritten by merge:     app/webroot/js/ckeditor/_source/lang/ar.js     app/webroot/js/ckeditor/_source/lang/bg.js     app/webroot/js/ckeditor/_source/lang/bn.js     app/webroot/js/ckeditor/_source/lang/cs.js     ... Aborting 

I can't commit/push because:

Updates were rejected because a pushed branch tip is behind its remote counterpart 

I tried:

git reset --hard 

and

git stash git stash drop 

But they don't work, nothing happens.

UPDATE 2:

git diff gives me:

The file will have its original line endings in your working directory. warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/fa.js. The file will have its original line endings in your working directory. warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/gu.js. The file will have its original line endings in your working directory. ... 
like image 800
mgPePe Avatar asked Aug 30 '13 15:08

mgPePe


People also ask

Does git reset hard remove unstaged files?

git reset --hard resets your index and reverts the tracked files back to state as they are in HEAD. It leaves untracked files alone.

How do I discard all changes in git?

There are two Git commands a developer must use in order to discard all local changes in Git, remove all uncommited changes and revert their Git working tree back to the state it was in when the last commit took place. The commands to discard all local changes in Git are: git reset –hard. git clean -fxd.

Does git reset delete files?

Running git reset will typically delete files and commits. And without those, you don't have a project! This is why it's critical to plan ahead when using it, so you don't end up deleting elements that are critical for your project.

How do I delete unstaged files in git?

For all unstaged files in current working directory use: git restore . That together with git switch replaces the overloaded git checkout (see here), and thus removes the argument disambiguation. If a file has both staged and unstaged changes, only the unstaged changes shown in git diff are reverted.


2 Answers

Normalize line endings

The change that is in the modification is deleting all lines and adding them again.

This is because the newlines are being changed between the committed files and the files on disk.

Github has a handy page detailing how to deal with this kind of problem, in brief (for linux/OSX), step one is to change your git config so it sorts out the line endings for you:

git config --global core.autocrlf input 

Then commit line-endings normalization:

git rm --cached -r . # Remove everything from the index.  git reset --hard # Write both the index and working directory from git's database.  git add . # Prepare to make a commit by staging all the files that will get normalized. # This is your chance to inspect which files were never normalized. You should # get lots of messages like: "warning: CRLF will be replaced by LF in file."  git commit -m "Normalize line endings" # Commit 

And then, line endings should be handled correctly. See the help page on github for more information, or the relevant section of the git docs formatting and whitespace.

Resolving linux-machine conflicts

the staging server is locked because it won't pull new edits.

The error message reads "Your local changes to the following files would be overwritten by merge:", that means they contain local changes which should either be committed or discarded before continuing. Assuming normal usage for the staging server (it doesn't have any intentional changes) the local changes can be discarded. For example do the following:

$ git fetch origin # Retrieve updates  $ git reset --hard origin/master # Forcibly change the current branch to match origin/master 

This will retrieve the repository history, without updating the working copy, and then update to exactly match the master branch in the repository. Note that the last command will discard all uncommitted changes.

like image 168
AD7six Avatar answered Oct 13 '22 04:10

AD7six


I always mentioned making sure that your core.autocrlf is set to false, as in "Git : stuck repo using stash after crlf normalization?"

git config --global core.autocrlf false 

Also make sure that you don't have a .gitattributes file with eol directives that would try to convert the end-of-lines.
The basic idea is: do you still see that error message when you make sure there is no automatic conversion of any sort?


But just in case, consider also "Git rebase fails, 'Your local changes to the following files would be overwritten by merge'. No local changes?"

I'm on a mac, and this obscure config change seemed to fix all my woes regarding unstaged changes when there were none.

git config --global core.trustctime false 
like image 24
VonC Avatar answered Oct 13 '22 04:10

VonC