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

git merge origin/branchB

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

git checkout branchB
git pull
git checkout branchA

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


当前回答

输入git前向合并:

无需签出目标,git forward merge<source><destination>将源合并到目标分支。

https://github.com/schuyler1d/git-forward-merge

仅适用于自动合并,如果存在冲突,则需要使用常规合并。

其他回答

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

git fetch origin branchB:branchB

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

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

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

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

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

git fetch . remotes/origin/master:master

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

对于许多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
git branch -d branchB
git branch -t branchB origin/branchB

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

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

git checkout -b new-feature origin/develop
git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]

你可以尝试git worktree让两个分支并排打开,这听起来可能是你想要的,但与我在这里看到的其他一些答案非常不同。

通过这种方式,您可以在同一个git repo中有两个单独的分支进行跟踪,因此您只需获取一次即可在两个工作树中获取更新(而不必分别获取两次git clone和git pull)

Worktree将为您的代码创建一个新的工作目录,您可以在其中同时签出不同的分支,而不是在原地交换分支。

当您想要删除它时,可以使用

git worktree remove [-f] <worktree>