Git 命令 stash cherry-pick reset rebase
Git 命令 stash cherry-pick reset rebase
I.
前提:git reflog命令
git stash show(show the file changed)
git stash list(show the stash stack)
stash的应用场景:本地分支正在开发,改了一些文件但是还未提交,leader要让你快点去查看线上代码的另外一个问题,要么保存一份,pull最新代码,后面再复制回来,但是操作比较啰嗦;这个时候就可以用stash。执行后,本地文件看到的都是最近一次提交后的样子,不包括stash的提交。stash要注意的是出栈顺序,解决冲突以及清理栈。
1.vi README.md,增加一行
2.git stash
3. git stash show
4. 重复vi README.md和git stash;
5. git stash pop && git commit -a -m "pop1 commit"(两次stash的话第一次pop后要重新pop)
6. git stash pop
其他
1.指定栈名
git stash save "work in progress for foo feature" 当你多次使用"git stash"命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑。建议使用
git stash save "xxx log message"(建议从一开始就这么做)
2.stash默认是先进后出的栈,要指定出栈的记录:
你只需要将找到对应的版本号,例如使用"git stash apply stash@{1}"就可以将你指定版本号为stash@{1}的工作取出来,
如果你不需要stash了,用git stash clear就可以了
3. 分支的问题
如果git checkout branch1,在不同分支下,分别进行了stash和stash pop,那么它们会造成分支的冲突。个人实践的结果,要自己解决冲突,最后只stash pop本分支的。
II.
git cherry-pick 使用场景:两个大的开发分支A,B,B要合并到A。类比svn中的分支合并。cherry-pick是代码的合并。
用法
前提
如果我们有 2 个分支:master, dev,现在想查看这两个 branch 的区别,有以下几种方式:
查看 dev 有,而 master 中没有的: git log dev ^master
同理查看 master 中有,而 dev 中没有的内容:
git log master ^dev
1. git cherry-pick <commit-id>
2. 多个提交copy:git cherry-pick <first-commit>-<last-commit>
master 分支:
到branch1分支
git checkout branch1 && git cherry-pick 8f5f..9e3838,左开右闭区间
III.
git reset使用场景:
前提:需要知道暂存区,工作区和本地仓库
有三个操作,git reset –hard是危险操作,会把指定commit后面的改动和未提交改动都删除;git reset(即mixed)会保留未提交改动,并把reset 的commit合并成红色的结果;git reset --soft 会把History转为stage,并且保留work directory的改动。
git reset –hard xxxid && git status
结果是工作区目录是指定xxxid的内容,提交commit历史被删除
git reset –soft && git status
git reset(--mixed) xxxid && git status
IV.
git revert使用场景:
跟git reset相似,revert -- git revert 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动。一般在代码出现问题要回滚,而且可以接受历史中记录回滚错误,不打算修改历史的时候做的。
V.
git rebase使用场景:多人开发,而且本地有拉新分支的时候(一般都要)。跟merge相似但是场景不一样。
注意:不要在公共分支使用rebase。否则其他人pull的时候会得到被污染的主分支历史记录。
本地和远端对应同一条分支,优先使用rebase,而不是merge。
git rebase -i dev 可以将dev分支合并到当前分支
其他:
squash
References:
git stash的详细讲解 https://www.jianshu.com/p/14afc9916dcb
git rebase 还是 merge的使用场景最通俗的解释 https://www.jianshu.com/p/4079284dd970
git reset --hard --soft 与 git revert 的作用https://www.jianshu.com/p/952d83fc5bc8