tags:

views:

14209

answers:

5

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    [email protected]: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 [email protected]:spilth/geekfor.git
+7  A: 

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
I assumed my laptop was the origin since that's where I first created the repository (where it originated).
spilth
+28  A: 

1. Find out where Git thinks 'origin/master' is?

git remote show origin

..which will return something like..

* remote origin
  URL: [email protected]:~/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 [email protected]/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 [email protected]:subdomain/abbreviation.git

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

dbr
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
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
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
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.
spilth
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
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
@stu In this case, the original author did reword the question..?
dbr
But it's so much easier to get angry and be bitter. :-) But I see your point.
stu
+23  A: 

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
Nice answer, n00b.
gmoore
Ummm, thanks. I think. :)
Earl Jenkins
This git newbie thanks you for your clear explanation.
Ether
A: 

Another newbee question. Why should I still get the message after doing "git pull origin master"? Shouldn't this make my local repository exactly same as remote?

Mahesh
No - the local repository has commits that `origin` doesn't. git pull does a fetch and merge pair. The fetch will be a no-op, since the local repository already has everything that was in the remote, and the merge will be a no-op, because those commits in the remote are ancestral to the current branch.
Novelocrat
A: 

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?

Steve Hindmarch
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
I thought that might be that case but I get"git checkout M READMEYour branch is ahead of 'origin/master' by 1 commit."But my working copy is actually behind by 1 commit, not ahead.
Steve Hindmarch