程序员

Git那些事

2018-02-20  本文已影响49人  木可大大
image

简介

Git是一个快速的、开源的、分布式的版本控制系统。 相较于SVN等集中式版本控制系统,Git是分布式,分布式的最大的好处是去中心化,每台客户机都有本地仓库,即使你在没有网络的情况下或者中心服务器发生宕机的情况下,也能够提交文件,创建分支等,而SVN等集中式版本控制系统在上述情况下就不能使用了。

基本功能

Git安装

Git用户配置

Git有三个级别的配置文件,分别是:

下面介绍配置的一些命令

可以使用命令git config user.name获取用户名,通过命令git config user.email获取邮箱
使用命令 git config [–global] user.name kwy 设置用户名
使用命令git config [–global] user.email kewy126@126.com 设置邮箱

git基本操作

  1. mkdir -pv project

  2. cd project

  3. git init

执行完git init生成一个隐藏目录.git,每一个本地库有且只有一个关于版本库相关信息的目录(.git,是一个隐藏目录),这也是Git和SVN等集中式版本控制目录的区别,git目录如下:

  1. $ ls -al

  2. total 24

  3. drwxr-xr-x 10 keweiyang staff320 1 18 21:34 .

  4. drwxr-xr-x 3 keweiyang staff 96 1 18 21:34 ..

  5. -rw-r--r-- 1 keweiyang staff 23 1 18 21:34 HEAD //表示git项目当前处于哪个分支

  6. drwxr-xr-x 2 keweiyang staff 64 1 18 21:34 branches

  7. -rw-r--r-- 1 keweiyang staff137 1 18 21:34 config //表示项目的配置信息

  8. -rw-r--r-- 1 keweiyang staff 73 1 18 21:34 description //表示项目的描述信息

  9. drwxr-xr-x 11 keweiyang staff352 1 18 21:34 hooks //表示系统默认钩子脚本目录

  10. drwxr-xr-x 3 keweiyang staff 96 1 18 21:34 info

  11. drwxr-xr-x 4 keweiyang staff128 1 18 21:34 objects //表示Git本地仓库的所有对象

  12. drwxr-xr-x 4 keweiyang staff128 1 18 21:34 refs //标识项目里的每个分支指向哪个提交(commit)

需要注意的是,当我们从github上clone一个项目时,如果这个项目包含很多不同版本的代码时,我们可以设置--depth=1拉取最新代码,避免由于代码过多导致拉取时间过长的问题。

  1. git clone -b master --depth=1//-b:表示branch,--depth=1:表示拉取最新的代码
  1. vim readme.txt

  2. git add . //将文件保存到暂存区

  3. git commit -m "新增readme文件" // 将文件保存到本地版本库

  4. git push origin //将文件保存到远程仓库

  1. git remote

  2. git remote -v

  1. git branch //查看当前属于哪个分支

  2. git branch hotfix //创建一个叫做hotfix的分支

  3. git checkout hotfix //切换到hotfix分支

  4. git status

notes

  1. 当在主分支中创建readme.txt,然后切换到hotfix分支中,这是没错误的,因此此时hotfix库为空的(库中并没有readme.txt),所以并不会和工作区中的readme.txt发生冲突

  2. 接着hotfix分支对readme.txt内容进行修改,并commit,然后checkout 到master分支,此时也不会出错

  3. 然后在master分支对readme.txt内容进行修改,但是没有进行commit(即使执行add命令),接着checkout到hotfix分支,此时会报错,因为,不同版本分支对应同一个工作区和暂存区,如果上一个版本都一个两个版本都有的内容进行修改,但是没有进行commit,然后,进行checkout操作,如果这个操作不报错的话,会导致上一个分支对内容修改的丢失

针对这个问题,有以下几种方法来解决:

  1. 把本地变更(commit),再切换分支

  2. 把本地变更储藏(stash)起来,再切换分支,切换前的状态可以在checkout回来之后执行stash apply恢复

  3. 丢失本地变更,使用-f参数强制checkout(不建议这么做)

  1. merge:把两个分支的最新快照和以及两者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照(并提交,如果没有冲突的话)

  2. rebase :提取目标分支引入的补丁和修改,然后在当前分支的基础上依次在应用一次

image image
上一篇 下一篇

猜你喜欢

热点阅读