363

我曾在本地分支上工作,并将更改推送到远程。

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

还有比这更好的方法吗?

4

4 回答 4

575
git checkout old_branch
git branch new_branch

这将为您提供一个与“old_branch”状态相同的新分支“new_branch”。

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

git checkout -b new_branch old_branch
于 2013-02-21T09:44:37.093 回答
88

请参阅第二部分(自 Git 2.23,2019 年第三季度以来):git switch -c newBranch oldBranch


在 Git 2.15(2017 年第四季度)中,“ git branch”学会了“ -c/-C”通过复制现有分支来创建新分支。

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 c8b2cec(2017 年 6 月 18 日。 请参阅Sahil Dua ( )的提交 52d59cc提交 5463caa(2017 年 6 月 18 日) 。(由Junio C Hamano 合并 -- --提交 3b48045中,2017 年 10 月 3 日)avar
sahildua2305
gitster

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

将功能添加到--copy分支及其 reflog 和配置,这使用与--move( -m) 选项相同的底层机制,除了 reflog 和配置被复制而不是被移动。

这对于例如将主题分支复制到新版本很有用,例如在将主题提交到列表之后work,同时保留所有跟踪信息和与分支一起使用的其他配置,而不像保留其他已经提交的分支参考。work-2work--move

注意:复制分支时,您将保留在当前分支上。
正如Junio C Hamano 解释的那样,这个新功能的初始实现是修改 HEAD,这并不好:

B通过复制A恰好是当前分支的分支来创建新分支时,它也会更新HEAD以指向新分支。
它可能是这样制作的,因为“ git branch -c A B”在“”上搭载了它的实现git branch -m A B

这与通常的预期不符。
如果我坐在蓝色椅子上,有人过来把它重新涂成红色,我会接受最终坐在现在是红色的椅子上(我也可以站着,因为不再有我最喜欢的蓝色椅子)。

但是如果有人创造了一把新的红色椅子,模仿我坐的蓝色椅子,我不希望被从蓝色椅子上踢下来,最终坐在新的红色椅子上。


第二部分:使用 git 2.23(2019 年第三季度),无需使用 git branch 或旧的令人困惑git checkout的:你有git switch.

git switch -c newBranch oldBranch
于 2017-10-14T23:12:42.117 回答
66
git branch copyOfMyBranch MyBranch

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

于 2014-09-27T13:47:42.737 回答
0

鉴于您要求更好的方式选择:

复制分支的一个潜在缺陷是,如果您想合并到同一个父级,或者将更改从副本重新引入原始分支,您必须注意 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

请注意,您从“原始”分支开始,并且在这些步骤中不要更改分支。

或者更简单地说,您可以完全取消分支,只需还原您想要还原的提交,如果需要,稍后再还原还原

于 2021-07-16T11:36:06.187 回答