我曾在本地分支上工作,并将更改推送到远程。
我想恢复该分支上的更改并对其执行其他操作,但我不想完全失去工作。我正在考虑在本地创建一个新分支并将旧分支复制到那里,然后我可以还原更改并继续在旧分支上工作。
还有比这更好的方法吗?
git checkout old_branch
git branch new_branch
这将为您提供一个与“old_branch”状态相同的新分支“new_branch”。
该命令可以与以下命令组合:
git checkout -b new_branch old_branch
请参阅第二部分(自 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-2
work
--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
git branch copyOfMyBranch MyBranch
这避免了签出分支的潜在耗时和不必要的行为。回想一下,结帐会修改“工作树”,如果它很大或包含大文件(例如图像或视频),这可能需要很长时间。
鉴于您要求更好的方式选择:
复制分支的一个潜在缺陷是,如果您想合并到同一个父级,或者将更改从副本重新引入原始分支,您必须注意 git 的快进行为。
例如,如果您在“原始”分支中恢复了一些提交,但现在您想重新引入您恢复到原始分支的更改,您不能简单地将复制的分支合并到父分支,因为 git 看到这些提交已经存在(甚至认为它们稍后会被还原)。
也许cherry-pick [commit-range]
会在这种情况下工作并且不关心现有的哈希耸耸肩
在我看来,尽管这样做会更好。
git branch [archive-branch-name]
git log
git reset --head [commit-hash-from-#2]
git push -f origin
请注意,您从“原始”分支开始,并且在这些步骤中不要更改分支。
或者更简单地说,您可以完全取消分支,只需还原您想要还原的提交,如果需要,稍后再还原还原