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 commitgit 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