小编典典

在不使用结帐的情况下合并、更新和拉取 Git 分支

all

我在一个有 2 个分支 A 和 B 的项目上工作。我通常在分支 A 上工作,并合并来自分支 B 的东西。对于合并,我通常会这样做:

git merge origin/branchB

但是,我还想保留分支 B 的本地副本,因为我可能偶尔会在没有先与分支 A 合并的情况下签出分支。为此,我会这样做:

git checkout branchB
git pull
git checkout branchA

有没有办法在一个命令中完成上述操作,而不必来回切换分支?我应该为此使用git update-ref吗?如何?


阅读 117

收藏
2022-03-02

共1个答案

小编典典

简短的回答

只要您进行 快进 合并,您就可以简单地使用

git fetch <remote> <sourceBranch>:<destinationBranch>

例子:

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

虽然Amber 的答案也适用于快进的情况,但git fetch以这种方式使用比仅强制移动分支引用更安全一些,因为git fetch只要您+不在参考规范。

长答案

如果不先检出 A,则不能将分支 B 合并到分支 A,如果它会导致非快进合并。这是因为需要工作副本来解决任何潜在的冲突。

但是, 在快进合并的情况下,这是可能的 ,因为根据定义,这种合并永远不会导致冲突。要在不先检查分支的情况下执行此操作,您可以使用git fetchrefspec。

如果您有另一个分支签出,这是一个更新master(禁止非快进更改)的示例:feature

git fetch upstream master:master

这个用例很常见,你可能想在你的 git 配置文件中为它创建一个别名,就像这个:

[alias]
    sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'

这个别名的作用如下:

  1. git checkout HEAD:这会使您的工作副本进入分离头状态。master如果您想在碰巧将其签出时进行更新,这将很有用。我认为这是必要的,因为否则分支引用master不会移动,但我不记得这是否真的是我的想法。

  2. git fetch upstream master:master:这会将您的本地快速转发master到与upstream/master.

  3. git checkout -检查您之前签出的分支(这就是-在这种情况下所做的)。

git fetchfor(非)快进合并的语法

如果您希望在fetch更新是非快进的情况下命令失败,那么您只需使用表单的 refspec

git fetch <remote> <remoteBranch>:<localBranch>

如果要允许非快进更新,则+在 refspec 的前面添加一个:

git fetch <remote> +<remoteBranch>:<localBranch>

请注意,您可以使用以下命令将本地存储库作为“远程”参数传递.

git fetch . <sourceBranch>:<destinationBranch>

文档

git fetch解释此语法的文档中(强调我的):

<refspec>

参数的格式<refspec>是可选的加号+,后跟源引用<src>,后跟冒号:,然后是目标引用<dst>

获取匹配的远程引用,<src>如果<dst>不是空字符串,则匹配它的本地引用使用<src>. 如果使用可选加+号,则更新本地
ref,即使它不会导致快进更新。

也可以看看

  1. Git结帐和合并而不接触工作树

  2. 合并而不更改工作目录

2022-03-02