Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I stop pushing to multiple remote branches in git? (aka, How do I untrack remote git branches?)

Tried to use what's here, but that doesn't solve things for me.

I've got a local repo in git, cloned from a remote repo, development. I branch locally to play around with a new feature in a branch called newBranchName and call git push origin newBranchName to set up the new branch on the remote repo.

Now when I try to push, git seems to be pushing my newBranchName local branch into everything the old branch tracked as well. I want that to stop.

Here's an extended sample of what I mean. I'm going to create a local branch, add a file, commit locally, then push to a new branch on the remote server. So far, so good.

Administrator@BOXEN /path/to/working/dir (oldBranch)
$ git branch testingStuff

Administrator@BOXEN /path/to/working/dir (oldBranch)
$ git checkout testingStuff
Switched to branch 'testingStuff'

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ vim test.txt

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git add test.txt

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git commit -a
[testingStuff 11468d8] Testing git; can trash this branch.
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 test.txt

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git push origin testingStuff
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 299 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://url/to/remote/repo.git
 * [new branch]      testingStuff -> testingStuff

Now, I'll edit that test.txt file, commit the change, and push. This is what confuses me.

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ vim test.txt

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git commit -a
[testingStuff 2be7063] more testing git
 1 files changed, 1 insertions(+), 0 deletions(-)

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://url/to/remote/repo.git
   11468d8..2be7063  testingStuff -> testingStuff
 ! [rejected]        oldBranch -> remoteTrackedByOldBranch (non-fast-forward)
error: failed to push some refs to 'http://url/to/remote/repo.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

I want to continue pushing to testingStuff remotely, but want to stop pushing to remoteTrackedByOldBranch when I type git push. I don't want to delete any branch -- seems a number of answers to similar questions suggest deleting rather than untracking. Nor do I want to know how to push to a specific branch only by explicitly naming it in the git push command. Too many muscle-memory mistakes that way. I want git push to push to origin/testingStuff only.

I've already unsmartly (a word which proves itself) butchered my .git/config trying to accomplish this, and it's still pushing to remoteTrackedByOldBranch.

EDIT: Here's what my .git/config file looks like after doing the above:

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        hideDotFiles = dotGitOnly
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = http://url/to/remote/repo.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "oldBranch"]
        remote = origin
        merge = refs/heads/oldBranch

Nothing about the testingStuff branch in there.

EDIT: git branch -avv output:

Administrator@BOXEN /path/to/working/dir (testingStuff)
$ git branch -avv
  master                                 721aa61 initial setup
  projectFork1                           e132f5f Fixed Construction grid labels getting sliced.
  projectFork2                           1d20317 initial load
  oldBranch                              1d20317 initial load
* testingStuff                           192f622 Still testing
  remotes/origin/HEAD                    -> origin/master
  remotes/origin/empty                   ec1c694 initial setup
  remotes/origin/joeUserFork1            771f43e Initial Load
  remotes/origin/master                  721aa61 initial setup
  remotes/origin/projectFork1            e132f5f Fixed Construction grid labels getting sliced.
  remotes/origin/oldBranch               1d20317 initial load
  remotes/origin/joeUserFork2            dc605e8 What was sent initially.
  remotes/origin/testingStuff            192f622 Still testing
  remotes/origin/upload_master           0d8c440 Initial Load
like image 239
ruffin Avatar asked May 15 '12 16:05

ruffin


2 Answers

The tracking relationship with a remote branch is maintained in the branch.<BRANCHNAME>.remote and branch.<BRANCHNAME>.merge configuration items associated with a particular branch. You can see the current configuration like this:

git config --get-regexp 'branch.remoteTRackedByOldBranch.*'

And you can delete the configuration like this:

git config --remove-section branch.remoteTrackedByOldBranch

[Note that this will remove all the configuration associated with this branch, but it is unlikely there is anything other than the remote and merge settings. You can obviously accomplish the same thing by hand-editing the .git/config file.]

After this change git push should no longer attempt to push that branch to a remote.

like image 26
larsks Avatar answered Oct 11 '22 14:10

larsks


Only push the branch you're on

By default, git will push all of your tracking branches whenever you issue a git push with no arguments. to make it only push the branch you're on

git config push.default upstream # git 1.7.10
git config push.default tracking # older vesions use "tracking" instead of "upstream"

if you want git to always work like that - you can use the --global switch or simply edit your ~/.gitconfig file to suit.

Stop tracking a remote branch

git's config is just a file. Quite often the easiest way to investigate and or fix your git config - is simply to open your .git/config file and edit it

e.g. if you have a section like this in your .git/config file:

[branch "develop"]
    remote = origin
    merge = refs/heads/develop
    rebase = true

and you make it:

[branch "develop"]
    rebase = true

your branch nolonger tracks anything. You can also just delete the whole section and git will act the same.

like image 110
AD7six Avatar answered Oct 11 '22 15:10

AD7six