如何在不切换分支的情况下'git pull'(git 结帐)?



我习惯于在我正在处理的分支中运行git pull和其他命令。 但是我已经设置了一个几个人处理的开发服务器,所以我不想在这样做时切换分支。

如果我想从我们都使用的 github 存储库更新开发服务器上的现有分支,正确的方法是什么?

如果我运行命令git pull github branchname这会简单地将分支拉入当前分支吗?

我能找到的所有 git 示例似乎都表明您先运行checkout branchname,然后进行拉取。 我试图避免这种情况。 正如我所说,这是一个现有的分支,我只想更新到最新版本。

我一直在寻找同样的东西,终于在另一篇堆栈溢出帖子中找到了对我有用的答案: 在不使用结帐的情况下合并、更新和拉取 Git 分支

基本上:

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

例:

git fetch origin branchname:branchname

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

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

git fetch origin master:master

git rebase master

它很好地完成了这个技巧。

我使用以下命令将源分支更新为本地分支而无需签出。git fetch origin [分支名称]:[分支名称]

如果您希望在

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)的答案。

使用

git fetch

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

最新更新