git reset

- A - B - C (HEAD, master)

git reset B
- A - B (HEAD, master)

如果git checkout B
– A – B (HEAD) – C (master)

记住git reset不会产生commits,它仅仅更新一个branch(branch本身就是一个指向一个commit的指针)指向另外一个commit(Head和branch Tip同时移动保持一致).其他的仅剩对于index和work tree(working directory)有什么影响。git checkout xxxCommit则只影响HEAD,如果xxxCommit和一个branch tip是一致的话,则HEAD和branch相匹配,如果xxxCommit并不和任何branch tip相一致,则git进入detached HEAD 状态

git reset –hard // HEAD Index working copy 都恢复
git reset –soft // HEAD 指针变化 ,Index 和 working copy 不变
git reset –mixed // HEAD Index 指针变化, working copy 不变

git reset 别人的上的分支不会自动回退,需要手动处理

git revert 命令意思是撤销某次提交。

它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用 revert 回退之后,所有人 pull 之后,他们的代码也自动的回退了。

git revert HEAD                     //撤销最近一次提交
git revert HEAD~1                //撤销上上次的提交,注意:数字从0开始
git revert 0ffaacc                  //撤销0ffaacc这次提交

git revert 命令的好处就是不会丢掉别人的提交,即使你撤销后覆盖了别人的提交,他更新代码后,可以在本地用 reset 向前回滚,找到自己的代码,然后拉一下分支,再回来合并上去就可以找回被你覆盖的提交了。

如果错的太远,revert 又要解决大面积冲突,可以从错误提交的前一次拉取一份代码放到其他目录,然后将 master 的代码全部删除,把那份新的代码放上去,然后提交。

git reset 高级用法

1. git reset file.txt 就相当于 git reset –mixed HEAD file.txt

所以它本质上只是将 file.txt 从 HEAD 复制到索引中。 也就是 取消暂存文件 的效果

2. git reset id — file or folder, 和第一种一样, 恢复指定的 commit 到 暂存区, 而HEAD不移动, 这种方法可以用于 对比 两个阶段间 的所有修改

就是把工作目录中的文件恢复到 v1 版本,运行 git add 添加它, 然后再将它恢复到 v3 版本(只是不用真的过一遍这些步骤)

还有一点同 git add 一样,就是 reset 命令也可以接受一个 --patch 选项来一块一块地取消暂存的内容。 这样你就可以根据选择来取消暂存或恢复内容了

3. 历史多个提交压缩单个提交

假设你有一个项目,第一次提交中有一个文件,第二次提交增加了一个新的文件并修改了第一个文件,第三次提交再次修改了第一个文件。 由于第二次提交是一个未完成的工作,因此你想要压缩它

reset squash r1

git reset –soft HEAD~2 后就变成下面的状态

reset squash r2

然后再次 提交 git commit, 中间提交就会消失

reset 会移动 HEAD 分支的指向,而 checkout 则移动 HEAD 自身

Leave a Reply

Your email address will not be published. Required fields are marked *