Git push rejected "non-fast-forward"
Asked Answered
F

17

172

I am fairly new to git, yet currently using it to manage our code in a team environment. I had some rebasing issues, and I fixed them using:

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Now I wish to push my changes, and so running the following command:

$ git push origin feature/my_feature_branch

Gave me the following error:

To ssh://[email protected]:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://[email protected]:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

What can I do to get rid of this error?

Note: I am avoiding the use of --force option as much as possible.

Febrifuge answered 9/12, 2013 at 9:26 Comment(1)
Related: What's a “fast-forward” in Git?.Pskov
L
130

It looks, that someone pushed new commits between your last git fetch and git push. In this case you need to repeat your steps and rebase my_feature_branch one more time.

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

After the git fetch I recommend to examine situation with gitk --all.

Lombardy answered 9/12, 2013 at 9:37 Comment(4)
What to do to enable git pull origin master:master which should default to merging. Is this a merge conflict or not. This is the one and only question being asked.Iceboat
Why do we "rebase"?Westlund
Because merge (the alternative) would clutter the history. You can do it, if rebase doesn't work for you for some reasons.Lombardy
For branch name/remote branch, you can try git branch -aMacario
C
82

Warning: you can potentially lose work by using this solution. Especially in a team environment since it can potentially overwrite / delete other people's contributions. Look at this other answer for a better way: https://mcmap.net/q/142873/-git-push-rejected-quot-non-fast-forward-quot

try this command

$ git push -f -u origin <name of branch>

e.g. $ git push -f -u origin master

Cordie answered 17/4, 2020 at 12:25 Comment(2)
That worked for my case when the others didn't. Sometimes you just have to tell git -f -uLeodora
this erased the previous commit and replaced it with my local changes. I had a backup of the previous commit, so not a big deal, but still not what I had expected: keep the previous commit and add a new commit with my local changes.Hypoglossal
C
41

Probably you did not fetch the remote changes before the rebase or someone pushed new changes (while you were rebasing and trying to push). Try these steps:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp
Chape answered 9/12, 2013 at 9:32 Comment(3)
This solves my problem: when I committed my code, I did a rebase (too late, there were already changes, should do it before commit). Then even there was no conflict, I could not push. After applying above magic, it worked. Thanks.Farika
This is perfect answerStricklin
Could you please add some diagram what does the commands do?Horrid
J
19

I'm late to the party but I found some useful instructions in github help page and wanted to share them here.

Sometimes, Git can't make your change to a remote repository without losing commits. When this happens, your push is refused.

If another person has pushed to the same branch as you, Git won't be able to push your changes:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

You can fix this by fetching and merging the changes made on the remote branch with the changes that you have made locally:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

Or, you can simply use git pull to perform both commands at once:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work
Justification answered 21/8, 2018 at 9:28 Comment(1)
I did all of this but no success.Shrill
O
15

I had a similar problem and I resolved it with: git pull origin

Oscine answered 21/4, 2016 at 8:10 Comment(1)
Helped me when I received the error in question while pulling a remote branch.Maidel
G
5

after you get the non fast forward error , just do below :

1> git pull --rebase origin <name-of-the-remote-branch>

This will fetch the remote changes in to your local branch . On top of that it will apply your local commits .

2> git push origin <name-of-the-remote-branch>

This will apply your local changes in the local copy of the remote branch to the actual remote branch repo in git

Georgena answered 13/1, 2022 at 9:58 Comment(0)
S
3

In my case for exact same error, I was not the only developer as well.

So I went to commit & push my changes at same time, seen at bottom of the Commit dialog popup:

Checked option for: Push changes immediately to origin

...but I made the huge mistake of forgetting to hit the Fetch button to see if I have latest, which I did not.

The commit successfully executed, however not the push, but instead gives the same mentioned error; ...even though other developers didn't alter same files as me, I cannot pull latest as same error is presented.

The GUI Solution

Most of the time I prefer sticking with Sourcetree's GUI (Graphical User Interface). This solution might not be ideal, however this is what got things going again for me without worrying that I may lose my changes or compromise more recent updates from other developers.

STEP 1

Right-click on the commit right before yours to undo your locally committed changes and select Reset current branch to this commit like so:

Sourcetree window with right-clicked commit and selecting: Reset current branch to this commit

STEP 2

Once all the loading spinners disappear and Sourcetree is done loading the previous commit, at the top-left of window, click on Pull button...

Sourcetree window with with the Pull button highlighted

...then a dialog popup will appear, and click the OK button at bottom-right:

Sourcetree window dialog popup with the OK button highlighted

STEP 3

After pulling latest, if you do not get any errors, skip to STEP 4 (next step below). Otherwise if you discover any merge conflicts at this point, like I did with my Web.config file:

Sourcetree window showing the error hint: Updates were rejected because the tip of your current branch is behind

...then click on the Stash button at the top, a dialog popup will appear and you will need to write a Descriptive-name-of-your-changes, then click the OK button:

Sourcetree window with Stash button highlighted and dialog popup showing input to name your stash with OK button highlighted

...once Sourcetree is done stashing your altered file(s), repeat actions in STEP 2 (previous step above), and then your local files will have latest changes. Now your changes can be reapplied by opening your STASHES seen at bottom of Sourcetree left column, use the arrow to expand your stashes, then right-click to choose Apply Stash 'Descriptive-name-of-your-changes', and after select OK button in dialog popup that appears:

Sourcetree window with the Stashes section expanded and changes right-clicked with Apply Stash highlighted

Sourcetree dialog popup ask your to confirm if you would like to apply stash you your local copy

IF you have any Merge Conflict(s) right now, go to your preferred text-editor, like Visual Studio Code, and in the affected files select the Accept Incoming Change link, then save:

enter image description here

Then back to Sourcetree, click on the Commit button at top:

enter image description here

then right-click on the conflicted file(s), and under Resolve Conflicts select the Mark Resolved option:

enter image description here

STEP 4

Finally!!! We are now able to commit our file(s), also checkmark the Push changes immediately to origin option before clicking the Commit button:

enter image description here

P.S. while writing this, a commit was submitted by another developer right before I got to commit, so had to pretty much repeat steps.

Selfregard answered 11/2, 2021 at 23:55 Comment(0)
A
1

Write lock on shared local repository

I had this problem and none of above advises helped me. I was able to fetch everything correctly. But push always failed. It was a local repository located on windows directory with several clients working with it through VMWare shared folder driver. It appeared that one of the systems locked Git repository for writing. After stopping relevant VMWare system, which caused the lock everything repaired immediately. It was almost impossible to figure out, which system causes the error, so I had to stop them one by one until succeeded.

Alcuin answered 19/5, 2016 at 10:42 Comment(0)
M
1

Well I used the advice here and it screwed me as it merged my local code directly to master. .... so take it all with a grain of salt. My coworker said the following helped resolve the issue, needed to repoint my branch.

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch
Mathewmathews answered 8/2, 2017 at 21:1 Comment(0)
B
1
  1. move the code to a new branch - git branch -b tmp_branchyouwantmergedin
  2. change to the branch you want to merge to - git checkout mycoolbranch
  3. reset the branch you want to merge to - git branch reset --hard HEAD
  4. merge the tmp branch into the desired branch - git branch merge tmp_branchyouwantmergedin
  5. push to origin
Buber answered 12/2, 2020 at 3:7 Comment(1)
error: unknown option `hard'Dotation
P
1
  • The git pull --rebase command performs a rebase instead of a merge when incorporating the remote changes into your local branch. This can help in situations where there are conflicts that need to be resolved before pushing your changes.
$ git pull --rebase origin main
  • git push command to push your local branch to the remote repository.
$ git push -u origin main
Pay answered 5/6, 2023 at 5:38 Comment(0)
I
0

In Eclipse do the following:

GIT Repositories > Remotes > Origin > Right click and say fetch

GIT Repositories > Remote Tracking > Select your branch and say merge

Go to project, right click on your file and say Fetch from upstream.

Intelligencer answered 21/6, 2018 at 11:57 Comment(0)
M
0
git checkout master

git fetch [the temporal branch of the company before pushing to master]

git pull --rebase [the temporal branch of the company before pushing to master] master

git checkout -b [new-branch]

Then add your files and do the following:

git add .

git commit -m "added article"

git push -u origin [new-branch]

This worked for me.

Martres answered 3/2, 2022 at 10:10 Comment(1)
Note: the default branch is now called 'main' not 'master' since 2020Bloomer
F
0

Only this worked for me:

You can fix this by fetching and merging the changes made on the remote branch with the changes that you have made locally:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

Follow this for more insights

Fully answered 4/1, 2023 at 8:56 Comment(0)
A
0

I was getting this

* branch            main       -> FETCH_HEAD
fatal: refusing to merge unrelated histories

What worked for me was.

git remote add origin repositry-web-url
git branch -M main
git pull origin main --allow-unrelated-histories

git push -u origin main
Appreciative answered 15/4, 2023 at 9:20 Comment(0)
M
-1

if you want to remove latest commit please do two command below.

  1. git reset --hard (your commit hash)
  2. git push origin HEAD --force
Mealworm answered 14/11, 2023 at 10:18 Comment(0)
H
-3
  1. Undo the local commit. This will just undo the commit and preserves the changes in working copy
git reset --soft HEAD~1
  1. Pull the latest changes
git pull
  1. Now you can commit your changes on top of latest code
Haematopoiesis answered 23/7, 2020 at 2:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.