• Git如何将分支重置为较旧的提交?
  • 发布于 2个月前
  • 313 热度
    0 评论
目前为止,我们有如下提交历史:
* 7598875 - (HEAD -> master) Add .gitignore (31 seconds ago) <AleksandrHovhannisyan>
* 893d18d - Add README (79 seconds ago) <AleksandrHovhannisyan>
* 2beb7c7 - Add .env (79 seconds ago) <AleksandrHovhannisyan>
* 0beebfb - Add package.json (80 seconds ago) <AleksandrHovhannisyan>
我们再来向 master 添加一个提交:
touch file && git add . && git commit -m "Add a file"
现在提交历史变成了这样:
* b494f6f - (HEAD -> master) Add a file (5 seconds ago) <AleksandrHovhannisyan>
* 7598875 - Add .gitignore (3 minutes ago) <AleksandrHovhannisyan>
* 893d18d - Add README (4 minutes ago) <AleksandrHovhannisyan>
* 2beb7c7 - Add .env (4 minutes ago) <AleksandrHovhannisyan>
* 0beebfb - Add package.json (4 minutes ago) <AleksandrHovhannisyan>
几分钟后,出于某种原因,我们决定不再保留最近的提交。要想删除它,只需在 HEAD 指针之前硬重置一次提交,该指针始终指向当前分支上的最新提交:
git reset --hard HEAD~1
波浪号 (~) 后跟一个数字告诉 git 它应该从给定的提交(在本例中为 HEAD 指针)回溯多少次提交。由于 HEAD 总是指向当前分支上的最新提交,这告诉 git 对最近提交之前的提交进行硬重置。

输出结果如下:
HEAD is now at 7598875 Add .gitignore
硬重置是撤消 git 更改的一个便捷方法,但这是一个破坏性过程——该提交中的所有更改都将丢失,找回它们的唯一方法是通过 git reflog命令(后面会详细介绍)。我们还可以重置为 HEAD~nth 提交,在这种情况下,该提交期间和之后的所有工作都将丢失:
git reset --hard HEAD~4
或者甚至是特定的提交,如果有它的哈希:
git reset --hard <hash-id>
当然也不限于仅针对当前分支中的提交进行重置,还可以重置本地分支以指向另一个本地分支:
git reset --hard <someOtherBranch>
甚至到远程分支:
git reset --hard origin/master
这个就很有用,例如,如果不小心将内容提交到本地 master 分支。假设应该在一个 feat/X 分支上进行提交,但忘记了创建它,而且一直在向本地 master 提交代码。当然,我们也可以使用 git cherry-pick 来解决这个问题,但是如果有很多次提交怎么办?这有点痛苦,而 reset 可以轻松搞定。

要解决此问题,现在需要创建功能分支:
git checkout -b feat/X
并强行将本地 master 分支重置为远程 master 分支:
git checkout master && git reset --hard origin/master
并且不要忘记回到功能分支,这样就不会重复同样的错误:
git checkout feat/X

软重置分支
正如上面提到的,如果进行硬重置,将丢失在该提交时或之后所做的所有工作。当然,可以从那个状态中恢复过来,但需要额外的操作。相反,如果想在 git 的暂存环境中保留更改,可以进行软重置:
git reset --soft HEAD~1
同样,可以只使用提交哈希而不是从 HEAD 指针回溯:
git reset --soft a80951b
该提交引入的所有更改以及它之后的任何提交都将出现在 git 的暂存环境中。在这里,可以使用 git reset HEAD file(s) 取消暂存文件,对已经暂存的文件进行所需的任何更改。然后,可以根据需要进行任何新的提交。

用例:在一个提交中提交了文件 A 和文件 B,但后来意识到它们实际上应该是两个独立的提交。可以执行软重置并选择性地提交一个文件,然后单独进行另一个提交,所有这些操作都不会丢失任何工作内容。

创建备份分支
我们可以将分支用作备份机制,以防你知道即将运行的某个命令(例如 git reset --hard)可能会损坏分支的提交历史记录。在运行这些命令之前,可以简单地创建一个临时备份分支(例如 git branch backup)。如果出现任何问题,就可以针对备份分支执行硬重置操作:
git reset --hard backup

用户评论