ChatGPT解决这个技术问题 Extra ChatGPT

没有指定分支的“git push”的默认行为

我使用以下命令推送到我的远程分支:

git push origin sandbox

如果我说

git push origin

这是否也会在我的其他分支中推送更改,还是只更新我当前的分支?我有三个分支:masterproductionsandbox

git push 文档对此不是很清楚,所以我想澄清一下。

以下 git push 命令准确更新了哪些分支和远程?

git push 
git push origin

上面的 origin 是一个遥控器。

我知道 git push [remote] [branch] 只会将该分支推送到远程。

关于一般差异工具的配置,以及新脚本 git difftool,我在另一个 SO 问题中添加了一个新答案:stackoverflow.com/questions/255202/…
我做了一个关于 git push 令人惊讶的行为的 blog post,这可能很有趣
@Mark:在其他工作中,仅将当前分支推送到其跟踪的上游。好的。
help.github.com/articles/pushing-to-a-remote 将此链接放在这里,以便立即帮助像我这样的新手

1
17 revs, 13 users 30%

您可以通过在 git 配置中设置 push.default 来控制默认行为。从 the git-config(1) documentation

push.default

定义如果命令行上没有给出 refspec、远程中没有配置 refspec 并且命令行上给出的任何选项都没有暗示 refspec 时 git push 应该采取的操作。可能的值为:

无:不要推任何东西

匹配:(Git 2.0 之前默认)推送所有匹配的分支 两端同名的所有分支都被认为是匹配的。

上游:将当前分支推送到其上游分支(跟踪是上游已弃用的同义词)

current:将当前分支推送到同名分支

简单:(Git 1.7.11 新增,Git 2.0 后默认)喜欢上游,但如果上游分支的名称与本地不同,则拒绝推送 这是最安全的选择,非常适合初学者。

simple、current 和 upstream 模式适用于那些在完成工作后想要推出单个分支的人,即使其他分支尚未准备好推出

命令行示例:

查看当前配置:

git config push.default

要设置新配置:

git config push.default current

值得注意的是,这是 v1.6.3 中的新功能:kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
这个“push.default”是处理多个存储库的最棒的事情。将其设置为“跟踪”,一切都很好。结合 branch --set-upstream 这些使推拉方式更方便。
“跟踪”是“上游”的已弃用同义词:kernel.org/pub/software/scm/git/docs/git-config.html
值得注意的是,从 Git 1.7.11 开始,有一个新的 simple 模式。此模式旨在将来成为默认模式。 simpleupstream 类似,但与 current 类似,要求两端的分支名称相同。
值得注意的是,从 Git 2.0 开始,simple 行为现在是默认行为。
C
Christoffer

您可以使用 push.default 为您的 git 设置默认行为

git config push.default current

或者如果您有很多存储库并且想要所有存储库都一样

git config --global push.default current

此设置中的 current 意味着默认情况下,您只会在执行 git push 时推送当前分支

其他选项包括:

nothing :不要推任何东西

匹配:推送所有匹配的分支(默认)

tracking : 将当前分支推送到它正在跟踪的任何地方

current : 推送当前分支

更新 - 执行此操作的新方法

从 Git 1.7.11 开始,请执行以下操作:

git config --global push.default simple

这是一个引入的新设置,其工作方式与当前相同,据传闻将从 v 2.0 开始默认为 git


是的,我阅读了您所指的答案,但该答案仅说明要做什么而不是如何去做。所以我添加了我的答案,所以设置它所需的所有信息都在同一页面上。
好的;最好建议对上述帖子进行编辑,因为没有人会看到您的答案,因为它不太可能获得尽可能多的选票
一个人将如何拉到当前分支? git拉起源?
d
davr

git push origin 会将所有更改推送到在 origin 具有匹配远程分支的本地分支上至于 git push

像 git push 一样工作,其中 是当前分支的远程(或原点,如果当前分支没有配置远程)。

来自 git-push man page 的示例部分


是的,这很清楚。我可能正在运行旧版本的 git (1.6.1.1 Mac OS X),它在手册页中没有这些示例。
可能我正在运行 1.6.3.1。我确实在我链接的网站上找到了它。
因此,在我的情况下,所有本地分支都具有相同的远程“来源”,“git push”将与“git push origin”完全相同,后者只会推送在远程具有相应分支的本地分支。
@Debajit 对了!顺便说一句,很好的问题。我一直认为 git push 只会推送当前分支。显然不是!很高兴知道。
这个问题很老,但对于任何新的人来说,@docgnome 是对的。只需运行 'git push origin' 将推送所有分支,而不仅仅是当前分支。使用 'git push -f -v -n origin development' 强制推送一个名为 development 的分支。使用 -n 标志来模拟 git push 结果,以便您可以提前看到哪些分支会受到影响。如果看起来不错,则运行“git push -f -v origin development”。这可能有用stackoverflow.com/questions/3741136/git-push-f-vs
n
neoneye

我只是将我的代码提交到一个分支并将其推送到 github,如下所示:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

你可以将提交压缩为`git commit -am"..."`
这个答案和问题有关系吗?? :?
看起来每个人都刚刚决定给出一个与 git 相关的随机答案
M
Mukesh Chapagain

以下是关于 Git Push 的非常方便实用的信息:Git Push: Just the Tip

git push 最常见的用途是将本地更改推送到公共上游存储库。假设上游是一个名为“origin”的远程(如果您的存储库是一个克隆,则为默认远程名称)并且要更新到/来自的分支名为“master”(默认分支名称),这是通过以下方式完成的:{ 1}

git push origin 会将所有本地分支的更改推送到源远程的匹配分支。

git push origin master 会将更改从本地 master 分支推送到远程 master 分支。

git push origin master:staging 会将更改从本地主分支推送到远程暂存分支(如果存在)。


git push origin branch_name 出于某种原因,不仅推送了 branch_name 分支,还推送了我的其他本地分支(git 版本 1.9.1)。
git push origin master:staging 是一个很棒的隐藏宝石!
V
VonC

(2012 年 3 月)
注意:默认的“matching”政策可能很快会改变
(有时在 git1.7.10+ 之后)

请参阅“Please discuss: what "git push" should do when you do not say what to push?

在当前设置下(即 push.default=matching),不带参数的 git push 将推送本地和远程存在的所有同名分支。当开发人员推送到他自己的公共存储库时,这通常是合适的,但在使用共享存储库时如果不危险,可能会令人困惑。建议将默认值更改为“上游”,即仅推送当前分支,并将其推送到 git pull 将从中拉出的分支。另一个候选人是“当前”;这只会将当前分支推送到同名的远程分支。到目前为止讨论的内容可以在这个线程中看到:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

之前的相关讨论包括:

http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541

http://thread.gmane.org/gmane.comp.version-control.git/166743

要加入讨论,请将您的消息发送至:git@vger.kernel.org


M
Mat Schaffer

我只是把它放在我的 .gitconfig 别名部分并喜欢它的工作原理:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

将使用 git pub 将当前分支推送到 origin 或使用 git pub repo-name 推送另一个 repo。可口。


这很好,但不幸的是假设分支在另一个存储库上具有相同的名称。请改用 git push -u --repo="origin" $1;。它工作得很好,除非您推送到另一个存储库,分支名称将是另一个存储库使用的名称,而不是您从中推送的名称
嘿谢谢!让我想做一个更完整的版本,在推送之前检查跟踪状态。但我现在会坚持使用我的,因为我很少在 repos 之间有不同的分支名称。
C
Community

您可以使用命令推送当前分支

git push origin HEAD

(取自 here


k
kenorb

您可以在 .gitconfig 中更改该默认行为,例如:

[push]
  default = current

要检查当前设置,请运行:

git config --global --get push.default

C
Cody Caughlan

git push 将尝试将所有本地分支推送到远程服务器,这可能是您不想要的。我有几个便利设置来处理这个问题:

适当地为“gpull”和“gpush”别名:

在我的 ~/.bash_profile

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

因此,执行“gpush”或“gpull”将只推送我的“当前”分支。


如果您总是想要 gpush 的行为,您还可以设置 remote.origin.push=HEAD(例如“git config remote.origin.push HEAD”),如 git-push 手册页的示例部分所述。
如果您查看“Brian L”的上述帖子,则没有必要这样做。
是的,因为没有等价物。对于拉拉。默认
M
Mark Fisher

比起使用别名,我更喜欢创建 git-XXX 脚本,这样我可以更轻松地对它们进行源代码控制(我们的开发人员在他们的路径上都有一个特定的源代码控制目录来处理这类事情)。

此脚本(称为 git-setpush)会将 remote.origin.push 值的配置值设置为仅推送当前分支的值:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

请注意,当我们使用 Gerrit 时,它将目标设置为 refs/for/XXX 以推送到审查分支。它还假设 origin 是您的远程名称。

在签出分支后调用它

git checkout your-branch
git setpush

它显然也可以适应结帐,但我喜欢 do one thing and do it well 的脚本


为 gerrit 使用设置 remote.origin.push 的好主意。我的本地功能分支 feature/fix_fubar 都指向更通用的上游分支,例如 masterdevelop,因此这将指向错误的上游。 gerrit 控制的存储库的本地流程是什么样的?
如果您在 gerrit 上只有一个“目标”分支,只需尝试 git config remote.origin.push HEAD:refs/for/master
M
MichaelMoser

我已将以下函数添加到我的 .bashrc 文件中以自动执行这些任务。它执行 git push/git pull + 当前分支的名称。

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}

k
kobi.kadosh

git 2.37.0 中的新配置

运行以设置自动设置远程而不是更改推送默认行为

git config --global --add --bool push.autoSetupRemote true

它适用于 push.default 是 simpleupstream

参考文献:answer tweet docs commit