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

git merge origin/branchB

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

git checkout branchB
git pull
git checkout branchA

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


当前回答

另一种有效的方法是:

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

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

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

git checkout -b new-feature origin/develop

其他回答

不,没有。需要签出目标分支,以便解决冲突(如果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 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>

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

对于许多情况(例如合并),您可以只使用远程分支,而不必更新本地跟踪分支。在reflog中添加一条消息听起来有些过分,而且会让它变得更快。为了更容易恢复,请在git配置中添加以下内容

[core]
    logallrefupdates=true

然后键入

git reflog show mybranch

查看分支机构的近期历史