git创建以及使用

446 阅读6分钟

什么是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目录

所有文件对象 具体详情请看 这篇翻译文章

blog.csdn.net/songyuequan…

12 info

待研究

13 index

Git暂存区原理

14 hooks

shell脚本