Git学习

Git配置

参考文档链接: http://www.yiibai.com/git/,略有修改。Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

1、/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 –system 选项的 git config 时,它会从此文件读写配置变量。刚安装git之后是没有这个文件的使用命令如:“sudo git config –system user.name tangquan”会新建该文件。

2、~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递–global 选项让 Git 读写此文件。

3、当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。

每一个级别覆盖上一级别的配置,2级覆盖1级的配置,3级覆盖2级的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

当安装完 Git 应该做的第一件事就是设置用户名称与邮件地址。这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到每一次提交中,不可更改:
git config –global user.name “maxsu”
git config –global user.email maxsu@yiibai.com
再次强调,如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用这些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行不使用 –global 选项的命令来配置。很多 GUI 工具都会在第一次运行时帮助你配置这些信息。

用户信息已经设置完毕,你可以配置默认文本编辑器了,当 Git 需要您输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:
git config –global core.editor emacs
我的系统上使用的是nano编辑器,所以替换成vim:
git config –global core.editor vim。



Git基本工作原理

Git中使用了Repository(仓库)的概念,一个repository用来管理一个工程,用来存储工程的所有文件。使用git的第一步就是创建仓库,创建仓库可以使用git init命令或者从GitHub等网上克隆项目仓库到本地。我使用GitHub来进行工作,在GitHub上创建一个新的仓库取名test,然后在本地使用 git clone名将新建的仓库克隆下来使用。

有了仓库之后就能进行工作了,需要理解Git对待文件的几个概念:Untracked、Unmodified、Modified、Staged。这四种状态的直白解释就是:未被仓库跟踪管理、已被仓库跟踪管理且未修改、已被仓库跟踪管理且已修改、已被仓库跟踪管理且已修改但是存入仓库的暂存区。Git仓库要管理工程就要对所有工程文件了如指掌,刚克隆下来的仓库下的文件都是已被仓库跟踪管理的,但是对于新建的文件仓库是没有跟踪的,也就是处于Untracked的状态,我们需要将Untracked文件添加到仓库中去,但是直接存放进仓库是不行的,仓库会建立一个暂存区,这个暂存区相当于仓库的临时存放区,用来暂存一些新建的文件、被修改的文件等,然后执行commit操作的时候Git将暂存区中的所有数据打包成一个commit对象(下文解释commit对象)并提交进仓库。引用一张图片说明一下文件的四种状态的转换关系:

这里写图片描述

以上面新建的test仓库为例,克隆到本地之后我们在仓库的工作目录下新建一个文件a.c:

#include "stdio.h"

void main()
{
    printf("new file\r\n");
}

创建完了自己知道有这个文件,Git仓库还没跟踪这个文件,Git仓库只是知道工作目录下多了一个文件,我们使用命令git status查看当前工作区的状态:

tq@ubuntu:~/work/test$ git st
On branch branch1
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    a.c

nothing added to commit but untracked files present (use "git add" to track)

提示我们有Untracked files,就是存在没有被跟踪的文件a.c,并提示我们使用git add将文件添加到暂存区中。那我们就把这个文件加入到仓库好让仓库能够跟踪管理这个文件。根据上面说的我们添加文件到仓库需要先保存到暂存区,使用命令:
git add a.c
然后在将暂存区提交到仓库中去:
git commit -m “add file a.c”, -m “add file a.c” 表示的是对该commit的注释。
一切正常的话a.c文件就已经被保存进仓库并且被仓库跟踪和管理。下面对a.c文件进行一次修改操作:

#include "stdio.h"

void main()
{
    printf("modified\r\n");
}

再使用git status查看仓库状态:

tq@ubuntu:~/work/test$ git st
On branch branch1
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   a.c

no changes added to commit (use "git add" and/or "git commit -a")

提示我们Changes not staged for commit,表示有文件被修改了,并且没有保存到暂存区中去,可以使用git add保存到暂存区然后执行commit保存到仓库。


现在知道执行add操作之后是将文件存放到了stage暂存区中去了,然后执行commit将暂存区中的数据保存到git仓库中去,那么commit提交到仓库的数据具体是什么呢?其实commit操作是将stage暂存区中的数据打包成一个“commit对象”,这个commit对象可以被理解成一个补丁,补丁就是对原始文件的修补,这样就好理解了,一个commit对象对前面的文件进行打补丁形成新的文件。那么通过补丁我们就能实现文件的修改了,并且版本仓库中没必要每个版本都存储所有工程文件,而只是存储补丁即可,显然存储补丁比存储完整的工程文件好很多。
我们在工作的时候每完成一个阶段的任务就要保存一次,当然是用git进行保存不是简单的进行“Ctrl+S”,而是要将文件保存到git仓库中去,保存进仓库中就是保存上述的commit对象,经过很多次commit操作之后整个仓库就成了由commit对象组成的一个链(暂时不考虑分支):
原始文件 –> commit1(添加文件1) –> commit2(添加文件2) –> commit3(修改文件1和2)(master<–HEAD)
HEAD指针指向当前分支的指针,比如上面这个就一个分支的情况下HEAD指针就是指向master主分支,master分支当前处在commit3上,就是说当前工程文件其实是原始文件经过三次打补丁之后得到的。



Git分支工作原理

Git的另一个重要概念是branch(分支),每个仓库可以有很多个分支,分支的概念就像是平行宇宙一样,其中一个世界分支向全球大统一发展,另一个分支向世界第三次战争发展。Git的分支也是类似的原理,只是Git仓库总有一个主分支,也就是最初始的分支叫做master分支,并且Git的分支能由我们自己控制,比如一个分支向项目方案1发展,另一个分支向项目方案2发展,最后发现方案1不能用,就是用方案2了,就将方案2的分支归并到主分支中去。
以前我编程的时候进行版本控制就是简单的进行复制然后重命名加一个版本代号,这样会导致越来越多的工程被复制,然后工程中有很多文件例如库函数文件等都是不会变的,粗鲁的复制浪费了硬盘的空间,其实只要保存新建的或者修改过的文件即可,Git则很聪明,不会每个分支都完全复制一份父分支,Git拥有自己的“文件系统”,用文件系统这个词可能不太严谨,和传统的文件系统的概念不一样,Git只是有自己组织管理文件的方法,当然我们不管他怎么管理文件,我们只看他暴露出来给用户的现象: 仓库会存储所有分支的commit对象数据,并且将当前工作分支的文件还原到工作区,就是工程目录中,切换了分支之后工作区中的文件也会被跟新为最新分支的工作环境,分支切换的大致原理就是执行或者反执行commit补丁实现前进和回退操作达到工作区中文件切换的目的。Git官方对分支的解释非常好,并且解释了内部的工作原理、commit对象的格式等等: https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E4%BD%95%E8%B0%93%E5%88%86%E6%94%AF



Git使用

完全参考官方文档: https://git-scm.com/book/zh/v1即可,写的很详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值