本文不是向你们介绍git怎么安装,怎么关联远程仓库,不对比SVN等不一样版本管理器之间的差别,不罗列如git pull, git push, git commit 等使用git的基本姿式。结合我的平时在使用git中的一些经验,给你们分享一些咱们在版本管理当中常常会遇到的场景及可使用的git操做。html
可能你会说,我在ide当中安装git插件,想怎么用就怎么用,想什么姿式就什么姿式,还须要知道这些繁琐的指令码?git
当你熟悉命令行操做以后,你会发现它远比插件控件操做快速许多,而且会让你对git的了解更深一层。app
要使用git,首先咱们须要简单了解一个git仓库的基本结构。当将咱们的项目初始化为一个git工程后,咱们能够简单的将本地仓库分红三部分:ide
对于分支(branch)的一切操做,咱们能够简化为四个分支之间的交互。 优化
版本交互的第一原则是分支交互之间的清晰,拒绝进行本地和远程分支之间的交叉行为,如本地分支 A 拉取远程分支 B 此种操做,如此会致使分支之间内容混乱。ui
当你正在火热的作一个新Feature时,邮件中收到了提醒,又有讨厌的Bug来烦人了,此时须要切换到hotfix分支改Bug,可是新功能作了一半又不适合提交新版本,该怎么办?spa
git stash 能够帮助你把当前的修改存入到单独的空间当中,使工做区干干净净,而后就能够切换分支作其余操做了。插件
git stash list 查看stash空间被存储的内容命令行
git stash pop 应用stash空间的第一条内容,即上一次stash的内容cdn
git stash apply 应用stash空间的某一条存储记录
git stash save 能够为你的stash添加备注,标明stash的内容
git stash clear 清空stash空间的所有内容。(使用前确认,误用追悔莫及)
使用git log查看历史修改时候,是否是很头疼内容太多,找不到咱们要看的重点? 不用担忧,可使用增强版。
git log --patch 【commitid】 查看某一个commit版本的修改内容,一次定位。
git log --graph 查看git版本线,commit的历史记录,及分支间合并状况
git log --oneline 若是嫌弃graph内容太多,交叉线看到头晕,oneline 可让信息更精简
git log --grep 记得好久前我改过这个Bug,可是过久找不到了,只记得commit备注。不要紧,可使用grep搜索到具体的commit,you won't miss it。
打算提交前,我想看看我都改了些什么,万一改了不应改的地方怎么办?
git diff 查看改动内容, 固然要在git add以前使用
我想要回滚到历史的某个commit版本,该咋办? 可使用温柔的revert,加上commitid , 它不会影响你历史的提交,只是将历史的某个commit再次应用一遍。可是这样操做太累赘,我想让版本线干净一点怎么办?往下看 ↓
提交了好几个版本,可是如今我要回滚,这咋办?
git reset 【commitid】 将版本回滚到某个历史commit,这个版本以后的全部改动依然保留。
git reset 【commitid】 --hard 干干净净的回滚到commitid版本,后面的改动我都不要了(用前请确认哦)。
git reset 会将当前版本回滚到某个指定版本,此后的提交都将会看不到。
这里不是说怎么切分支!我对几个文件作了一些改动,后来又想撤销,怎么办?reset会所有撤销的,但是我只想撤销几个文件的改动。
git checkout 【filename】 撤销对于文件的更改,而且能够同时撤销多个文件更改。
git checkout . 加个点,可是更厉害,会将当前更改的文件所有撤销,至关于git reset HEAD --hard ,用前确认。
每次我合完代码,发现都会多一个commit,可是这个commit什么改动内容都没有,个人提交历史就像是长了一个疙瘩,难受死强迫症。
git rebase 变基操做,和git merge一样的使用方式,让你的版本线不长疙瘩,可是两个分支差别过大,rebase起来可能要比对的内容会有点多哦。
一样是rebase,为何你能够另起一行,只由于你真的太NP了。交互式变基操做,听名字就很厉害。我发现好久前的一个commit不太合适,我想把它删掉,怎么办?以前commit的message不合适,我想改下?
git rebase -i 修整你的版本历史,就行修剪花丛的剪刀,有了它,你能够花式优化提交历史。(固然,不建议对历史提交作大的改动)
我发现本身回滚了错误的内容,仍是用的reset,以后的版本都找不到了,oh my god ? 不要慌,reflog 值得拥有,使用它,能够查看到在当前工程所作的全部历史操做,找到回滚前的版本commit,将回滚再回滚(有点绕),终于复原了。
我想把hotfix分支改Bug的几个commit合到dev分支,merge会长疙瘩,rebase操做起来要处理冲突,好麻烦。
git cherry-pick 能够将工程当中,任何分支的任何commit拿(pick)到当前分支。
git branch 查看本地分支
git branch -r 查看远程所有分支
git branch -a 查看本地和远程的全部分支
git branch -vv 查看当前分支的来源
git push origin -D [originbranch] 删除远程分支,若是须要清理远程分支,建议仍是在远程仓库中手动操做,从而方便确认。
项目出现了问题,可是代码中很差肯定范围,能够尝试 biset ,使用二分法快速定位错误。
git biset start 【结束版本】 【起始版本】 找到一个确定不会有错的历史版本做为起始版本,结束版本可使用HEAD(当前版本)
git biset good 认为当前版本没有复现问题
git biset bad 发现当前版本存在了问题
git biset reset 退出biset过程
文中没有对每一个指令的原理作详细说明,旨在分享一些经常使用场景中可用的解决办法。