git命令使用总结
最近换了份工作,在新的公司里面,对于软件版本控制工具使用的是git,我之前的那家公司使用的是svn。
第一印象,感觉git比svn牛逼很多。现在我来比较下两个工具的区别,并简单介绍下git的命令。
一、区别
1、git是分布式的,svn是集中式的。
git和svn都有一个集中存放代码的地方,他们的区别在于每个开发者每次修改都是直接跟中心库交互。但是git的话开发者的修改时跟本地的仓库(repository)交互,等到特定的时间点或者进度点才推送(push)到中心库。
2、git把数据按元数据方式存储,但svn是按文件方式。
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的 体积大小跟.svn比较,你会发现它们差距很大。
3、git的分支概念优于svn
svn的分支概念就是新拷贝一份代码,这个办法非常原始,且耗时耗空间。git的分支是按一个快照的方式存储,创建分支快速且不耗空间。
4、GIT的内容完整性要优于SVN
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
二、git命令总结
1、git status 查看当前仓库的状态
2、git diff 查看区别
git diff 比较工作目录树与暂存区的区别
git diff --cached 比较暂存区和版本库的区别
git diff HEAD 比较工作目录树(包括暂存区和未暂存)与版本库的区别
git diff HEAD -- filename.txt 查看文件filename.txt文件的区别
3、git add 把修改从工作目录树提交到暂存区
4、git commit -m "message..." 把修改从暂存区提交到版本库
5、git log 显示由近到远的提交日志
git log -n 显示输出的条数,n表示条数
git log --name-status 显示由近到远的提交日志,且日志中显示出每次提交修改的文件
git log --stat 仅显示简要的增改行数统计
git log --pretty=[oneline | format | short | full | fuller]
6、git reset
git reset -- hard HEAD^ 回退到上一个版本
git reset --hard [commit] 自commit以来在working directory 中的任何改变都会被放弃
git reset --soft [commit] 自commit以来的所有改变都会显示在git status的changes to be commited中
7、git checkout 检出
git checkout -- file 撤销修改(就是让这个文件回到最近一次git commit
或git add
时的状态)
git checkout -b branch1 master 新建一个分支,并检出到新分支
git checkout dev 切换到dev分支
8、git push 推送到远程
git push origin HEAD:refs/for/master 这是我公司的一个推送办法,再把修改推送到远程之前,要有个review的过程
9、git clone 克隆一个到本地库
10、git branch dev 创建分支dev
git branch -d dev 删除分支dev
git branch -m dev development 把dev分支重命名为development
11、git merge 合并dev分支到当前分支
git merge 直接合并[straight merge],将一条分支直接合并到另一条分支
git merge --squash branch1 压合合并[squashed commits],将一条分支上的所有提交压合成一个提交
12、git stash 工作做到一半,想切换到别的分支处理问题,保存本工作区的环境
git stash list 查看保存的工作区环境
git stash apply 恢复工作环境
git stash drop 删除stash的内容
git stash pop =git stash apply+git stash drop
13、git rebase 变基,重新定义分支的版本库状态
git rebase test
1、先将test分支的代码checkout出来,作为工作目录
2、然后将master分支从test分支创建起的所有改变的补丁,依次打上,如果打补丁的过程没有问题,就解决冲突
3、如果打补丁的时候出现冲突,就解决冲突,可以后运行git rebase -continue
4、如果你不想处理冲突,要么放弃rebase过程(git rebase -abort),要么直接用test分支取代当前分支(git rebase -skip)
14、git cherry-pick <commit-id> 将本地test分支上的一个commit合并到本地master分支上,就可以在master分支上执行该命令。
15、git tag <tag-name> <节点> 打标签
16、git blame
git blame test.file 行git blame
;命令时,会逐行显示文件,并在每一行的行首显示commit号,提交者,最早的提交日期
参考博客:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000