我在一个有两个分支a和B的项目上工作。我通常在分支a上工作,并合并分支B中的内容。对于合并,我通常会这样做:

git merge origin/branchB

但是,我也希望保留分支B的本地副本,因为我可能会偶尔检查分支,而不必首先与分支a合并。为此,我会:

git checkout branchB
git pull
git checkout branchA

有没有一种方法可以在一个命令中完成上述操作,而不必来回切换分支?我应该使用gitupdate-ref吗?怎样


当前回答

在您的情况下,您可以使用

git fetch origin branchB:branchB

它可以满足您的需要(假设合并是快速进行的)。如果由于需要非快速合并而无法更新分支,那么这将安全地失败,并显示一条消息。

这种形式的获取也有一些更有用的选项:

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

请注意,<remote>可以是本地存储库,<sourceBranch>可以是跟踪分支。因此,您可以在不访问网络的情况下更新本地分支,即使它未检出。

目前,我的上游服务器访问是通过一个缓慢的VPN,所以我定期连接,gitfetch更新所有远程设备,然后断开连接。如果远程主机发生了变化,我可以

git fetch . remotes/origin/master:master

即使我目前有其他分支机构结账,也能安全地让我的本地主管了解最新情况。无需网络访问。

其他回答

您可以简单地git将原始分支B拉到分支A中,git将为您完成此操作。

如果您想保持与要合并的分支相同的树(即,不是真正的“合并”),可以这样做。

# Check if you can fast-forward
if git merge-base --is-ancestor a b; then
    git update-ref refs/heads/a refs/heads/b
    exit
fi

# Else, create a "merge" commit
commit="$(git commit-tree -p a -p b -m "merge b into a" "$(git show -s --pretty=format:%T b)")"
# And update the branch to point to that commit
git update-ref refs/heads/a "$commit"

另一种有效的方法是:

git fetch
git branch -d branchB
git branch -t branchB origin/branchB

因为它是小写-d,所以只有在数据仍然存在的情况下才会删除它。这与@kkoehne的答案相似,只是它不强制。由于-t,它将再次设置遥控器。

我有一个与OP稍有不同的需求,那就是在合并一个拉取请求之后,创建一个新的特性分支,脱离开发(或主)。这可以在一个命令行中完成,无需强制,但它不会更新本地开发分支。这只是检查一个新的分支机构并使其基于起源/发展的问题:

git checkout -b new-feature origin/develop

对于许多GitFlow用户来说,最有用的命令是:

git fetch origin master:master --update-head-ok
git fetch origin dev:dev --update-head-ok

--update-headok标志允许在dev或master分支上使用相同的命令。

gitconfig中一个方便的别名:

[alias]
    f=!git fetch origin master:master --update-head-ok && git fetch origin dev:dev --update-head-ok

只有当合并是快进时,才能执行此操作。如果不是,那么git需要签出文件,以便合并它们!

仅为快进操作:

git fetch <branch that would be pulled for branchB>
git update-ref -m "merge <commit>: Fast forward" refs/heads/<branch> <commit>

其中<commit>是提取的commit,即您要快进的commit。这基本上就像使用gitbranch-f移动分支一样,只是它还将其记录在reflog中,就像您实际执行了合并一样。

拜托,拜托,请不要为不快速前进的事情而这样做,否则您只会将分支重置为另一个提交。(要检查,请查看gitmerge-base<branch><commit>是否给出了分支的SHA1。)