236

I'm a Git newbie. I recently moved a Rails project from Subversion to Git. I followed the tutorial here: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

I am also using unfuddle.com to store my code. I make changes on my Mac laptop on the train to/from work and then push them to unfuddle when I have a network connection using the following command:

git push unfuddle master

I use Capistrano for deployments and pull code from the unfuddle repository using the master branch.

Lately I've noticed the following message when I run "git status" on my laptop:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

And I'm confused as to why. I thought my laptop was the origin... but don't know if either the fact that I originally pulled from Subversion or push to Unfuddle is what's causing the message to show up. How can I:

  1. Find out where Git thinks 'origin/master' is?
  2. If it's somewhere else, how do I turn my laptop into the 'origin/master'?
  3. Get this message to go away. It makes me think Git is unhappy about something.

My mac is running Git version 1.6.0.1.


When I run git remote show origin as suggested by dbr, I get the following:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

When I run git remote -v as suggested by Aristotle Pagaltzis, I get the following:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Now, interestingly, I'm working on my project in the geekfor directory but it says my origin is my local machine in the gf directory. I believe gf was the temporary directory I used when converting my project from Subversion to Git and probably where I pushed to unfuddle from. Then I believe I checked out a fresh copy from unfuddle to the geekfor directory.

So it looks like I should follow dbr's advice and do:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git
jub0bs
  • 60,866
  • 25
  • 183
  • 186
Brian Kelly
  • 5,564
  • 4
  • 27
  • 31

13 Answers13

286

I came to this question looking for an explanation about what the message "your branch is ahead by..." means, in the general scheme of git. There was no answer to that here, but since this question currently shows up at the top of Google when you search for the phrase "Your branch is ahead of 'origin/master'", and I have since figured out what the message really means, I thought I'd post the info here.

So, being a git newbie, I can see that the answer I needed was a distinctly newbie answer. Specifically, what the "your branch is ahead by..." phrase means is that there are files you've added and committed to your local repository, but have never pushed to the origin. The intent of this message is further obfuscated by the fact that "git diff", at least for me, showed no differences. It wasn't until I ran "git diff origin/master" that I was told that there were differences between my local repository, and the remote master.

So, to be clear:


"your branch is ahead by..." => You need to push to the remote master. Run "git diff origin/master" to see what the differences are between your local repository and the remote master repository.


Hope this helps other newbies.

(Also, I recognize that there are configuration subtleties that may partially invalidate this solution, such as the fact that the master may not actually be "remote", and that "origin" is a reconfigurable name used by convention, etc. But newbies do not care about that sort of thing. We want simple, straightforward answers. We can read about the subtleties later, once we've solved the pressing problem.)

Earl

Earl Jenkins
  • 4,791
  • 3
  • 17
  • 16
  • 2
    @Earl Wouldn't `git diff --cached origin/master` be better instruction here as it states what would be the result of the next push? The highlighted command you have above also shows uncommitted & unstaged files (I think, I'm a git newbie too) – nhed Apr 21 '11 at 21:43
  • 48
    It's also possible that you need to run `git fetch` if you are getting this error after a `git pull remote branch`. Your refs might be out of date. `git fetch` fixes that. – bryan kennedy Aug 24 '11 at 04:19
  • does the `origin/master` part mean `master` branch in `origin` repo? – Rakib Oct 18 '11 at 00:18
  • 1
    Note that this description is incomplete. I currently am experiencing `# On branch master` `# Your branch is ahead of 'origin/master' by 3 commits.` But git diff origin/master shows nothing, (and the --cached option does not change this). And, git fetch does not change this, git pull does not change this, git reset --hard does not change this. To change this, I needed: git reset --hard origin/master And I choose that route because other people are working with me in this repository and I did not want to invalidate their testing, and because I could not find out what these commits are. – rdm May 17 '12 at 13:25
  • `git reset --hard HEAD` always the way to go for a hard reset – Earl Jenkins May 26 '12 at 00:02
  • 1
    I also get this message when I need to *pull* from rather than push to origin/master. eg from another branch if I `git checkout master` I get the message, which means I should `git pull origin master` before working. but I find it very confusing because the wording of the message suggests the opposite – Anentropic Jun 14 '12 at 11:08
  • The "git fetch" answer by Bryan Kennedy is what might turn out to be the right answer for a lot of people coming here. In my scenario git reset --hard didn't seem to work; upon updating from master using git pull the same issue persisted. It appeared somehow I was ahead of master by several commits, even after just pulling from master. git fetch fixed whatever references had gotten out of sync. I can't be sure but the source of the entire problem may stem from doing an automatic merge on github, if that helps anyone. – Michael Jun 19 '12 at 04:04
  • Yes, `git fetch` is definitely your friend. I do it pretty much before every pull or merge, just to avoid the hassle of having git complain, and then having to do it anyway. – Earl Jenkins Jun 26 '12 at 18:19
217

1. Find out where Git thinks 'origin/master' is using git-remote

git remote show origin

..which will return something like..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

A remote is basically a link to a remote repository. When you do..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..git will push changes to that address you added. It's like a bookmark, for remote repositories.

When you run git status, it checks if the remote is missing commits (compared to your local repository), and if so, by how many commits. If you push all your changes to "origin", both will be in sync, so you wont get that message.

2. If it's somewhere else, how do I turn my laptop into the 'origin/master'?

There is no point in doing this. Say "origin" is renamed to "laptop" - you never want to do git push laptop from your laptop.

If you want to remove the origin remote, you do..

git remote rm origin

This wont delete anything (in terms of file-content/revisions-history). This will stop the "your branch is ahead by.." message, as it will no longer compare your repository with the remote (because it's gone!)

One thing to remember is that there is nothing special about origin, it's just a default name git uses.

Git does use origin by default when you do things like git push or git pull. So, if you have a remote you use a lot (Unfuddle, in your case), I would recommend adding unfuddle as "origin":

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

or do the above in one command using set-url:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Then you can simply do git push or git pull to update, instead of git push unfuddle master

George
  • 2,860
  • 18
  • 31
dbr
  • 165,801
  • 69
  • 278
  • 343
  • 1
    He writes that he pushes to the `origin` repository (even though he’s not aware of how that works in git terms) – removing the remote would hardly be a useful thing to do for him. – Aristotle Pagaltzis Nov 10 '08 at 06:57
  • He never mentions pushing to origin, only the unfuddle remote.. Although I've reworded the question quite a bit, to clarify what a remote is. – dbr Nov 10 '08 at 08:55
  • 10
    I don't understand why people reword questions. It changes the meaning of the question, it makes existing answers make no sense, and it doesn't let other people know that the question asker needs more information based on the fact that their question might be slightly 'incorrect'. – stu Nov 10 '08 at 16:15
  • 9
    Removing the remote origin was _exactly_ what I needed because it was pointing to a local repository that didn't exist anymore, not the unfuddle repository. – Brian Kelly Nov 10 '08 at 16:47
  • 3
    stu: Rewording is a good thing! If they didn't word is clearly in the first place, there's no point in getting answers that don't solve the actual problem. – dbr Nov 11 '08 at 08:41
  • Then it seems to me that the original author should do that, not somebody off the street who thinks he knows better. I make this point because it's happened to me a few times and makes people start answering a question I didn't ask. – stu Apr 08 '10 at 20:48
  • @stu In this case, the original author did reword the question..? – dbr Apr 08 '10 at 22:38
  • 4
    But it's so much easier to get angry and be bitter. :-) But I see your point. – stu Apr 13 '10 at 18:07
  • I think `git remote -v` as suggested by Aristotle below is a better and more economical answer to "what is the location of origin/master?", because `git remote show origin` requires an internet connection while `git remote -v` doesn't. – Kai Carver Sep 28 '15 at 09:23
  • if you do something like `$cat project_dir_name.git/HEAD`, it should return : `ref: refs/heads/master` ... – LeMarque May 12 '22 at 10:36
39

I had a problem that was similar to this where my working directory was ahead of origin by X commits but the git pull was resulting in Everything up-to-date. I did manage to fix it by following this advice. I'm posting this here in case it helps someone else with a similar problem.

The basic fix is as follows:

$ git push {remote} {localbranch}:{remotebranch}

Where the words in brackets should be replaced by your remote name, your local branch name and your remote branch name. e.g.

$ git push origin master:master
Mims H. Wright
  • 3,049
  • 1
  • 25
  • 30
  • 1
    Thanks, that did it for me. `git diff` didn't show anything, and after doing what you described I no longer get this confusing and annoying message. – Mathieu Dhondt Mar 17 '12 at 23:36
  • 1
    Needs more upvotes :). The higher-voted answers were all "no effect" for me (i.e. "git fetch" -- did nothing ... check "git remote show origin" -- nothing incorrect, nothing needed changing) – Adam Oct 11 '12 at 12:36
24

sometimes there's a difference between the local cached version of origin master (origin/master) and the true origin master.

If you run git remote update this will resynch origin master with origin/master

see the accepted answer to this question

Differences between git pull origin master & git pull origin/master

Community
  • 1
  • 1
chim
  • 8,407
  • 3
  • 52
  • 60
10

I thought my laptop was the origin…

That’s kind of nonsensical: origin refers to the default remote repository – the one you usually fetch/pull other people’s changes from.

How can I:

  1. git remote -v will show you what origin is; origin/master is your “bookmark” for the last known state of the master branch of the origin repository, and your own master is a tracking branch for origin/master. This is all as it should be.

  2. You don’t. At least it makes no sense for a repository to be the default remote repository for itself.

  3. It isn’t. It’s merely telling you that you have made so-and-so many commits locally which aren’t in the remote repository (according to the last known state of that repository).

Aristotle Pagaltzis
  • 112,955
  • 23
  • 98
  • 97
  • 1
    I assumed my laptop was the origin since that's where I first created the repository (where it originated). – Brian Kelly Nov 10 '08 at 15:40
  • 1
    In contrast it makes perfectly sense to me to have `origin` pointing to the laptop locally, as being offline or switching networks is a very common case for portable devices like laptops. This way you can use `git push` and `git pull` any time, no need to think about if you are connected to the right network currently. This local `origin` can be synced with the real remotes automatically when a network link is available, depending on the current roaming status. The problematic part is when to run which sync, compared to that the GIT part is quite easy. – Tino Nov 12 '11 at 02:07
  • 2
    Pointing `origin` at *another* repository on your laptop makes perfect sense, sure. Pointing the `origin` of the repository *at itself* however does not: it would make no difference whatsoever whether you run `git push` or `git pull`, since a repository is always exactly in sync with itself anyway. It’s err, kind of tautological. – Aristotle Pagaltzis Nov 25 '11 at 12:38
3

[ Solution ]

$ git push origin

^ this solved it for me. What it did, it synchronized my master (on laptop) with "origin" that's on the remote server.

Chris
  • 39
  • 2
1

I am struggling with this problem and none of the previous answers tackle the question as I see it. I have stripped the problem back down to its basics to see if I can make my problem clear.

I create a new repository (rep1), put one file in it and commit it.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

I create a clone of rep1 and call it rep2. I look inside rep2 and see the file is correct.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

In rep1 I make a single change to the file and commit it. Then in rep1 I create a remote to point to rep2 and push the changes.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Now when I go into rep2 and do a 'git status' I get told I am ahead of origin.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README in rep2 is as it was originally, before the second commit. The only modifications I have done are to rep1 and all I wanted to do was push them out to rep2. What is it I am not grasping?

  • 1
    Two things: rep2's "origin/master" check doesn't actually look at rep1. If you do a 'git pull' in rep2, it will notice that they are in the same state and stop complaining. To actually see the changes from a push in a working copy, you need to do a 'git checkout' -- pushes never touch the working copy of the dest repo. – Walter Mundt Jul 29 '10 at 18:26
  • I thought that might be that case but I get "git checkout M README Your branch is ahead of 'origin/master' by 1 commit." But my working copy is actually behind by 1 commit, not ahead. – Steve Hindmarch Jul 30 '10 at 11:38
1

It's waiting for you to "push". Try:

$ git push

Vino
  • 11
  • 1
1

I had this problem recently and I figured it was because I had deleted some files that I did not need anymore. The problem is that git does not know that the files have been deleted and it sees that the server still has it. (server = origin)

So I ran

git rm $(git ls-files --deleted)

And then ran a commit and push.

That solved the issue.

looneydoodle
  • 369
  • 6
  • 26
1

I am a git newbie as well. I had the same problem with 'your branch is ahead of origin/master by N commits' messages. Doing the suggested 'git diff origin/master' did show some diffs that I did not care to keep. So ...

Since my git clone was for hosting, and I wanted an exact copy of the master repo, and did not care to keep any local changes, I decided to save off my entire repo, and create a new one:

(on the hosting machine)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

For expediency, I used to make changes to the clone on my hosting machine. No more. I will make those changes to the master, git commit there, and do a git pull. Hopefully, this should keep my git clone on the hosting machine in complete sync.

/Nara

0

I was wondering the same thing about my repo. In my case I had an old remote that I wasn't pushing to anymore so I needed to remove it.

Get list of remotes:

git remote

Remove the one that you don't need

git remote rm {insert remote to remove}
Jason Rikard
  • 1,329
  • 1
  • 14
  • 23
0

It is possible to reset to a specific commit before your own commits take place.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Use git log to find what commit was the commit you had before the local changes took place.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Take note of the local commits and reset directly to the previous commit:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
RobLoach
  • 2,066
  • 1
  • 12
  • 5
-1

I had the problem "Your branch is ahead of 'origin/master' by nn commits." when i pushed to a remote repository with:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

When i found that my remote adress was in the file .git/FETCH_HEAD and used:

git push

the problem disappeared.

musefan
  • 47,875
  • 21
  • 135
  • 185
noob
  • 1