玩转Git

玩转Git

前言


本文不是向你们介绍git怎么安装,怎么关联远程仓库,不对比SVN等不一样版本管理器之间的差别,不罗列如git pull, git push, git commit 等使用git的基本姿式。结合我的平时在使用git中的一些经验,给你们分享一些咱们在版本管理当中常常会遇到的场景及可使用的git操做。html

可能你会说,我在ide当中安装git插件,想怎么用就怎么用,想什么姿式就什么姿式,还须要知道这些繁琐的指令码?git

当你熟悉命令行操做以后,你会发现它远比插件控件操做快速许多,而且会让你对git的了解更深一层。app


Git仓库结构



要使用git,首先咱们须要简单了解一个git仓库的基本结构。当将咱们的项目初始化为一个git工程后,咱们能够简单的将本地仓库分红三部分:ide


  1. git管理的整个工程被称为工做区(workspace)。
  2. 当咱们使用git add后,咱们选择的改动文件会被添加到暂存区,(stage)以备后续进行提交。
  3. 当咱们使用git commit后,一个新的版本(version)就生成了,git版本线又向前推动了一步。


分支交互


对于分支(branch)的一切操做,咱们能够简化为四个分支之间的交互。 优化


版本交互的第一原则是分支交互之间的清晰,拒绝进行本地和远程分支之间的交叉行为,如本地分支 A 拉取远程分支 B 此种操做,如此会致使分支之间内容混乱。ui


指令

git stash 


当你正在火热的作一个新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查看历史修改时候,是否是很头疼内容太多,找不到咱们要看的重点? 不用担忧,可使用增强版。


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 diff  查看改动内容, 固然要在git add以前使用


git revert


我想要回滚到历史的某个commit版本,该咋办? 可使用温柔的revert,加上commitid , 它不会影响你历史的提交,只是将历史的某个commit再次应用一遍。可是这样操做太累赘,我想让版本线干净一点怎么办?往下看


git reset


提交了好几个版本,可是如今我要回滚,这咋办?


git reset 【commitid】 将版本回滚到某个历史commit,这个版本以后的全部改动依然保留。


git reset  【commitid】 --hard   干干净净的回滚到commitid版本,后面的改动我都不要了(用前请确认哦)。


git reset 会将当前版本回滚到某个指定版本,此后的提交都将会看不到。


git checkout


这里不是说怎么切分支!我对几个文件作了一些改动,后来又想撤销,怎么办?reset会所有撤销的,但是我只想撤销几个文件的改动。


git checkout 【filename】 撤销对于文件的更改,而且能够同时撤销多个文件更改。


git checkout .  加个点,可是更厉害,会将当前更改的文件所有撤销,至关于git reset HEAD --hard ,用前确认。


git rebase 


每次我合完代码,发现都会多一个commit,可是这个commit什么改动内容都没有,个人提交历史就像是长了一个疙瘩,难受死强迫症。


git rebase 变基操做,和git merge一样的使用方式,让你的版本线不长疙瘩,可是两个分支差别过大,rebase起来可能要比对的内容会有点多哦。


git rebase -i


一样是rebase,为何你能够另起一行,只由于你真的太NP了。交互式变基操做,听名字就很厉害。我发现好久前的一个commit不太合适,我想把它删掉,怎么办?以前commit的message不合适,我想改下?


git rebase -i  修整你的版本历史,就行修剪花丛的剪刀,有了它,你能够花式优化提交历史。(固然,不建议对历史提交作大的改动)


git reflog


我发现本身回滚了错误的内容,仍是用的reset,以后的版本都找不到了,oh my god ?  不要慌,reflog 值得拥有,使用它,能够查看到在当前工程所作的全部历史操做,找到回滚前的版本commit,将回滚再回滚(有点绕),终于复原了。


git cherry-pick 


我想把hotfix分支改Bug的几个commit合到dev分支,merge会长疙瘩,rebase操做起来要处理冲突,好麻烦。


git cherry-pick  能够将工程当中,任何分支的任何commit拿(pick)当前分支。


git branch


git branch 查看本地分支

git branch  -r 查看远程所有分支

git branch -a  查看本地和远程的全部分支

git branch -vv  查看当前分支的来源 


git push origin -D


git push origin -D [originbranch]  删除远程分支,若是须要清理远程分支,建议仍是在远程仓库中手动操做,从而方便确认。


git biset


项目出现了问题,可是代码中很差肯定范围,能够尝试 biset ,使用二分法快速定位错误。  


git biset start 【结束版本】 【起始版本】   找到一个确定不会有错的历史版本做为起始版本,结束版本可使用HEAD(当前版本)

git biset good  认为当前版本没有复现问题

git biset bad  发现当前版本存在了问题

git biset reset 退出biset过程


阮老师详细讲解篇


结语


文中没有对每一个指令的原理作详细说明,旨在分享一些经常使用场景中可用的解决办法。

相关文章
相关标签/搜索