我在一个有两个分支a和B的项目上工作。我通常在分支a上工作,并合并分支B中的内容。对于合并,我通常会这样做:
git merge origin/branchB
但是,我也希望保留分支B的本地副本,因为我可能会偶尔检查分支,而不必首先与分支a合并。为此,我会:
git checkout branchB
git pull
git checkout branchA
有没有一种方法可以在一个命令中完成上述操作,而不必来回切换分支?我应该使用gitupdate-ref吗?怎样
我在一个有两个分支a和B的项目上工作。我通常在分支a上工作,并合并分支B中的内容。对于合并,我通常会这样做:
git merge origin/branchB
但是,我也希望保留分支B的本地副本,因为我可能会偶尔检查分支,而不必首先与分支a合并。为此,我会:
git checkout branchB
git pull
git checkout branchA
有没有一种方法可以在一个命令中完成上述操作,而不必来回切换分支?我应该使用gitupdate-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比强制移动分支引用更安全,因为只要在refspec中不使用+,git fetch就会自动防止意外的非快进。
答案很长
如果不先签出a,就不能将分支B合并到分支a,否则会导致非快速合并。这是因为需要一个工作副本来解决任何潜在的冲突。
然而,在快速合并的情况下,这是可能的,因为根据定义,这种合并永远不会导致冲突。要在不首先检查分支的情况下执行此操作,可以使用gitfetch和refspec。
如果您签出了另一个分支功能,以下是更新master(不允许非快进更改)的示例:
git fetch upstream master:master
这个用例非常常见,您可能需要在git配置文件中为它创建一个别名,如下所示:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
此别名的作用如下:
gitcheckout HEAD:这将使您的工作副本进入分离的头状态。如果您想在碰巧签出master时更新它,这很有用。我认为这是必要的,因为否则master的分支引用不会移动,但我不记得这是否真的就在我的头顶上。gitfetchupstream-master:master:这将快速将本地主机转发到与upstream/master相同的位置。gitcheckout-签出您以前签出的分支(在本例中-就是这么做的)。
gitfetch用于(非)快进合并的语法
如果您希望fetch命令在非快速更新时失败,那么只需使用表单的refspec
git fetch <remote> <remoteBranch>:<localBranch>
如果您希望允许非快速更新,那么在refspec前面添加一个+:
git fetch <remote> +<remoteBranch>:<localBranch>
请注意,您可以使用传递本地回购作为“远程”参数。:
git fetch . <sourceBranch>:<destinationBranch>
文件
从解释此语法的git fetch文档中(重点是我的):
<参考规范><refspec>参数的格式是可选的加号+,后跟源ref<src>,后跟冒号:,后跟目标ref<dst>。获取与<src>匹配的远程引用,如果<dst>不是空字符串,则使用<src>快速转发与之匹配的本地引用。如果使用可选的加号+,则即使不会导致快速更新,也会更新本地ref。
另请参见
Git签出和合并而不接触工作树合并而不更改工作目录
其他回答
不,没有。需要签出目标分支,以便解决冲突(如果Git无法自动合并冲突)。
但是,如果合并是一个可以快速进行的合并,则不需要检查目标分支,因为实际上不需要合并任何内容-只需更新分支以指向新的头部引用即可。您可以使用gitbranch-f执行此操作:
git branch -f branch-b branch-a
将更新branch-b以指向branch-a的头部。
-f选项代表--force,这意味着branch-b将被覆盖。
警告:更安全的选择是使用git fetch,它只允许快进。
此方法可按如下方式使用:
git branch -f branch-b branch-b@{Upstream}
或更短
git branch -f branch-b branch-b@{U}
强制更新一个分支,而不检查它(例如,如果它们在重基之后已经分叉)
输入git前向合并:
无需签出目标,git forward merge<source><destination>将源合并到目标分支。
https://github.com/schuyler1d/git-forward-merge
仅适用于自动合并,如果存在冲突,则需要使用常规合并。
简短的回答
只要您正在进行快速合并,就可以简单地使用
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比强制移动分支引用更安全,因为只要在refspec中不使用+,git fetch就会自动防止意外的非快进。
答案很长
如果不先签出a,就不能将分支B合并到分支a,否则会导致非快速合并。这是因为需要一个工作副本来解决任何潜在的冲突。
然而,在快速合并的情况下,这是可能的,因为根据定义,这种合并永远不会导致冲突。要在不首先检查分支的情况下执行此操作,可以使用gitfetch和refspec。
如果您签出了另一个分支功能,以下是更新master(不允许非快进更改)的示例:
git fetch upstream master:master
这个用例非常常见,您可能需要在git配置文件中为它创建一个别名,如下所示:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
此别名的作用如下:
gitcheckout HEAD:这将使您的工作副本进入分离的头状态。如果您想在碰巧签出master时更新它,这很有用。我认为这是必要的,因为否则master的分支引用不会移动,但我不记得这是否真的就在我的头顶上。gitfetchupstream-master:master:这将快速将本地主机转发到与upstream/master相同的位置。gitcheckout-签出您以前签出的分支(在本例中-就是这么做的)。
gitfetch用于(非)快进合并的语法
如果您希望fetch命令在非快速更新时失败,那么只需使用表单的refspec
git fetch <remote> <remoteBranch>:<localBranch>
如果您希望允许非快速更新,那么在refspec前面添加一个+:
git fetch <remote> +<remoteBranch>:<localBranch>
请注意,您可以使用传递本地回购作为“远程”参数。:
git fetch . <sourceBranch>:<destinationBranch>
文件
从解释此语法的git fetch文档中(重点是我的):
<参考规范><refspec>参数的格式是可选的加号+,后跟源ref<src>,后跟冒号:,后跟目标ref<dst>。获取与<src>匹配的远程引用,如果<dst>不是空字符串,则使用<src>快速转发与之匹配的本地引用。如果使用可选的加号+,则即使不会导致快速更新,也会更新本地ref。
另请参见
Git签出和合并而不接触工作树合并而不更改工作目录
另一种公认的蛮力方法是重新创建分支:
git fetch remote
git branch -f localbranch remote/remotebranch
这将丢弃本地过时的分支,并重新创建一个同名分支,因此请谨慎使用。。。
您可以克隆回购并在新回购中进行合并。在同一个文件系统上,这将硬链接而不是复制大部分数据。最后将结果拉入原始回购。