前言

在日常工作中,经常会用到Git操作。但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼。本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理。

流程(名词)理解

linux git本地仓库的位置 git本地仓库的作用_git


先理解这四个桩:

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

下面我们来看他们的作用

  1. 工作区: 程序员进行开发改动的地方,是你当前看到的,也是最新的。 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
  2. 本地仓库:保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。
  3. 远程仓库:远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
  4. 小结
    任何对象都是在工作区中诞生和被修改;
    任何修改都是从进入index区才开始被版本控制;
    只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹;
    与协作者分享本地的修改,可以把它们push到远程仓库来共享。

我们用另一种方式来理解概念

linux git本地仓库的位置 git本地仓库的作用_linux git本地仓库的位置_02

命令

linux git本地仓库的位置 git本地仓库的作用_git_03


别人整理的一张图,很全很好,借来用下。看到这么多的命令,下面我们就来解释下,然而最好的解释就是利用实践!实践之前,还是要解释并理解一下:HEAD

linux git本地仓库的位置 git本地仓库的作用_工作区_04

HEAD,它始终指向当前所处分支的最新的提交点,你所处的分支变化了,或者产生了新的提交点,HEAD始终就会跟着改变。ADD

linux git本地仓库的位置 git本地仓库的作用_暂存区_05

add命令很简单,要实现将工作区修改的内容提交到暂存区,交由git管理。
1)git add .添加当前目录的所有文件到暂存区
2)git add dir添加指定目录到暂存区,包括子目录
3)git add file1添加指定文件到暂存区

COMMIT

linux git本地仓库的位置 git本地仓库的作用_工作区_06


功能:主要实现将暂存区的内容提交到本地版本库,并使得当前分支的HEAD向后移动一个提交点

1)git commit -m message提交暂存区到本地仓库,message代表说明信息

2)git commit file1 -m message提交暂存区的指定文件到本地仓库

3)git commit --amend -m message使用一次新的commit,替代上一次提交branch

linux git本地仓库的位置 git本地仓库的作用_暂存区_07


涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作。

命令解释:

1)git branch列出所有本地分支

2)git branch -r列出所有远程分支

3)git branch -a列出所有本地分支和远程分支

4)git branch branch-name新建一个分支,但依然停留在当前分支

5)git checkout -b branch-name新建一个分支,并切换到该分支

6)git branch --track branch remote-branc>新建一个分支,与指定的远程分支建立追踪关系

7)git checkout branch-name切换到指定分支,并更新工作区

8)git branch -d branch-name删除分支

9)git push origin --delete branch-name删除远程分支merge

linux git本地仓库的位置 git本地仓库的作用_暂存区_08

merge命令把不同的分支合并起来。如上图,在实际开放中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。

push

上传本地仓库分支到远程仓库分支,实现同步。

1)git push remote branch上传本地指定分支到远程仓库

2)git push remote --force强行推送当前分支到远程仓库,即使有冲突

3)git push remote --all推送所有分支到远程仓库

其他命令:
1)git status显示有变更的文件
2)git log显示当前分支的版本历史
3)git diff显示暂存区和工作区的差异
4)git diff HEAD显示工作区与当前分支最新commit之间的差异
5)git cherry-pick 选择一个commit,合并进当前分支

使用

第一步,得下载一个git,这个是大前提。
1.安装git

$ sudo apt-get install git

2.git全局配置
因为 git 是分布式版本控制系统,所以,每个机器都必须⾃报家⻔:你的 name 和 Email 地址。在命令⾏输⼊:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

–global 表⽰这台机器上所有的 git 仓库都会使⽤这个配置;如果对某个仓库指定不同的⽤ name 和 Email 地址,只需要去掉 --global 参数,对单个仓库进行配置。
3.创建版本库
版本库⼜名仓库,英⽂名 repository,可以简单理解成⼀个目录,这个目录⾥⾯的所有⽂件都可以被 git 管理起来,每个⽂件的修改、删除,git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

建好了⼀个空的仓库(empty Git repository),可以发现当前目录下多了⼀个 .git 的目录,这个目录是 git 来跟踪管理版本库的,⼿动修改目录⾥⾯的⽂件容易把仓库给破坏了。选择⼀个已经有文件的目录也是可以创建仓库。不建议使⽤⾃⼰正在开发的公司项目来学习 git。

4.把文件添加到版本库
把⼀个⽂件放到Git仓库只需要两步。
  第⼀步,⽤命令git add告诉Git,把⽂件添加到仓库:

$ git add readme.txt

第二步:用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

简单解释⼀下git commit命令, -m后⾯输⼊的是本次提交的说明,可以输⼊任意内容,当然最好是有意义的,这样你就能从历史记录⾥⽅便地找到改动记录。
5.工作区、暂存区和版本库
工作区(Working Directory):指的是在PC中能看得到的创建的一个管理仓库的目录,即当前项目目录。
  版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的时候,第一步是用git add把文件添加进去,是把文件修改添加到暂存区;第二步是用git commit提交更改,是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
  origin:如果将代码托管到远程服务器上,例如 github,gitee 或者自己搭建的 gitlab,就会设计到这个概念,对于 origin 以及其他远程概念,后续引出。
6.版本控制

$ git status
# On branch master
# 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上⾯的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。