假设有一个名为 my-branch 的分支,其中包含三个提交:
aaa
bbb
ccc
首先, my-branch 的提示指向aaa。如果有人git reset --hard HEAD^
,则提示将开始指向bbb。相同的命令将导致 my-branch 的提示指向ccc。如何在aaa或bbb再次指出小费?
一种选择是结帐aaa或bbb(分离HEAD),然后签出一个新的分支,比如说 new-branch ,删除 my-branch 并使用新的一。我也认为像git branch -f my-branch bbb
这样的东西应该有用,但是当我尝试这个时,我得到了
fatal: Cannot force update the current branch.
还有其他想法吗?
答案 0 :(得分:4)
您可以运行git reset --hard <commit-ID>
重新调整当前分支。如果需要,使用reflog来查找ID,或者甚至更简单,如果reflog说这是(比方说)HEAD@{2}
,只需git reset --hard HEAD@{2}
(注意每个git reset
重新编号< n
)中的em> @{n}
。
如果合并是快进合并,Francisco Puga's answer中的git merge
方法也可以正常工作。 (如果你选错了,你会得到一个真正的合并,如果这是你想要的,那就没问题,或者你可以git reset --hard HEAD^
撤消它。如果没有。)再次,你可以给原始的SHA-1或者reflog名称。作为额外的奖励:
git merge --ff-only id
只会“向前滑动分支名称”(朝向aaa
或bbb
这样的新提示),永远不会进行“常规”合并,所以这是一个确保使用适当ID的好方法。
答案 1 :(得分:2)
如果这些提交存在于另一个分支中,例如 master ,则可以使用git merge将其恢复为 my-branch 。
要使用hash bbb将提交恢复到 my-branch ,请使用
git checkout my-brach
git merge bbb
如果您的分支机构中不再存在这些提交,则必须使用git reflog。
答案 2 :(得分:1)
您可以使用基于日期的sha1表达式将分支的提示设置为特定提交,例如“branchname @ {yesterday}”
,例如git checkout testbranch @ {昨天}
然而,正如您已经提到的那样,这将导致分离的HEAD状态。
答案 3 :(得分:0)
首先,您必须检查bbb以避免“致命:无法强制更新当前分支。”消息。然后,您可以使用 branch -f 将HEAD更改为bbb。最后,退房到这个分支,否则你处于一个独立的HEAD。
所以,请执行以下操作:
git co bbb
git branch -f my-branch bbb
git co my-branch
Before: After:
>aaa aaa
bbb >bbb
ccc ccc