Git简介

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git 与 SVN 区别

Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git教程 - 图1

Git使用流程

Git图形化管理工具:https://desktop.github.com/ Git 完整命令手册地址:http://git-scm.com/doc

Git教程 - 图2

Git 命令几个专用名词的译名如下:

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

本地分支关联远程:git branch —set-upstream-to=origin/beta beta

一、Git安装


Git官网下载Git的安装程序,安装的过程我就不多说了,没啥好说的。

二、创建本地仓库


Git安装完成后有一个Git Bash,打开Git Bash。输入如下命令:

  1. cd d:
  2. mkdir learngit
  3. cd learngit

上述命令表示切换到电脑D盘,然后创建一个learngit的文件夹并将目录切换到该文件夹下。不确定自己是否已切换到指定目录,可以使用pwd命令显示当前路径。
最后,输入git init命令创建并初始化版本库。初始化完后会在当前目录下生成一个.git的隐藏目录,一般情况下,Windows是默认隐藏带有隐藏属性的目录和文件的,但是可以通过设置让隐藏文件可见。使用ls -ah命令也可以直接看生成的.git目录

三、提交文件


在learngit文件夹下新建一个README.txt的文本文件,然后内容输入This is a README file.。然后输入git add README.txt命令将文本文件添加进仓库,如果有多个文件,直接用空格隔开一次列出就可以了。接着使用git commit -m "add README file"提交操作。

四、提交修改


修改README.txt文件,将文件内容中的This改为It,使用git status查看仓库状态,显示绿色的文件已修改的状态,表示添加修改成功,接着使用git diff查看修改的内容,然后使用git add README.txt添加修改。最后使用git commit -m "modify README file"提交修改。
如果想查看提交记录,则可以使用git log命令。

五、创建SSH Key


在Git Bash中输入cd ~/.ssh命令查看根目录下有没有.ssh文件夹。如果能进入该文件夹,继续输入ls命令查看该目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可以不用创建SSH Key了。如果都没有,则用cd ~命令切回用户主目录,然后在Git Bash输入:

  1. ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车。完了,在用户主目录下会生成id_rsaid_rsa.pub这两个文件。可以用cat ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub查看文件的内容。

六、在代码托管平台添加公钥


为了便于多人协作开发,一般我们会在远程服务器上建立一个远程仓库用来同步不同开发者的代码。这个远程仓库可以放在某一台电脑上,也可以直接使用第三方的代码托管平台。这里我们选择名气比较大的GitHub来做实验。
登陆你的GitHub帐户。然后点击头像 -> Settings -> 左边栏SSH and GPG Keys -> New SSH key。然后复制上面id_rsa.pub文件中的内容,粘贴进Key文本域内。 Title域,随便填一个都行。
最后,使用ssh -T git@github.com命令来验证这个Key是不是正常工作。如果命令输入后,Key是正常工作的,则打印如下信息:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

GitHub官方提供了一个非常好用的Git图形化客户端GitHub Desktop

七、关联远程仓库


  1. 在GitHub首页,点击New repository创建一个仓库,具体创建步骤这里不做展开说明。
  2. 创建完成后,在该仓库的首页点击Clone or download->Use SSH->拷贝仓库SSH地址。我的创建的仓库地址是git@github.com:DavidSheh/learngit.git
  3. 在Git Bash中切换到本地仓库目录,然后输入git remote add origin git@github.com:DavidSheh/learngit.git。实际操作时请将命令中的远程仓库SSH地址替换成你自己的。如果没有打印任何信息说明关联成功。
  4. 推送本地仓库内容到远程仓库。第一次推送master分支的所有内容可以使用git push -u origin master命令。成功后,以后每次有修改后,可以直接用git push origin master命令推送了。

八、克隆远程仓库


如果本地没有远程仓库的项目,想从远程仓库克隆一个仓库到本地应该怎么做呢?
其实很简单,只需要用cd命令切换到想要存放项目的路径,然后直接执行git clone命令就行了,注意命令后面跟的是项目的URL地址。项目在GitHub上的SSH和HTTPS地址均测试成功。
到此为止,Git的操作环境已经熟悉的差不多了,只要能成功的在GitHub上提交代码,那么在国内的代码托管平台(如CSDN Code平台Coding.Net)托管代码也是很容易的事。

九、Git 常用命令


熟悉了上面的操作后,通过举一反三,Git的其他操作都可以通过查命令文档来操作。下面附上一份常用的命令清单:

  1. git init # 初始化本地git仓库(创建新仓库)
  2. git config --global user.name "xxx" # 配置用户名
  3. git config --global user.email "xxx@xxx.com" # 配置邮件
  4. git config --global color.ui true # git status等命令自动着色
  5. git config --global color.status auto
  6. git config --global color.diff auto
  7. git config --global color.branch auto
  8. git config --global color.interactive auto
  9. git config --global --unset http.proxy # remove proxy configuration on git
  10. git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库
  11. git status # 查看当前版本状态(是否修改)
  12. git add xyz # 添加xyz文件至index
  13. git add . # 增加当前子目录下所有更改过的文件至index
  14. git commit -m 'xxx' # 提交
  15. git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改)
  16. git commit -am 'xxx' # 将add和commit合为一步
  17. git rm xxx # 删除index中的文件
  18. git rm -r * # 递归删除
  19. git log # 显示提交日志
  20. git log -1 # 显示1行日志 -n为n行
  21. git log -5
  22. git log --stat # 显示提交日志及相关变动文件
  23. git log -p -m
  24. git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
  25. git show dfb02 # 可只用commitid的前几位
  26. git show HEAD # 显示HEAD提交日志
  27. git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
  28. git tag # 显示已存在的tag
  29. git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
  30. git show v2.0 # 显示v2.0的日志及详细内容
  31. git log v2.0 # 显示v2.0的日志
  32. git diff # 显示所有未添加至index的变更
  33. git diff --cached # 显示所有已添加index但还未commit的变更
  34. git diff HEAD^ # 比较与上一个版本的差异
  35. git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异
  36. git diff origin/master..master # 比较远程分支master上有本地分支master上没有的
  37. git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容
  38. git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)
  39. git branch # 显示本地分支
  40. git branch --contains 50089 # 显示包含提交50089的分支
  41. git branch -a # 显示所有分支
  42. git branch -r # 显示所有原创分支
  43. git branch --merged # 显示所有已合并到当前分支的分支
  44. git branch --no-merged # 显示所有未合并到当前分支的分支
  45. git branch -m master master_copy # 本地分支改名
  46. git checkout -b master_copy # 从当前分支创建新分支master_copy并检出
  47. git checkout -b master master_copy # 上面的完整版
  48. git checkout features/performance # 检出已存在的features/performance分支
  49. git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
  50. git checkout v2.0 # 检出版本v2.0
  51. git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出
  52. git checkout -- README # 检出head版本的README文件(可用于修改错误回退)
  53. git merge origin/master # 合并远程master分支至当前分支
  54. git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改
  55. git push origin master # 将当前分支push到远程master分支
  56. git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
  57. git push --tags # 把所有tag推送到远程仓库
  58. git fetch # 获取所有远程分支(不更新本地分支,另需merge)
  59. git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支
  60. git pull origin master # 获取远程分支master并merge到当前分支
  61. git mv README README2 # 重命名文件README为README2
  62. git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退)
  63. git rebase
  64. git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
  65. git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933
  66. git ls-files # 列出git index包含的文件
  67. git show-branch # 图示当前分支历史
  68. git show-branch --all # 图示所有分支历史
  69. git whatchanged # 显示提交历史对应的文件修改
  70. git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
  71. git ls-tree HEAD # 内部命令:显示某个git对象
  72. git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH
  73. git reflog # 显示所有提交,包括孤立节点
  74. git show HEAD@{5}
  75. git show master@{yesterday} # 显示master分支昨天的状态
  76. git log --pretty=format:'%h %s' --graph # 图示提交日志
  77. git show HEAD~3
  78. git show -s --pretty=raw 2be7fcb476
  79. git stash # 暂存当前修改,将所有至为HEAD状态
  80. git stash list # 查看所有暂存
  81. git stash show -p stash@{0} # 参考第一次暂存
  82. git stash apply stash@{0} # 应用第一次暂存
  83. git grep "delete from" # 文件中搜索文本“delete from”
  84. git grep -e '#define' --and -e SORT_DIRENT
  85. git gc
  86. git fsck

十、参考资料

  1. 廖雪峰Git教程
  2. Git命令大全
  3. 阮一峰老师的常用 Git 命令清单

    思维导图


    Git教程 - 图3