我在一个有 2 个分支 A 和 B 的项目上工作。我通常在分支 A 上工作,并合并来自分支 B 的东西。对于合并,我通常会这样做:
git merge origin/branchB
但是,我还想保留分支 B 的本地副本,因为我可能偶尔会在没有先与分支 A 合并的情况下签出分支。为此,我会这样做:
git checkout branchB git pull git checkout branchA
有没有办法在一个命令中完成上述操作,而不必来回切换分支?我应该为此使用git update-ref吗?如何?
git update-ref
只要您进行 快进 合并,您就可以简单地使用
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只要您+不在参考规范。
git fetch
+
如果不先检出 A,则不能将分支 B 合并到分支 A,如果它会导致非快进合并。这是因为需要工作副本来解决任何潜在的冲突。
但是, 在快进合并的情况下,这是可能的 ,因为根据定义,这种合并永远不会导致冲突。要在不先检查分支的情况下执行此操作,您可以使用git fetchrefspec。
如果您有另一个分支签出,这是一个更新master(禁止非快进更改)的示例:feature
master
feature
git fetch upstream master:master
这个用例很常见,你可能想在你的 git 配置文件中为它创建一个别名,就像这个:
[alias] sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
这个别名的作用如下:
git checkout HEAD:这会使您的工作副本进入分离头状态。master如果您想在碰巧将其签出时进行更新,这将很有用。我认为这是必要的,因为否则分支引用master不会移动,但我不记得这是否真的是我的想法。
git checkout HEAD
git fetch upstream master:master:这会将您的本地快速转发master到与upstream/master.
upstream/master
git checkout -检查您之前签出的分支(这就是-在这种情况下所做的)。
git checkout -
-
如果您希望在fetch更新是非快进的情况下命令失败,那么您只需使用表单的 refspec
fetch
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,即使它不会导致快进更新。
<refspec>
参数的格式<refspec>是可选的加号+,后跟源引用<src>,后跟冒号:,然后是目标引用<dst>。
<src>
:
<dst>
获取匹配的远程引用,<src>如果<dst>不是空字符串,则匹配它的本地引用使用<src>. 如果使用可选加+号,则更新本地 ref,即使它不会导致快进更新。
Git结帐和合并而不接触工作树
合并而不更改工作目录