Why do I need to explicitly push a new branch?

I am new in git and I am practicing. I created a local branch but I saw that when I did git push my branch was not uploaded to the repository. I had to actually do: git push -u origin --all .
Why is this? Isn't a branch a new change to be pushed by default? Why do I need to run the second command?


The actual reason is that, in a new repo (git init), there is no branch (no master , no branch at all, zero branches)

So when you are pushing for the first time to an empty upstream repo (generally a bare one), that upstream repo has no branch of the same name.

And:

  • the default push policy was ' matching ' (push all the branches of the same name, creating them if they don't exist),
  • the default push policy is now ' simple ' (push only the current branch, and only if it has a similarly named remote tracking branch on upstream, since git 1.7.11)
  • In both cases, since the upstream empty repo has no branch:

  • there is no matching named branch yet
  • there is no upstream branch at all (with or without the same name! Tracking or not)
  • That means your local first push has no idea:

  • where to push
  • what to push (since it cannot find any upstream branch being either recorded as a remote tracking branch, and/or having the same name)
  • So you need at least to do a:

    git push origin master
    

    But if you do only that, you:

  • will create an upstream master branch on the upstream (now non-empty repo): good.
  • won't record that the local branch ' master ' needs to be pushed to upstream ( origin ) ' master ' (upstream branch): bad.
  • That is why it is recommended, for the first push, to do a:

    git push -u origin master
    

    That will record origin/master as a remote tracking branch, and will enable the next push to automatically push master to origin/master .

    git checkout master
    git push
    

    And that will work too with push policies ' current ' or ' upstream '.
    In each case, after the initial git push -u origin master , a simple git push will be enough to continue pushing master to the right upstream branch.


    You don't, see below

    I find this 'feature' rather annoying since I'm not trying to launch rockets to the moon, just push my damn branch. You probably do too or else you wouldn't be here!

    Here is the fix: if you want it to implicitly push for the current branch regardless of if that branch exists on origin just issue this command once and you will never have to again anywhere:

    git config --global push.default current
    

    So if you make branches like this:

    git checkout -b my-new-branch
    

    and then make some commits and then do a

    git push -u
    

    to get them out to origin (being on that branch) and it will create said branch for you if it doesn't exist.

    Note the -u bit makes sure they are linked if you were to pull later on from said branch. If you have no plans to pull the branch later (or are okay with another one liner if you do) -u is not necessary.


    Output of git push when pushing a new branch

    > git checkout -b new_branch
    Switched to a new branch 'new_branch'
    > git push
    fatal: The current branch new_branch has no upstream branch.
    To push the current branch and set the remote as upstream, use
    
        git push --set-upstream origin new_branch
    

    A simple git push assumes that there already exists a remote branch that the current local branch is tracking. If no such remote branch exists, and you want to create it, you must specify that using the -u (short form of --set-upstream ) flag.

    Why this is so? I guess the implementers felt that creating a branch on the remote is such a major action that it should be hard to do it by mistake. git push is something you do all the time.

    "Isn't a branch a new change to be pushed by default?" I would say that "a change" in Git is a commit. A branch is a pointer to a commit. To me it makes more sense to think of a push as something that pushes commits over to the other repositories. Which commits are pushed is determined by what branch you are on and the tracking relationship of that branch to branches on the remote.

    You can read more about tracking branches in the Remote Branches chapter of the Pro Git book.

    链接地址: http://www.djcxy.com/p/26098.html

    上一篇: git分支的对面

    下一篇: 为什么我需要明确推送新分支?