git reset 和 git checkout 命令
乍一看,git reset 和 git checkout 命令有一些相似之处,因为它们都在 HEAD 上运行。
如果 git checkout 只对 HEAD 引用指针进行操作,则 git reset 会传递 HEAD 引用指针和当前分支引用指针。
git reset 最常用的选项之一是 --hard。
使用--hard,提交历史引用指针开始指向指定的提交。
之后,暂存区和工作目录被重置为对应于声明的提交。
先前挂起到暂存区和工作目录的更改将重置以匹配提交树状态。
暂存索引和工作目录中的任何挂起提交都将丢失。
--keep 选项重置索引条目并更新工作树中提交和 HEAD 不同的文件。
当提交之间的文件不同并且 HEAD 具有本地更改时,重置将中止。
搬到现有的分行
在某些情况下,我们想要移动特定的提交,而不是将错误的分支与现有分支合并。
下面,我们将演示如何在这种情况下移动提交:
切换到现有分支
使用 git checkout 命令检查现有分支:
git checkout <existing-branch>
集成特定提交
下一步是使用 git cherry-pick 命令恢复特定提交:
git cherry-pick <sha1-commit-hash>
要完成,我们需要检出到错误的分支并重置提交。
为此,请参阅上一节的第三和第四步。
在某些情况下,在特定分支上提交后,我们意识到要在另一个分支上提交。
在这种情况下,Git 会派上用场,允许将提交移动到另一个现有分支或者新分支。
下面,我们将展示如何做到这一点。
转到新的分支
其中我们将讨论将分支的当前状态移动到新分支的场景。
请按照以下步骤操作。
创建分支
使用 git branch 命令创建一个包含所有当前提交的新分支,与 git checkout -b 相比,它不会切换到新创建的分支:
git branch <new-branch-name>
重置提交
将当前分支移回错误提交的数量:
git reset --keep HEAD~N
--keep 选项将未提交的更改保留在不相关的文件中,或者在必须覆盖更改时中止。
如果它中止,请 git stash 更改并重试,或者我们可以使用 --hard 选项丢失更改,即使是在提交之间未更改的文件中。
或者,我们可以使用要还原的提交的哈希值来代替 HEAD~N:
git reset --keep <sha1-commit-hash>
因此,我们最近的错误提交已移至新分支。
移动到现有的同步分支
其中我们将讨论在特定分支上处理功能但错误地在另一个分支上提交的情况。
现在,任务是将提交带回正确的分支。
假设两个分支是同步的。
切换到现有分支
使用 git checkout 命令检查现有分支:
git checkout <existing-branch>
整合提交
运行 git merge 命令将提交恢复到错误的分支:
git merge <wrong-branch>
签出到错误的分支
然后,查看我们提交错误提交的分支:
git checkout <wrong-branch>
重置提交
使用 git reset 命令将当前分支移回错误提交的数量:
git reset --keep HEAD~N