Git:将分支的提示设置为特定的提交

时间:2013-09-29 08:43:31

标签: git branch

假设有一个名为 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.

还有其他想法吗?

4 个答案:

答案 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

只会“向前滑动分支名称”(朝向aaabbb这样的新提示),永远不会进行“常规”合并,所以这是一个确保使用适当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