git高级用法,git cherry-pick

git高级用法,git cherry-pick

1.使用场景

    假设这样一个场景,产品提一个功能需求,你开发完,然后commit了;第二天产品说那个功能不要了,你说可以,然后reset回去;又过两天,产品又对你说,那个功能还是加上去吧,这时候你心里是不是有一万只草泥马奔驰而过,怎么办?代码已经在reset之后做过修改,有了新的commit了啊,难道要重新开发?还是回退?

    其实不要慌,git早已经考虑到了这种情况,这时候就是cherry-pick发挥特效的时候了

2.模拟实战

1.首先我提交了两个commit

commit 86adfc7611154f57dc750ca25a707743b483dd49 (HEAD -> demo)
Author: libinbin

Date:   Sat May 19 17:08:48 2018 +0800

    第二次commit

commit 004ff75d9ccf27b6721f6b6ea86efa92319f4102
Author: libinbin
Date:   Sat May 19 17:08:15 2018 +0800
    第一次commit

2.然后产品说第二次commit功能不要了,这时候你已经做了第三次commit了

$ git reset --hard 004ff75d9ccf27b6721f6b6ea86efa92319f4102

HEAD is now at 004ff75 第一次commit

$ git commit
[demo 7b1e2c6] 第三次commit
 1 file changed, 1 insertion(+)

$ git log

commit 7b1e2c6bd3851732d0d3e1d01169cd31042b64bc (HEAD -> demo)
Author: libinbin
Date:   Sat May 19 17:26:33 2018 +0800
    第三次commit

commit 004ff75d9ccf27b6721f6b6ea86efa92319f4102 (HEAD -> demo)

Author: libinbin
Date:   Sat May 19 17:08:15 2018 +0800

    第一次commit


commit 32b1d3055a25bea5b1d86b85cffe3ba79aa81327
Author: libinbin
Date:   Sat May 19 17:05:58 2018 +0800

    otademo本地git库

3.过两天产品说加上"第二次commit"还是这个功能吧

$ git reflog

7b1e2c6 (HEAD -> demo) HEAD@{0}: commit: 第三次commit

004ff75 (HEAD -> demo) HEAD@{0}: reset: moving to 004ff75d9ccf27b6721f6b6ea86efa92319f4102

f2bf3c0 (master) HEAD@{2}: cherry-pick: 第二次commit

$ git cherry-pick f2bf3c0
[demo 0ece56f] 第二次commit
 Date: Sat May 19 17:08:48 2018 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git log
commit 0ece56f60e1cd8a41374f4ec351d519b7be55f89 (HEAD -> demo)
Author: libinbin
Date:   Sat May 19 17:08:48 2018 +0800
    第二次commit

commit 7b1e2c6bd3851732d0d3e1d01169cd31042b64bc
Author: libinbin
Date:   Sat May 19 17:26:33 2018 +0800
    第三次commit

commit 004ff75d9ccf27b6721f6b6ea86efa92319f4102
Author: libinbin
Date:   Sat May 19 17:08:15 2018 +0800
    第一次commit

commit 32b1d3055a25bea5b1d86b85cffe3ba79aa81327
Author: libinbin
Date:   Sat May 19 17:05:58 2018 +0800

    otademo本地git库

可以看出"第二次commit"又找回来了

需要注意的是git reflog这个跟git log的区别

git reflog会保留所有的操作记录,但是git log不会保留reset之前的记录

你可能感兴趣的:(git)