Solving it

If found myself with a rather strange git problem. As far as I was aware, I was tracking a remote, however when ever I git a git pull, my bash prompt would show me as having commits outstanding.

[voddenr:~/repository] master(4)+i ± 

Looking at the commit tree, it would seem that origin/HEAD and origin/master have not been correctly updated:

*   f786359 - (HEAD -> master) Merge everything together. (3 hours ago) <Richard Vodden>
|
*   51955ca - Wrote some code. (4 hours ago) <Richard Vodden>
|\
| |
| * 81e4c19 - Update readme. (4 hours ago) <Richard Vodden>
| |
| * a84e10e - wip (15 hours ago) <Richard Vodden>
|/
|
*   2dcce03 - (origin/master, origin/HEAD) Some kind of merge message. (24 hours ago) <Richard Vodden>
|\
| |
| * f1622f9 - This is quite a boring message. (24 hours ago) <Richard Vodden>
| |
| * 2bbc060 - Even more exciting message. (25 hours ago) <Richard Vodden>
| |
| * 19756aa - Exciting commit message (25 hours ago) <Richard Vodden> 

Executing git remote -vv show origin suggests all is as it should be:

* remote origin
  Fetch URL: https://github.com/paulgibbs/behat-wordpress-extension
  Push  URL: https://github.com/paulgibbs/behat-wordpress-extension
  HEAD branch: master
  Local branches configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push': 
    master pushes to master (up to date) 

However git branch -a -vv show’s something amiss:

git remote -a -v -v shows:

* master                           ef786359 Merge everything together
  remotes/origin/HEAD              -> origin/master

This should show [origin/master] after the commit hash - which it clearly doesn’t. So whilst my master branch is set to push and pull to the right places, its not correctly set to track origin/master. However when I attempt to execute git branch --set-upstream-to origin master to fix that, Git replies with fatal: Cannot setup tracking information; starting point 'origin/master' is not a branch.

A quick google of that error message reveals this stackoverflow answer. It would seem that git remote set-branches --add origin master is the answer here. After executing it, git remote -a -v -v shows things are as they should be:

* master                 eef78635 [origin/master] Merge everything together
  remotes/origin/HEAD    -> origin/master

Similarly, git remote -vv show origin is looking better. A distinct learning point for me is that it now reports that it’s tracking - see lines 5 and 6.

* remote origin
  Fetch URL: https://github.com/paulgibbs/behat-wordpress-extension
  Push  URL: https://github.com/paulgibbs/behat-wordpress-extension
  HEAD branch: master
  Remote branch:
    master tracked
  Local branches configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push': master pushes to master (up to
  date) 

Following a sneaky git pull everything in the tree is as it should be. The pointers are all at the latest commit:

*   f786359 - (HEAD -> master, origin/master, origin/HEAD) Merge everything together. (3 hours ago) <Richard Vodden>
|
*   51955ca - Wrote some code. (4 hours ago) <Richard Vodden>
|\
| |
| * 81e4c19 - Update readme. (4 hours ago) <Richard Vodden>
| |
| * a84e10e - wip (15 hours ago) <Richard Vodden>
|/
|
*   2dcce03 - Some kind of merge message. (24 hours ago) <Richard Vodden>
|\
| |
| * f1622f9 - This is quite a boring message. (24 hours ago) <Richard Vodden>
| |
| * 2bbc060 - Even more exciting message. (25 hours ago) <Richard Vodden>
| |
| * 19756aa - Exciting commit message (25 hours ago) <Richard Vodden> 

Recreating it.

I believe that I don’t truly understand a problem unless I can re-create it. My first attempt was to delete my local remote tracking branch with git branch -d -r origin/master. This, however, showed a much more easily diagnosed output from git branch -a -vv:

* master                 eef78635 [origin/master: gone] Merge everything together

Similarly git remote -vv show origin implies that all will fix itself from here following a simple git pull:

* remote origin
  Fetch URL: https://github.com/paulgibbs/behat-wordpress-extension
  Push  URL: https://github.com/paulgibbs/behat-wordpress-extension
  HEAD branch: master
  Remote branch:
    master new (next fetch will store in remotes/origin)
  Local branches configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Next I tried git remote set-branches origin dev dev being another brand I picked more or less at random from the remote. This looked a good deal more promising, with git remote -vv show origin showing:

* remote origin
  Fetch URL: https://github.com/paulgibbs/behat-wordpress-extension
  Push  URL: https://github.com/paulgibbs/behat-wordpress-extension
  HEAD branch: master
  Remote branch:
    refs/remotes/origin/dev stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev    merges with remote dev
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

No luck, however, as when I inspect with git show-ref I can see that origin/master no longer exists. So right now I’m stuck. If anyone has any suggestions as to how to re-create the issue I came across - please do share in the comments below.