1

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

4 回答 4

5

您可以运行git reset --hard <commit-ID>重新调整当前分支。如果需要,请使用 reflog 查找 ID,或者更简单,如果 reflog 说这是 (say) HEAD@{2},只是git reset --hard HEAD@{2}(请注意,每个都git reset重新编号nin )。@{n}

如果合并是快进合并, Francisco Puga 的答案中的git merge方法也可以正常工作。(如果你选错了,你会得到一个真正的合并,如果这是你想要的,那很好,如果不是,你可以撤消它。)你可以再次给出原始 SHA-1 或 reflog 名称。作为额外的奖励:git reset --hard HEAD^

git merge --ff-only id

只会“向前滑动分支名称”(朝向新的提示,如oraaabbb,从不进行“常规”合并,因此这是确保您使用适当 ID 的好方法。

于 2013-09-29T09:45:09.027 回答
2

如果这些提交存在于另一个分支中,比如master,您可以使用 git merge 将其返回到my-branch

要将带有哈希 bbb 的提交恢复到my-branch,请使用

git checkout my-brach
git merge bbb

如果您的分支中不再存在这些提交,则必须使用git reflog

于 2013-09-29T09:04:14.360 回答
1

您可以使用基于日期的 sha1 表达式(例如“branchname@{yesterday}”)将分支的提示设置为特定的提交

例如,git checkout testbranch@{yesterday}

但是,这将导致分离的 HEAD 状态,正如您已经提到的那样。

于 2013-09-29T09:31:55.653 回答
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
于 2013-10-31T13:43:03.170 回答