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:
matching
' (push all the branches of the same name, creating them if they don't exist), 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:
That means your local first push has no idea:
So you need at least to do a:
git push origin master
But if you do only that, you:
master
branch on the upstream (now non-empty repo): good. 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分支的对面
下一篇: 为什么我需要明确推送新分支?