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