【问题标题】:Git pull without checkout?没有结帐的Git拉?
【发布时间】:2013-09-22 08:20:15
【问题描述】:

我习惯于在我正在处理的分支中运行 git pull 和其他命令。但是我已经建立了一个多人工作的开发服务器,所以我不想在做的时候必须切换分支。如果我想从我们都使用的 github 存储库更新开发服务器上的现有分支,那么正确的方法是什么?如果我运行命令 'git pull github branchname' 是否会简单地将分支拉入当前分支?

我能找到的所有 git 示例似乎都表明您首先运行“结帐分支名称”,然后执行拉取操作。我试图避免这种情况。正如我所说,这是一个现有的分支,我只想更新到最新版本。

【问题讨论】:

  • git fetch 应该做你想做的事。
  • git fetch 将更新远程分支的本地副本,但不会更新任何本地分支,即使已设置为跟踪该特定远程分支。它可能是也可能不是我们想要的。 (编辑:无论如何,默认情况下。可以使用参数调用它以使其行为不同,但在这种情况下,应该真正指出参数。)
  • 我不太明白……每个人都在开发服务器上使用同一个本地存储库吗?这就是你不想切换分支的原因吗?为什么不让每个人都制作自己可以工作的私人克隆?另请参阅git: update a local branch without checking it out?

标签: git


【解决方案1】:

我一直在寻找同样的东西,最后在另一个 stackoverflow 帖子中找到了对我有用的答案:Merge, update, and pull Git branches without using checkouts

基本上:

git fetch <remote> <srcBranch>:<destBranch>

【讨论】:

  • 有没有办法使用上游分支而不是指定源分支?
  • 遗憾的是,pull 具有 fetch 没有的参数:-s <strategy>-Xsubtree=... 这对我来说至关重要,所以这不是等效的替代品。我遇到了这里描述的问题:congruityservice.com/blog/… 但在我的情况下,我根本不想结帐。
  • 考虑到问题是关于拉的,看来答案应该是git pull <remote> <srcBranch>:<destBranch>
  • 如果提交已经在您的本地存储库中:git fetch . origin/master:master
  • 如果您只想将 (origin|online) 分支合并到本地分支,那么您可以使用git merge origin/master
【解决方案2】:

我遇到了同样的问题,需要提交或存储当前功能更改,签出 master 分支,执行pull 命令确实获取从远程到本地master 工作区的所有内容,然后再次切换到功能分支并执行rebase 以使其与master 保持同步。

为了完成这一切,将工作区保持在功能分支上并避免所有切换,我这样做:

git fetch origin master:master

git rebase master

而且效果很好。

【讨论】:

  • 这是一个很好的建议,但掩盖了问题:根据以下答案,如果您在 feature 上并且您想要做的就是更新您的本地 master 以符合原点,无需接触feature,只需执行git fetch origin master:master...就好像您执行了 stash-checkoutMaster-pull-checkoutFeature-stashPop!
  • 要将origin master合并到本地分支,不需要拉取本地master。您可以使用git merge origin/master
  • 拉取只是一个提取,然后是合并/变基,因此您应该能够在 1 行中执行相同操作:git pull origin main:main --rebase
【解决方案3】:

如果您希望 local 分支提示在 git fetch 之后重新指向,您需要一些额外的步骤。

更具体地说,假设 github 存储库有分支 DBCmaster(这个奇怪的分支名称集的原因稍后会很清楚)。您在主机 devhost 上,并且您在一个仓库中,其中 origin 是 github 仓库。您执行git fetch,它会带来所有对象并更新origin/Dorigin/Borigin/Corigin/master。到目前为止,一切都很好。但是现在你说你想在devhost 上,到本地 分支DBC 和/或master 上发生一些事情?

我有这些明显的(无论如何对我来说)问题:

  1. 为什么要更新所有个分支的提示?
  2. 如果某个分支(例如,B)具有远程 (github) 存储库所缺少的提交怎么办?它们应该被合并、重新定位还是...?
  3. 如果您在某个分支(例如,C)并且工作目录和/或索引已修改但未提交怎么办?
  4. 如果远程仓库添加了新分支 (A) 和/或删除了分支 (D),该怎么办?

如果 (1) 的答案是“因为 devhost 实际上不是用于开发,而是一个本地镜像,它只是保留 github 存储库的本地可用副本,以便我们所有实际开发人员可以从中读取快速而不是从 github 慢慢阅读”,那么你想要一个“镜像”而不是“正常”回购。它不应该有工作目录,也许它也不应该接受推送,在这种情况下,剩下的问题就会消失。

如果有其他答案,(2-4) 就会有问题。

无论如何,这里有一种方法可以解决基于远程引用更新本地引用的问题(例如在运行git fetch -p 之后):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

... code here ... 部分的内容取决于问题 (2-4) 的答案。

【讨论】:

    【解决方案4】:

    使用

    git fetch
    

    相反。它会更新你的 repo 中的远程引用和对象,但只保留本地分支、HEAD 和工作树。

    【讨论】:

    • 但这不会更新他的开发服务器的本地分支......它只会刷新那个git文件夹上的“origin”分支,它对应于提问者的github repo。
    • 或者,如果你想要我的问题版本:我想将我的工作分支与“master”合并,而不是与“origin/master of ssh://bla bla bla”合并。进行 fetch 将更新 origin/master,但不会更新 master。
    猜你喜欢
    • 2020-07-30
    • 2021-11-05
    • 2017-01-20
    • 2016-05-07
    • 2012-09-06
    • 2013-08-09
    • 2014-05-05
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多