如何将一个分支的内容复制到一个新的本地分支?

我曾在本地分公司工作过,也将更改推到远程。

我希望恢复该分支上的更改,并在其上执行其他操作,但我不想完全丢失工作。我正在考虑在本地创建一个新分支并复制旧分支,然后我可以恢复更改并继续在旧分支上工作。

有没有比这更好的办法?

521035 次浏览
git checkout old_branch
git branch new_branch

这将给你一个新分支“new_branch”,其状态与“old_branch”相同。

该命令可与以下命令组合:

git checkout -b new_branch old_branch
git branch copyOfMyBranch MyBranch

这避免了检出分支的潜在耗时和不必要的行为。回想一下,签出修改了“工作树”,如果它很大或包含大文件(例如图像或视频),这可能会花费很长时间。

参见第二部分(自Git 2.23, Q3 2019): git switch -c newBranch oldBranch


在Git 2.15 (Q4 2017)中,"git branch"学会了“-c/-C"通过复制现有分支来创建新分支。

参见提交c8b2cec (18 Jun 2017) by Ævar Arnfjörð Bjarmason (avar)
参见提交52 d59cc提交5463年创新艺人经纪公司(2017年6月18日)by Sahil Dua (sahildua2305)
(由Junio C Hamano—gitster提交3 b48045中合并,03 Oct 2017)

branch:添加一个--copy (-c)选项来匹配--move (-m)

--copy添加一个分支及其reflog和configuration的能力, 它使用与--move (-m)选项相同的底层机制 除了reflog和配置被复制而不是被移动 这是有用的,例如,复制一个主题分支到一个新版本, 例如,在将work主题提交给列表后,workwork-2,而 保留所有跟踪信息和其他配置 与--move不同的是,它保留了另一个已经提交的分支

注意:当复制一个分支时,你仍然在你当前的分支上。
作为Junio C Hamano解释道,这个新特性的初始实现是修改HEAD,这并不好:

当通过复制分支A来创建一个新的分支B时 作为当前分支,它还更新HEAD以指向新的分支 分支。
它之所以这样做,可能是因为“git branch -c A B"git branch -m A B",

这与通常的期望不符。
如果我坐在一把蓝色的椅子上,有人来把它重新涂成红色,我就会接受坐在现在是红色的椅子上(我也可以接受 站着吧,因为我最喜欢的蓝色椅子已经没有了) 但是如果有人创造了一个新的红色椅子,模仿蓝色 我坐在椅子上,我不期望被踢到蓝色


第二部分:对于git 2.23(2019年Q3),不需要使用git分支或旧的令人困惑的git checkout:你有git switch

git switch -c newBranch oldBranch

如果你要求更好的方式选择:

复制分支的一个潜在缺陷是,如果您想合并到相同的父分支中,或者从副本中重新将更改引入到原始分支中,则必须注意git的快进行为。

例如,如果你已经在“原始”分支中恢复了一些提交,但现在你想重新引入你恢复到原始的更改,你不能简单地将复制的分支合并到父分支,因为git看到这些提交已经存在(即使它们稍后被恢复)。

也许cherry-pick [commit-range]将在此上下文中工作&不关心现有的哈希耸了耸肩

在我看来,这样做会更好。

  1. 从当前分支HEAD git branch [archive-branch-name]创建一个新分支
  2. 找到你想用git log回滚到的提交
  3. 运行git reset --head [commit-hash-from-#2]
  4. git push -f origin

请注意,您从“原始”分支开始,并没有在步骤中更改分支。

甚至更简单,你可以完全取消分支,只恢复你想恢复的提交,如果需要的话,还有稍后恢复

签出到您想要复制的分支。然后,一旦你在那个分支运行: git checkout -b new_branch_name < / p >