Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git: Local-tracking, add new branch?

Tags:

git

github

I am trying to clean up my git repository and

  1. Create a new branch that mirrors my production (master) branch.
  2. Remove any unnecessary branches, remote or local.
  3. Make my local branches local-tracking branches (idk if i need to do this, benefits?)
  4. Have a branch for each stage of my workflow i.e. one branch for local & dev (dev), 1 branch for staging (staging), and 1 branch for production (production). Local and dev can share the same working branch, but separate branches for staging and production.

From the command line you can see my environment.

$ git remote
dev
origin
production
staging

$ git branch -r
dev/dev
origin/HEAD -> origin/master
origin/dev
origin/master
production/master
wpengine-findcra/master

$ git branch -vv
dev                   xxxxxxx <comment>
*master               xxxxxxx [origin/master] <comment>
production/staging    xxxxxxx [remotes/production/master] <comment>
staging/master        xxxxxxx <comment>

I have 4 locations I work out of. Code flows from 1 to 4.

  1. my local machine
  2. development server
  3. staging server
  4. production server

I want to add a new branch specifically for the staging server, and right now I want it to mirror the production (master) branch. But I run into this error and I don't know what to do.

$ git checkout master
$ git branch staging
error: there are still refs under 'refs/heads/staging'
fatal: Failed to lock ref for update: Is a directory

My code is up to date under origin/master and dev/dev.

like image 795
italiansoda Avatar asked Nov 18 '15 16:11

italiansoda


1 Answers

If you have a branch with a name that contains a slash, git will create (in .git/refs/heads) a directory named like the name of your branch until the slash. In that directory it will place the refs for the branch itself. So the directory .git/refs/heads/staging/ exists and contains a file "master" due to your branch staging/master.

When you try to create the branch "staging", git will try to create the file .git/refs/heads/staging. As this already exists but is a directory, this will fail. Thus you cannot have two branches with these names in your repository.

In more recent versions of git the error message will look like this:

fatal: cannot lock ref 'refs/heads/staging': 'refs/heads/staging/master' exists; cannot create 'refs/heads/staging'
like image 135
lucash Avatar answered Nov 02 '22 02:11

lucash