开发中关于Git那些事

 如果你想精通Git,直接到 Git官网 把这本ProGit掌握已足以Pro Git

此文主要介绍一切开发中常用的git命令和一些配置技巧(诸如git别名配置,log打印技巧,版本回退以及分支管理等)。

1.简介


Git与svn相比而言,Git的好处自然不用多说,Git完全分布式文件管理系统,加上其简单速度,可以高效管理类似 Linux 内核一样的超大规模项目。完全分布式的系统,让你可以在公交车上,火车上,家中,甚至在厕所都可以敲代码。何时何地你都可以敲代码,甚至不需要网络。好不好使,开不开心?换是SVN,SVN服务器挂了,全部人停止敲代码,停下来八卦去吧。

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。如同下图所示:

但是,Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快 照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。工作方式类似下图:

对比可以发现,Git高效也在情理之中。
现在再简单介绍一下Git管理下文件的三种状态。对于任何一个文件,只要在Git管理下,那么该文件只有三种状态:已修改(modified),已暂存(staged)和已提交 (committed)。
已修改(modified): 文件被修改,但是还没有提交保存(也就是没有使用git add,此时使用git status显示为红色)。
已暂存(staged): 已修改的文件放入下次要提交的清单中(使用了git add后的状态,此时使用git status显示为绿色)。
已提交(committed): 该文件已经被安全地保存在本地数据库中(使用了git commit后,此时使用git status已经不存在该文件的任何信息)。
具体可以参考下面两幅图来理解。

2.配置用户信息


user和email,--global参数全局配置,当然你也可以不加此参数,不同的项目用不同的用户名和邮箱。

git config --global user.name Super git config --global user.email 1342449****@163.com

3.配置全局别名


此配置在开发中相当重要,尤其是对于使用Terminal,习惯使用命令行的朋友,由于git不支持tab自动补全,每次想要看下工作目录 状态都要git status,相当耗时。除非你能确定你敲两个字母比六个字母用时少。

git config --global alias.st "status -s" git config --global alias.ci "commit -m" git config --global alias.aci "commit -a -m" // 跳过使用暂缓区,直接将git add和git commit合并为一条命令 git config --global alias.lg "log --color --pretty=format:'%Cred%h - %Cgreen%an %C(yellow)| %ad | %Creset%s' --graph" (自定义log)

第一条:git status是开发中使用最多最频繁的,至于-s 是简洁输入(Give the output in the short-format)
第二条:此条也使用频繁,但是我在开发中直接使用第三条跳过。
第三条:配置git aci 因为这样直接跳过使用暂存区域,对于已经跟踪的文件,我不要再此次使用git add加入暂缓区,然后再git commit提交到本地数据库,为了方便省事,直接将两条命令合并为一条,使用git aci "提交说明" 即可。省不省事,用下自然知道。
第四条:这里是我自定义的log信息,当然,一会看完本文你也可以自己格式化成自己喜欢的log格式。可以先看下效果,下图所示:


以后直接使用"git lg"即可,非常方便,显示简洁明了。

4.分支管理


git checkout -b dev origin/dev // 拉取远程开发分支到本地并且切换到开发分支 git push dev origin/dev git branch new   // 创建新分支 git push origin new // 将new分支推送到远程(git push [remote-name] [branch-name]) git push origin :new   // 删除远程分支,注意冒号位置 git brach -d new // 删除本地分支,如果有没有merge的信息,确保该分支的确不用merge,直接使用-D强行删除 git merge dev   //  将dev分支合并到当前分支 git checkout master // 切换到主分支 // 其他不再一一列出

关于实际开发中,独立开发的话其实两个分支完全够用,一个主分支,一个开发分支。多人的话就按功能模块和人员来具体新建分支即可。由于这边由我一人负责整个项目,那么分支的话,我就建立了一个develop分支。发布版本时放到主分支处理即可。平时都在develop分支开发,如果此时发现线上版本有bug,那么只需要切换到master分支,修改bug,然后封版即可。处理好后继续回到开发分支开发就可以了。当然最好还是把刚才修改bug的代码merge到开发分支上。

还有一点使用技巧,也就是git stash的灵活使用。当我们正在当前分支编写代码,突然某人中断你的思路,提出某功能需修改且比较紧急,更烦人的是当前的代码已经开始编写,而且动用了好多文件,重要的是不想中途进行git commit提交。此时git stash就发挥作用了。

git stash // 暂时隐藏,之后就可以正常切换分支了,当前的修改内容只是保存并且隐藏起来 git stash pop // 回复到之前的工作状态,默认pop的是最近的一条,这样就可以愉快的继续编写当时被中断的代码了

git stash可以执行多次,我们可以使用git stash list命令来查看清单。当然还有好多命令,可以使用"git stash --help"来查看。

// git stash --help usage: git stash list [<options>]    or: git stash show [<stash>]    or: git stash drop [-q|--quiet] [<stash>]    or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]    or: git stash branch <branchname> [<stash>]    or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]                [-u|--include-untracked] [-a|--all] [<message>]]    or: git stash clear

其实关于git stash还有一个使用技巧,那就是如果当前改了众多文件,突然又不想改了,想恢复到原来的样子。那么可能你会使用"git checkout ."命令来取消所有的更改,但是有种情况并不好使,那就是你除了修改文件,还添加了一些文件或则拖入了一些文件到工程目录下,此时使用"git checkout ."然后再使用"git status"查看的时候,会发现工作区多出了尚未识别的文件(处于等待add的状态)。在这个时候,使用git stash是再好不过了,因为这样将所有git控制下的文件,包括之前的目录,全部还原到之前的状态(也就是说git stash把新增的文件也暂时隐藏起来)。如果想彻底删掉,那就再把所有stash的列表清空吧,直接"git stash list"看下,然后"git stash clear"。

还有一点,关于在Git服务器上删除分支,本地使用"git branch -a"依旧可以看到被删除问题。好比你的代码托管到了开源中国(OSChina),你通过网站,在线删除分支,就会出现这种问题,稍微有点强迫症的自然受不了。此时可以使用 "git fetch -p"使fetch之后删除没有与远程分支对应的本地分支。 当然也可以通过查看远程分支。使用命令"git remote show origin"显示如下:


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信