I'm new to git, and I can't make sense of the following behavior:
I have a bitbucket repo that I clone locally, then I modify and commit locally, then I push to the remote repo. If I do an implicit push, or 'push origin', there's no issue. If I push using explicit remote url, I get the status message 'Your branch is ahead of 'origin/master' by 1 commit'.
It seems that git does not recognize the explicit address as being the same as origin, so what exactly is going on. If I do another implicit push, it does nothing, but it does clear the said message.
Here's a sample session:
baz@bhost:/more/coding/git-tests/ask1$ git --version git version 1.7.2.5 baz@bhost:/more/coding/git-tests$ git clone https://[email protected]/shishani/dirasi.git ask1 Cloning into ask1... Password: remote: Counting objects: 24054, done. remote: Compressing objects: 100% (6300/6300), done. remote: Total 24054 (delta 17124), reused 24024 (delta 17106) Receiving objects: 100% (24054/24054), 11.83 MiB | 251 KiB/s, done. Resolving deltas: 100% (17124/17124), done. baz@bhost:/more/coding/git-tests$ cd ask1 baz@bhost:/more/coding/git-tests/ask1$ jed setup.py baz@bhost:/more/coding/git-tests/ask1$ git commit -a [master a053f28] modified: setup.py 1 files changed, 1 insertions(+), 0 deletions(-) baz@bhost:/more/coding/git-tests/ask1$ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # nothing to commit (working directory clean) baz@bhost:/more/coding/git-tests/ask1$ git remote show origin Password: * remote origin Fetch URL: https://[email protected]/shishani/dirasi.git Push URL: https://[email protected]/shishani/dirasi.git HEAD branch: master Remote branch: master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (fast-forwardable) baz@bhost:/more/coding/git-tests/ask1$ git push Password: Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 314 bytes, done. Total 3 (delta 2), reused 0 (delta 0) remote: bb/acl: shishani is allowed. accepted payload. To https://[email protected]/shishani/dirasi.git 5e9ffd1..a053f28 master -> master baz@bhost:/more/coding/git-tests/ask1$ git status # On branch master nothing to commit (working directory clean) baz@bhost:/more/coding/git-tests/ask1$ jed setup.py baz@bhost:/more/coding/git-tests/ask1$ git commit -a [master 6d0e236] modified: setup.py 1 files changed, 1 insertions(+), 0 deletions(-) baz@bhost:/more/coding/git-tests/ask1$ git push https://[email protected]/shishani/dirasi.git master Password: Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 298 bytes, done. Total 3 (delta 2), reused 0 (delta 0) remote: bb/acl: shishani is allowed. accepted payload. To https://[email protected]/shishani/dirasi.git a053f28..6d0e236 master -> master baz@bhost:/more/coding/git-tests/ask1$ git status # On branch master **# Your branch is ahead of 'origin/master' by 1 commit.** <-- this does not reflect current state # nothing to commit (working directory clean) baz@bhost:/more/coding/git-tests/ask1$ git push Password: Everything up-to-date baz@bhost:/more/coding/git-tests/ask1$ git status # On branch master nothing to commit (working directory clean)
When the status says Your branch is ahead of 'origin/master' by 1 commit
, it actually does mean origin/master
. That is, there is pointer named origin/master
in your repo pointing to the commit which is the HEAD
of that remote branch
, and your master
is ahead of this commit.
For all the remotes that your repo recognizes, it creates a <remote>/<branchname>
pointer in the repo, if you pull/push/fetch. Its just a pointer to the commit, and if you try to checkout
that branch, you'd only be in a detached state.
Apparently, this pointer gets updated when you do git push
or git push origin master
, but explicitly pushing to a url would not update that pointer, and hence the status.
If you just do git fetch
or git pull
after pushing to the url, the status message will also disappear in that case.
NOTE: If you have multiple remotes, and you set your branch to track some other remote branch, like say upstream master
, your status message will in this case be, for example, Your branch is ahead of 'upstream/master' by 1 commit
. So its only the tracked remote branch that the comparison is done. See git config
to see what remote branch your current branch is tracking.
I believe you need to pull the change back in before git
will realize that the remote end has been updated. You can do this via a quick git pull
(or, as you show in your example, a git push
to the tracked origin).
You could also manually change the commit to which refs/remotes/origin
points.
It's not fair to expect the content tracker to recognize arbitrary remote synonyms for repositories; imagine if you had five different URLs which all were the same server-side repository. When you push to repo A, does that mean that your changes have been committed to repo B (the origin of your branch)? git has no way to know. Instead, it only updates the remote-head reference in two cases: a pull, and a push to the default destination.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With