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

2

6

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
Perdu answered 15/5, 2012 at 16:30 Comment(0)
K
15

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.

Kweilin answered 15/5, 2012 at 16:50 Comment(4)
Well, that's the strange part. In config, I have [branch master], and (in the scenario above), [branch oldBranch], but nothing for testingStuff, my new branch. I'm assuming your develop should represent testingStuff in my scenario, above. I don't have rebase=true in there, but I'm assuming that's just particular to your workflow. I'll paste my config into my question.Perdu
$ git config set push.default upstream gives error: key does not contain a section: set. I'll Google around.Perdu
"set" was a mistake - I assume you immediately found e.g. thisKweilin
Yep, sorry -- git config push.default upstream followed by git push and an error, followed by git push --set-upstream origin testingStuff to explicitly set an upstream branch, then git push works just like I'd like. I'd still like to get larsks' answer to work, though.Perdu
M
3

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.

Mackinaw answered 15/5, 2012 at 16:43 Comment(6)
Even after removing everything headed by [branch X] (master & oldBranch), I still get ! [rejected] oldBranch -> remoteTrackedByOldBranch (non-fast-forward). At what point does config get refreshed? I've opened new terms for git (using git with MINGW32 for Windows) and nothing changes. The first command, git config --get-regexp 'branch.remoteTRackedByOldBranch.*' does return nothing, fwiw.Perdu
What does git branch -avv show? Also, does the .git/config posted in your answer reflect the current state of the configuration? If not, maybe update it and add the output of the branch command.Mackinaw
The "hypothetical scenario" approach and "real life" are conflating a little in the results, but I've posted the -avv output with a little name cleaning. The .git/config was changed only to hide paths.Perdu
In your example above, I note that your config file still shows the configuration for oldBranch (the last three lines). That would lead git push to try sending oldBranch.Mackinaw
No no, my fault. It is not the post-edit state of the config. That's the state at the end of my scenario, before the editing described in the first comment to your answer. After your answer, I blasted [branch master] and [branch oldBranch] and the lines below them (merge and remote) completely, and, as above, still had the ! [rejected] issue.Perdu
Thanks for the help. Not sure why editing config didn't work as expected. I'll revisit when it bugs me, but for now AD7six' route forces the behavior we're setting up The Right Way here.Perdu

© 2022 - 2024 — McMap. All rights reserved.