什么是git
git是当前互联网开发的主流版本分布式控制系统
全称是分布式版本控制系统,git通常在编程中会用到,并且git支持分布式部署,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库
还有一个SVN是集中式版本控制系统 两者最大的区别就在于SVN只有一台主服务器,而git所用到的每一台电脑都可以当成主服务器
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库.
Git的优缺点
1.分布式开发时,可以git clone克隆一个本地版本,然后在本地进行操作提交,本地可以完成一个完整的版本控制。在发布的时 候,使用git push来推送到远程即可。
2.git分支的本质是一个指向提交快照的指针,速度快、灵活,分支之间可以任意切换。都可以在本地进行操作可以不同步到远程
3.冲突解决,多人开发很容易就会出现冲突,可以先pull远程到本地,然后在本地合并一下分支,解决好冲突,在push到远程即 可。
4.离线工作,如果git服务器出现问题,也可以在本地进行切换分支的操作,等联网后再提交、合并等操作。
缺点:
1.git没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制。
2.工作目录只能是整个目录,而svn可以单独checkout某个有权限的目录。
3.git上手可能没有svn那边顺手,需要经过学习一下。
总结:
1.如果对访问控制、权限分配和代码安全性等要求比较高的,建议使用svn。
2.如果是分布式,多人开发,版本迭代比较快的项目,建议使用git。
Linux 平台上安装
Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。
在有 yum 的系统上(比如 Fedora)或者有 apt-get 的系统上(比如 Debian 体系),可以用下面的命令安装:
各 Linux 系统可以使用其安装包管理工具(apt-get、yum 等)进行安装:
可以直接在官网上下载安装:git-scm.com/downloads
命令/术语 常见翻译以及简介 add 暂存:将更改添加至暂存区(stage) commit 提交:提交暂存区,生成新的 commit 对象,并重定向当前分支到新的 commit 对象 branch 分支:创建一个新的分支,指向当前 commit 对象 HEAD 指针:指针指向当前分支(branch),当前分支指向一个 commit 对象,即当前版本 reset 重定向 HEAD 所指向的分支(当前分支)到目标 commit 对象 checkout 重定向 HEAD 到目标分支(也用作文件撤销更改) merge 合并:将目标分支合并到当前分支。若非快速合并,会生成新的 commit 对象 stash 储藏:保存当前的工作区和暂存区,以待将来取出(应用) clone 克隆:将远程仓库复制为一个本地仓库 push 推送:将本地仓库的一个分支推送至远程仓库的指定分支 fetch 获取:将一个远程仓库的一个分支复制到本地 pull 拉取:将一个远程仓库的一个分支复制到本地并尝试合并。pull = fetch + merge fork 指在 GitHub 上复制一个别人的仓库为自己的远程仓库 pull request 指在 GitHub 上请求别人拉取自己为他的仓库开发的分支
Git仓库.git文件夹目录介绍
1 ORIG_HEAD
远程仓库 当前引用 在git本地仓库根目录 运行: cat .git/ORIG_HEAD 1 显示 88e6fb86f5317bdfd2e8a78899334e9f0ba16987
1 2 如图:
2 HEAD
本地仓库 当前引用 文件内容:refs/heads/ 1 在git本地仓库根目录 运行: cat .git/HEAD 1 显示 ref: refs/heads/master
1 2
3 refs/heads/branchName
本地仓库 当前分支 在git本地仓库根目录 运行: cat .git/refs/heads/master 1 显示 3396b04ee5343498d8c2f457d14d3aee36239c6f
1 2 这是 当前分支最后一次commitId 2 和 3 的关系如图:
4 refs/remotes/repertoryName/HEAD
远程仓库当前分支 在git本地仓库根目录 运行: cat .git/refs/remotes/origin/HEAD 1 显示 ref: refs/remotes/origin/master
1 2
5 refs/remotes/repertoryName/remoteBranchName
远程仓库对应分支最后一次commit 在git本地仓库根目录 运行: cat .git/refs/remotes/origin/master 1 显示 581ba1436ebaa54a7f5d0f1db8cc4da0ca72127e
1 2 这是远程仓库当前分支最后一次commitId 4 和 5 的关系如图:
6 logs/refs/heads/branchName
本地仓库对应分支所有操作 在git本地仓库根目录 运行: cat .git/logs/refs/heads/master
1 2 显示 0000000000000000000000000000000000000000 88e6fb86f5317bdfd2e8a78899334e9f0ba16987 author author@youxiang.com 1537330001 +0800 clone: from github.com/google/guav…
88e6fb86f5317bdfd2e8a78899334e9f0ba16987 581ba1436ebaa54a7f5d0f1db8cc4da0ca72127e author author@youxiang.com 1538568357 +0800 pull: Fast-forward 1 2 3 本地master分支的两次操作 1 clone 项目 commitId(0000000000000000000000000000000000000000) ——> commitId(88e6fb86f5317bdfd2e8a78899334e9f0ba16987) 1 2 git pull: Fast-forward commitId(88e6fb86f5317bdfd2e8a78899334e9f0ba16987) ——> commitId(581ba1436ebaa54a7f5d0f1db8cc4da0ca72127e) 1
7 logs/refs/heads/repertoryName/branchName
远程仓库对应分支所有操作 在git本地仓库根目录 运行: cat .git/logs/refs/remotes/origin/master 1 显示 88e6fb86f5317bdfd2e8a78899334e9f0ba16987 581ba1436ebaa54a7f5d0f1db8cc4da0ca72127e songyuequan songyuequangit@163.com 1538568357 +0800 pull: fast-forward 1 同上
8 refs/tags/tagName
文件内容:tag所在的commitID 在git本地仓库根目录 运行: cat .git/refs/tags/Release1.0 1 显示 72014f48f489e1e43519212de1bd9f78c3755a4c 1
9 packed-refs
clone仓库时所有的引用
10 COMMIT_EDITMSG
本地最后一个提交的信息
11 objects目录
所有文件对象 具体详情请看 这篇翻译文章
12 info
待研究
13 index
Git暂存区原理
14 hooks
shell脚本