Git中Reset、Revert、Checkout的区别
git reset 、 git checkout 和 git revert 是Git中常⽤命令。经常傻傻分不清他们之间的区别。最近⼯作不忙,抽出时间参考了其他⽂档,对其总结了下。
提交层⾯的操作
传给 git reset 和 git checkout 的参数决定了它们的作⽤域。如果其后参数不是 filename,这些操作对所有提交⽣效。注意,git revert没有⽂件层⾯的操作。
Reset
在提交层⾯上,reset 将⼀个分⽀的末端指向另⼀个提交。这可以⽤来移除当前分⽀的⼀些提交。例:
git checkout hotfix
git reset HEAD~2
hotfix分⽀末端的两个提交现在变成了悬挂提交。下次Git执⾏垃圾回收的时候,这两个提交会被删除。
如果你的更改还没有共享给别⼈,git reset是撤销这些更改的简单⽅法。
除了在当前分⽀上操作,你还可以通过传⼊这些标记来修改你的缓存区或⼯作⽬录:
–soft – 缓存区和⼯作⽬录都不会被改变
–mixed – 默认选项。缓存区和你指定的提交同步,但⼯作⽬录不受影响
–hard – 缓存区和⼯作⽬录都同步到你指定的提交
Checkout
常见于切换不同分⽀。
git checkout hotfix
这个命令做的是将HEAD移到⼀个新的分⽀,然后更新⼯作⽬录。因为这可能会覆盖本地的修改,Git强制你提交或者缓存⼯作⽬录中的所有更改,不然在checkout的时候这些更改都会丢失。和git reset不⼀样的是,git checkout没有移动这些分⽀。
除了分⽀之外,你还可以传⼊提交的引⽤来checkout到任意的提交。这和checkout到另⼀个分⽀是完全⼀样的:把HEAD移动到特定的提交。
git checkout HEAD~2
这对于快速查看项⽬旧版本来说⾮常有⽤。但如果你当前的HEAD没有任何分⽀引⽤,那么这会造成HEAD分离。这是⾮常危险的,如果你接着添加新的提交,然后切换到别的分⽀之后就没办法回到之前添加的这些提交。因此,在为分离的HEAD添加新的提交的时候你应该创建⼀个新的分⽀。
Revert
Revert撤销⼀个提交的同时会创建⼀个新的提交。这是⼀个安全的⽅法,因为它不会重写提交历史。⽐如,下⾯的命令会出倒数第⼆个提交,然后创建⼀个新的提交来撤销这些更改,然后把这个提交加⼊项⽬中。
git checkout hotfix
git revert HEAD~2
相⽐git reset,它不会改变现在的提交历史。因此,git revert 可以⽤在公共分⽀上,git reset 应该⽤在私有分⽀上。
你也可以把git revert 当作撤销已经提交的更改,⽽git reset HEAD ⽤来撤销没有提交的更改。
就像git checkout ⼀样,git revert 也有可能会重写⽂件。所以,Git会在你执⾏ revert 之前要求你提交或者缓存你⼯作⽬录中的更改。
⽂件层⾯的操作
git reset和git checkout 命令也接受⽂件路径作为参数。这时它的⾏为就⼤为不同了。
Reset
git常用指令当检测到⽂件路径时,git reset 将缓存区同步到你指定的那个提交。⽐如,下⾯这个命令会将倒数第⼆个提交中的foo.py加⼊到缓存区中,
供下⼀个提交使⽤。
git reset HEAD~2 foo.py
和提交层⾯的git reset⼀样,通常我们使⽤HEAD⽽不是某个特定的提交。运⾏git reset HEAD foo.py 会将当前的foo.py从缓存区中移除出去,⽽不会影响⼯作⽬录中对foo.py的更改。
–soft、–mixed和–hard对⽂件层⾯的git reset毫⽆作⽤,因为缓存区中的⽂件⼀定会变化,⽽⼯作⽬录中的⽂件⼀定不变。
Checkout
Checkout⼀个⽂件和带⽂件路径git reset ⾮常像,除了它更改的是⼯作⽬录⽽不是缓存区。不像提交层⾯的checkout命令,它不会移动HEAD引⽤,也就是你不会切换到别的分⽀上去。
⽐如,下⾯这个命令将⼯作⽬录中的foo.py同步到了倒数第⼆个提交中的foo.py。
git checkout HEAD~2 foo.py
和提交层⾯相同的是,它可以⽤来检查项⽬的旧版本,但作⽤域被限制到了特定⽂件。
如果你缓存并且提交了checkout的⽂件,它具备将某个⽂件回撤到之前版本的效果。注意它撤销了这个⽂件后⾯所有的更改,⽽git revert 命令只撤销某个特定提交的更改。
和git reset ⼀样,这个命令通常和HEAD⼀起使⽤。⽐如git checkout HEAD foo.py等同于舍弃foo.py没有缓存的更改。这个⾏为和git reset HEAD --hard很像,但只影响特定⽂件。
总结
命令作⽤域常⽤情景
git reset提交层⾯在私有分⽀上舍弃⼀些没有提交的更改
git reset⽂件层⾯将⽂件从缓存区中移除
git checkout提交层⾯切换分⽀或查看旧版本
git checkout⽂件层⾯舍弃⼯作⽬录中的更改
git revert提交层⾯在公共分⽀上回滚更改
git revert⽂件层⾯(⽊有)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。