赞
踩
许多时候,在用 Git
的时候有可能 git commit
提交代码后,发现这一次 commit
的内容是有错误的,那么可以用git reset进行操作撤回,且无新增commit_id
git reset
有三种工作模式,即 --soft
、–mixed
(默认方式) 和 --hard
。
git reset --soft
:仅仅移动当前 Head
指针,不会改变工作区和暂存区的内容,如下图所示:只有HEAD
指针被修改了git reset --mixed
:是git reset
的默认参数,移动 HEAD
指针,改变暂存区内容,但不会改变工作区 ,如下图所示:HEAD
指针和暂存区的内容均被修改git reset --hard
:当前 HEAD
指针、工作区和暂存区内容全部改变 ,如下图所示:HEAD
指针、工作区和暂存区内容全部改变–hard
要放弃目前本地的所有改变时,即去掉所有 git add
到暂存区的文件和工作区的文件,可以执行 git reset --hard HEAD
来强制恢复 git 管理的文件夹的內容及状态;
抛弃目标节点后的所有 commit
(可能觉得目标节点到原节点之间的 commit
提交有问题)。
–soft
原节点和 reset
节点之间的差异变更集会放入 index
暂存区中(Staged files
),所以假如我们之前工作目录没有改过任何文件,也没 add
到暂存区,那么使用 reset --soft
后,我们可以直接执行 git commit
將index
暂存区中的內容提交至 Repository
中。
为什么要这样呢?这样做的使用场景是:假如我们想合并当前节点与 reset 目标节点之间不具太大意义的 commit
记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就 commit
,这样做导致一个完整的功能可能会好多个 commit
点,这时假如你需要把这些 commi
t 整合成一个 commit
的时候)时,可以考虑使用 reset --soft
来让 commit
演进线图较为清晰。总而言之,可以使用 --soft
合并 commit
节点。
–mixed
(默认)
使用完 reset --mixed
后,我们可以直接执行 git add
将这些改变过的文件內容加入 index
暂存区中,再执行 git commit
将 Index
暂存区中的內容提交至 Repository
中,这样一样可以达到合并 commit 节点的效果(与上面 --soft 合并 commit 节点差不多,只是多了 git add
添加到暂存区的操作);
移除所有 Index
暂存区中准备要提交的文件(Staged files
),我们可以执行 git reset HEAD
来 Unstage
所有已列入 Index
暂存区的待提交的文件。(有时候发现 add 错文件到暂存区,就可以使用命令)。
commit
提交某些错误代码,或者没有必要的文件也被 commit
上去,不想再修改错误再 commit
(因为会留下一个错误 commit
点),可以回退到正确的 commit
点上,然后所有原节点和 reset
节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再 commit
上去就OK了。
修改完还未git add:使用 git checkout 回滚:
git checkout .
使用暂存区的文件覆盖工作区,所以执行完 git add .
之后,再执行该命令是无效的。 git checkout .
和 git add .
是一对反义词。
git add提交还未commit
使用 git add
提交到暂存区,还未 commit
之前,使用 git reset
和 git checkout
回滚:
git reset # 先用 Head 指针覆盖当前的暂存区内容
git checkout . # 再用暂存区内容覆盖工作区内容
或者使用直接使用 head 覆盖当前暂存区和工作区。
git reset --hard
已经git commit还未git push
使用 git reset 回滚:
git reset --hard <last_commit_id>
覆盖本地仓库、暂存区和工作区。
已经git push
git reset --hard <commit_id>
强制提交当前版本号:git push origin <远端分支名称> --force
错误的把大文件添加到了缓存区
git reset
撤回添加。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。