我在Git中创建了一个新分支:
推动它:
1
| git push origin my_branch |
号
现在假设有人在服务器上做了一些更改,我想从origin/my_branch中退出。我愿意:
但我得到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.
If you often merge with the same branch, you may want to
use something like the following in your configuration file:
[branch"my_branch"]
remote = <nickname>
merge = <remote-ref>
[remote"<nickname>"]
url = <url>
fetch = <refspec>
See git-config(1) for details. |
。
我了解到,我可以让它与:
1
| git branch --set-upstream my_branch origin/my_branch |
但是为什么我要为我创建的每个分支都这样做呢?如果我把my_branch推到origin/my_branch中,那么我会把origin/my_branch拉到my_branch中,这不是很明显吗?我如何才能将此设置为默认行为?
- branch.autosetupmerge的默认值意味着只有在从远程跟踪分支(例如/创建分支时,才会自动设置新分支的上游配置(请参见git config(1))。您可能正在从现有的本地分支创建分支。如果直接从远程分支的尖端进行有效分支(尽管在本地分支上),则可以使用git branch my_branch /自动设置上游配置。
- 仅供参考,不推荐使用--set-upstream选项。您应该使用--track或--set-upstream-to。
- 如果不推荐使用--set-upstream,那么git devs可能应该将其从运行git push时显示的帮助消息中删除,而不设置选项和上游?
- @克里斯托弗亨特,你的评论已经一年多了,它仍然是这么说的。这仅仅是一个草率的反馈,还是有一个技术上明智的理由让它保持在我们不知道的范围内?
- 对于其他正在寻找更新的一行程序的人(post git 2.0):BRANCH=$(git symbolic-ref --short HEAD) && git branch --set-upstream-to=origin/$BRANCH $BRANCH
- @克里斯托弗亨特:你的意思是埃多克斯1〔9〕而不是埃多克斯1〔7〕对吧?
- @拉什,不,我是说以东十一〔七〕号。具体来说,设置要推到的上游分支的现代用法是git push -u origin branchname,如@mark longair所述。对于git pull,-u做了不同的事情,我发现我宁愿每次都指定要从哪个分支中提取什么。
- @Christopherhunter git branch --set-upstream被否决。git push --set-upstream不是。
- @Ramrachum考虑将正确答案更改为stackoverflow.com/a/22933955/4035845
一个不依赖于记住git branch --set-upstream1的语法的快捷方式是:
1
| git push -u origin my_branch |
…你第一次推那根树枝。或者,将当前分支推送到同名分支(别名很方便):
号
你只需要使用一次-u,这就建立了你的分支机构和origin的分支机构之间的联系,就像git branch --set-upstream一样。
就个人而言,我认为在您的分支和远程分支之间明确地建立这种关联是一件好事。对于git push和git pull来说,这些规则不同只是一个遗憾。
1这听起来可能很傻,但我经常忘记指定当前分支,假设这是默认的-它不是,结果是最令人困惑的:)
更新2012-10-11:显然我不是唯一一个发现容易出错的人!感谢VONC指出,Git 1.8.0引入了更明显的git branch --set-upstream-to,如果您在my_branch分支上,可以使用如下:
1
| git branch --set-upstream-to origin/my_branch |
…或选择卖空:
1
| git branch -u origin/my_branch |
。
Git 1.8.0的发行说明(候选版本1:
It was tempting to say git branch --set-upstream origin/master, but that tells Git to arrange the local branch origin/master to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new --set-upstream-to (with a short-and-sweet -u) option instead.
号
- 还要注意,即使您第一次按下时忘记了-u,也可以使用该标志再次运行push,它将开始跟踪。
- 这些都不满足使用没有参数的git push的用例。当我第一次将新的分支移动到远程时,仍然需要记住"git push-u origin my branch"。
- @当你创建一个远程跟踪本地分支时,你告诉Git你想创建一个新的分支,然后你命名远程回购和分支。当您创建跟踪的远程分支时,您告诉Git您想要创建一个新的分支,并命名远程repo和分支。在这两种情况下,Git都会正确地默认分支名称。本地化的便利性,如您所要求的,正是Git别名的用途。
- 自我提醒:对第一个git push -u origin master的更完整的解释:stackoverflow.com/a/17096880/6309
- 我也不喜欢记住这种语法,所以我创建了以下别名:alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"。
- 在这里,我总是用我的第一个推动力:git push -u origin --all,这使我的生活更容易…
- 这很好,但我仍然认为手术室的投诉是有效的。您启动一个本地分支,处理它,将它推到源站以共享(没有参数);为什么不应该设置上游?当把一个新的分支推到一个远程的时候,出于某种原因不需要设置上游吗?
- @Lillialexis,谢谢你的提示。我讨厌每次都看到Branch foo set up to track remote branch foo from origin.,所以我提出了alias gu="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }') >> /dev/null",你仍然可以看到输出,但你看不到多余的信息。
- @zamith在下面给出了一个更正确的问题答案。设置全局配置,这样就不必键入任何内容。
- 因为我在这里没有看到它的声明,所以您也可以定义要关联的本地和远程分支,而无需像这样签出所需的跟踪分支。git branch --set-upstream 。例如,git branch --set-upstream master origin/production应产生Branch master set up to track remote branch production from origin.。
- @我想知道,如果不使用现在已被弃用的--set-upstream,这是否可能,以及如何可能?
- @piotrodoprogost 1.8+的语法是git branch [-u|--set-upstream-to],用于替代。如答案所述。我的意见是在不签出所需跟踪分支的情况下分配关联分支。所以git branch --set-upstram-to=origin/production master或git branch -u origin/production master。
- 另一个捷径/调整是git push -u origin HEAD…这允许您跳过输入分支名称。你需要确保你在正确的分支上。
- 完全不值得开发时间。为什么它不能自动完成呢?
- 讽刺的是,这并不能回答这个问题。他们问他为什么要这么做。什么吉特天才认为这是一个聪明的想法,扔掉上游信息克隆。这个开发团队已经有了自己的头了,他们需要雇佣一个用户界面专家,因为他们自己不能正确地得到它。
- 你在Git 2.15.1上说的可能不正确,我得到了MacBook Pro:AutoService$Git Branch-U Origin/Restrict错误:请求的上游分支"Origin/Restrict"不存在提示:提示:如果你计划基于上游提示进行工作:远程已经存在的分支,你可能需要提示:运行"git fetch"来检索它。提示:提示:如果您计划推出一个新的本地分支,提示:将跟踪其远程对应分支,您可能需要使用提示:"git push-u"在推送时设置上游配置。
- @用户204069您是否尝试过收到的错误消息建议的操作?(也就是说,在尝试该命令之前运行git fetch origin,如果分支restrict已经存在于原始存储库中,或者使用git push -u origin restrict来推动它,在这种情况下,您不需要git branch -u。)
- @Garyo最好不要弄乱远程存储库。请参阅上面VONC提到的这个答案stackoverflow.com/a/17096880/2641825中为什么需要git push -u origin master的解释。
你可以少打字就可以做到这一点。首先,改变你的推送方式:
1
| git config --global push.default current |
。
这将推断origin my_branch部分,因此您可以:
这两者都将创建具有相同名称的远程分支并对其进行跟踪。
- 在为新创建的存储库中新创建的分支运行git push -u时,Git怎么能推断origin?是否假设存储库已被克隆,因此当前分支的远程设置为origin?
- git push -u将跟踪设置为具有相同名称的本地分支,甚至不是远程分支。
- 你设置了push.default配置吗?另外,你有遥控器吗?
- 这应该是默认设置。Git中有这么多东西,如果它只是附带了更好的默认值,就可以更加用户友好。
- 请注意,"current"比使用"simple"执行相同的操作稍不安全,请参见stackoverflow.com/questions/23918062/&hellip;
- 这在没有-u的情况下也有效。
- 是的,但是当你试图去执行任务时,你必须指明从哪里开始。-u在原始和本地回购之间建立分支跟踪。
- @莫特拉德,它也没有回答操作的实际问题,这是(意译)"如何使git默认为跟踪远程分支,当你第一次将本地分支推到远程时创建的远程分支?".-u选项很好,但首先不将其作为默认行为的理由是什么?
- @piotrdorgost添加phreekhead-answer,在克隆repo时,git还自动添加带有名称origin的远程URI。我认为origin是远程存储库的一些默认值
- @是的,你可以随意命名一个遥控器。origin恰好是git使用的默认值。
- 还有一个这样的答案可以解释,simple是默认的配置值,所以初学者不会把事情搞砸。因此,对于更高级的用法,将其设置为current,那么就有意义了,因为它是simple模式,并且添加了创建上游分支(如果不存在的话)。
- @pstryk是的,它在没有-u的情况下也可以工作,但是它不会跟踪upsteam分支的任何更改,这取决于您是否关心这个……
- 我试过这篇文章中的每一个答案(很多都不起作用)。我认为这是最简单的方法。
- 这应该是公认的答案-设置此默认值将使git push像他们预期的那样在新的本地分支中工作。如前所述,这将在没有-u的情况下起作用。
- 虽然稍微方便,但这仍然要求对第一个和唯一一个push运行不同的命令,这就破坏了这个问题的全部观点。简而言之,没有好的答案。面对广泛的社区异议,Git开发人员坚持保留这种尴尬的用户体验(aux)是…开明。令人沮丧。(大多令人沮丧。)
- 如果您的计算机中设置了多个Git项目,为什么要使用全局配置?
- @您可以将它作为每个项目的配置添加。但是,我希望这是我所有项目中的默认行为,因此是全局设置。
你可以简单地
1
| git checkout -b my-branch origin/whatever |
首先。如果您将branch.autosetupmerge或branch.autosetuprebase设置为always(默认为true,my-branch将自动跟踪origin/whatever。
见git help config。
- 这会产生"致命:无法同时更新路径并切换到分支"我的分支"。
- @卡尔,这个罕见的错误在这里解释。
- 顺便说一下,我通常只选git checkout -t origin/whatever,它也选择whatever作为新的分支名称。非常方便!
- @这是一个理想的,但几乎不一致。该标志应称为-u/--set-upstream。
- 当我试图创建一个新的分支时,git checkout -t origin/whatever对我不起作用:fatal: Cannot update paths and switch to branch 'whatever' at the same time.。
- git checkout -b my-branch origin/whatever也有同样的错误(我试图创建一个本地或远程上不存在的新分支):fatal: Cannot update paths and switch to branch 'whatever' at the same time.。
- branch.autosetupmerge = false也不起作用。它将上游跟踪设置为本地whatever分支,而不是远程origin/whatever分支。
您可以通过两种方式简化上游设置。首先,创建分支时:
1
| git branch -u origin/my-branch |
。
或者在创建分支之后,可以使用此命令。
1
| git push -u origin my-branch |
您还可以在单个命令中分支、签出和设置上游:
1
| git checkout -b my-branch -t origin/my-branch |
。
我个人的偏好是通过两步命令来完成:
1 2
| git checkout -b my-branch
git push -u origin my-branch |
号
- 回答得很好!解决两个常见的用例。运行git branch -u origin/my-branch之后,我可以运行git pull来删除我的更改。
- 这需要被接受的答案
- "git checkout-b my branch-t origin/my branch"如果"origin/my branch"还不存在,这将不起作用。
- 如果没有-b my-branch,您实际上可以只做git checkout -t origin/my-branch,它只会自动推断my-branch的本地分支名称。然而,正如@spongman所提到的,如果origin/my-branch不首先存在,这个命令就不起作用。
- 是的,会在wisbacky工作,-t工作得很好。但就我个人而言,即使在我写下回复两年之后,我还是更喜欢用checkout-b和push-u分为两行。它更明确,而且在checkout-b上没有错误,当我没有远程设备的时候-这在实验时经常发生。)
- git push -u origin/my-branch在我和fatal: 'origin/my-branch' does not appear to be a git repository之间失败了。本工程:git push -u origin my-branch。
- 你是绝对正确的@stason。我的错,应该有个空间。我想我在15年打字太快了:)不过我还是有我的个人偏好。不知道为什么,让我觉得我更能控制自己。
这是我最常用的。
1 2 3 4 5 6 7 8 9 10
| $ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
... |
另外,在你的终端里输入脏话也很有趣。
- 这需要移植到Windows(或者至少是Git-Bash)。
您可以使用:
git config --global branch.autosetupmerge always
号
它将在每次创建或签出新分支时链接上游分支。
参见https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/
这也适用于autosetuprebase,如果您遵循一个更注重重新平衡的工作流,但不要使用它,除非您知道自己在做什么,因为它将默认您的拉行为重新平衡,这可能会导致奇怪的结果。
- 不起作用,我仍然收到--set-upstream的信息
- @多利安,你必须在创建分支之前设置这个。请参阅stackoverflow.com/a/9753268/263998
- 我得到:致命的:你当前分支的上游分支与你当前分支的名称不匹配…
- 但这不会将跟踪分支设置为具有相同分支的远程分支,而是设置为当前本地分支。因此,当您执行push操作时,它将尝试在创建新分支之前将数据推送到本地分支。
- 这甚至比默认的行为更奇怪。如果你把工作建立在一个分支的基础上,它的行为真的很奇怪。
顺便说一下,将当前分支推送到具有相同名称的远程服务器的快捷方式:
1
| $ git push -u origin HEAD |
号
1
| git branch --set-upstream-to=origin/master<branch_name> |
号
我个人在bash中使用以下别名
在~/.gitconfig文件中
1 2
| [alias]
pushup ="!git push --set-upstream origin $(git symbolic-ref --short HEAD)" |
。
在~/.basehrc或~/.zshrc文件中
1 2 3 4
| alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull" |
- 我只需要hcange.gitconfig,然后就可以使用命令git pushup,它总是将当前分支推到源站。我可以用git pushup代替git push??
您还可以显式地告诉git pull要拉的远程分支(如错误消息中提到的那样):
埃多克斯1〔15〕
但是,要小心:如果您在一个不同的分支上并执行显式拉操作,那么您拉的refspec将合并到您所在的分支中!
值得一提的是,如果您试图跟踪远程上已经存在的分支(如origin/somebranch),但尚未在本地签出该分支,则可以执行以下操作:
1
| $ git checkout --track origin/somebranch |
。
注意:"-t"是"--track"选项的缩短版本。
这会立刻建立起相同的联系。
- 你可以直接到分行结账。因此,git checkout somebranch是等效的。
- @扎米特不是只有在事先打电话给以东十一〔十七〕之后才行吗?
- 不是很快,但是的,您需要在本地回购上参考该分支机构,这在您调用git fetch或git pull时发生。不过,我从未发现这是个问题。
我使用这个Git别名,而不是每次从Git复制/粘贴建议:https://git.github.com/ekilah/88a880c84a50b73bd306
源复制如下(添加到您的~/.gitconfig文件中):
1 2
| [alias]
pushup ="!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream" |
号
您可以设置一个非常好的别名来处理这个问题,而不必使用过于冗长的语法。
我在~/.gitconfig中有以下别名:
1
| po ="!git push -u origin "$(git rev-parse --abbrev-ref HEAD)"" |
在对新分支进行提交之后,只需键入以下命令即可推送新分支:
号
- 为什么是po?push origin号?如果多次运行,会发生什么?
- 是的,就像推原点一样。如果多次运行,则不会发生任何情况。我还有一个git push -f别名,设置为git pf,所以一旦源代码被推后,我就使用它。
- 参见Djanowski的评论,您可以直接使用HEAD。
对于那些寻找与git pull一起使用的别名的人,我使用的是:
1
| alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}" |
。
现在只要你得到:
1 2 3
| $ git pull
There is no tracking information for the current branch.
... |
。
只需运行:
1 2 3
| $ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull |
你可以走了
- 别名不错,我将在我的工作流中测试它。+ 1
- 别名不错,我将在我的工作流中测试它。+ 1
你也可以做EDOCX1[1]
因为Git有很酷的能力将不同的分支推/拉到不同的"上游"存储库。甚至可以使用不同的存储库来推拉同一个分支。这可以创建一个分布式的、多层次的流,我可以看到这在Linux内核等项目中非常有用。Git最初是为在那个项目上使用而建造的。
因此,它不会假设分行应该跟踪哪个回购。
另一方面,大多数人不以这种方式使用git,因此它可能是默认选项的一个很好的例子。
Git通常是相当低的级别,这可能会令人沮丧。然而,还有一些GUI,如果您仍然想从shell中使用它,那么编写助手脚本应该很容易。
如果以下内容不起作用:
1
| git config --global push.default current |
号
您还应该更新项目的本地配置:
1
| git config --local push.default current |
号
您的项目可能有本地Git配置。然后一个简单的
号
应该在不需要一直设置上游的情况下工作。
因为这个问题,我重新发现了legit(仅限OS X)。现在,当分支时,我只使用这两个命令:
埃多克斯1〔3〕将指定的分支发布到远程。(别名:pub)
埃多克斯1〔5〕从远程删除指定的分支。(别名:unp)
Sublimegit默认带有legit支持,这使得整个分支例程和按ctrl-b一样容易。
我们使用phabricator,不使用git。我必须创建在Linux/Mac上工作的bash别名
1 2 3 4 5 6
| vim ~/.bash_aliases
new_branch() {
git checkout -b"$1"
git branch --set-upstream-to=origin/master"$1"
} |
。
节约
1 2 3
| source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull |
这里有一个git push的bash别名,它可以安全地运行于每次推送中,并自动在第一次推送的设置上游和之后的正常推送之间切换。
1
| alias gpu='[[ -z $(git config"branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push' |
。
原岗位