git原理笔记

242 阅读6分钟

0 系统概述

版本控制分为本地版本控制(lvcs)中心化版本控制(cvcs)以及分布式版本(dvcs)控制:

local version control system

centralized version control system
distributed version control system

其中最常用的是lvcs和cvcs。(图中一版version=一次commit)

1 基本操作

阅读说明:[参数],(可省略内容)

1.1 创建仓库

1.1.1 lvcs下创建仓库

mkdir proj_floder
cd proj_path
git init

1.1.2 cvcs下创建仓库

step one 在服务器上创建仓库
进入github.com网站创建仓库(不可省)

step two 建立本地仓库

// 方法一: 用clone拉取远端仓库
git clone [仓库地址] (-b [分支名])
git clone https:\\github.com\misakisaysyes\repo (master)
// 方法二:用pull拉取远端仓库分支
// 先新建本地仓库,init得到一个.git目录
git init

// 拉取远端特定仓库分支
git pull [仓库地址] ([分支名])
git pull https:\\github.com\misakisaysyes\repo (master)

//注意:经常看到 git pull origin master的写法,orgin其实表示的是仓库的url地址
// 方法三:用本地建立仓库后用,用remote关连远端仓库并push
git init
/* 操作文件 */
git add .
git commit -m [说明内容]
/* 操作仓库 */
git remote add [远程仓库地址别名] [远程仓库地址]
git push [远程仓库地址别名] ([分支名]) //该条可以用来创建新分支

/* 示例 */
git init
git add .
git commit -m "xxxxx"
git remote add origin https:\\github.com\misakisaysyes\repo.git
git push origin master

1.2 在仓库中记录变化

1.2.1 文件状态图

文件状态与git基本操作之间的关系

staged状态:仓库中文件或者文件的变化能被git识别的状态。可理解为该状态下的文件或者文件变化的信息是记录在.git隐藏目录中的。

撤销文件的staged状态

git reset HEAD filename

untracked状态:仓库中文件不能被git识别的状态。可理解为.git隐藏目录中未记录该文件信息。

unmodified状态:刚clone下来或者是commit以后的文件处于该状态。是staged状态的子集,也是staged状态的最终态。

modified状态:修改了unmodified文件的内容就变成modified状态。 撤销文件的modified状态

git checkout -- filename

1.2.2 与状态转化相关的操作

add

// 添加项目里全部文件
git add .
// 添加单个文件
git add readme.md

执行[git add .]前创建[.gitignore]文件可以自动避免添加一些文件(比如项目编译时生成的链接文件)。

touch .gitignore
vim .gitignore
// .gitignore的常见语法见:https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository

rm

有两种删除:在[.git目录]下的删除, 在[工作目录]下的删除。

// 仅在.git目录下的删除
// 加--cache,则会删除文件在.git中的信息,但是本地工作目录文件仍在
git rm --cache filename
// 在.git和工作目录下同时删除
// .git目录下的信息被移除,同时本地工作目录文件也被移除
git rm filename

另外要注意使用rm时的通配符形式。

// * 代表省略的字符串
// / 表示目录路径
// 因为shell中有自己的*.log文件,git也可能有自己的*.log文件
// 为了防止误删所以需要加\
git rm log/\*.log

commit
在commit之前必须先add即:

git add .
git commit -m "XXXXXX"

但是也可以缩写为

git commit -a -m "XXXXXX"

重写commit

// 比如在commit之后push之突然又add了一个文件
git commit -m 'Initial commit'
git add forgotten_file
git commit --amend

其他
文件重命名

git mv from_filename to_filename

查看提交历史

git log

应用技巧

// 不断用git status查询当前状态与转化到下一步状态需要的操作。
git status

1.2 git Tag

https://git-scm.com/book/en/v2/Git-Basics-Tagging

2 分支理论

2.1 概念解释

一次commit生成一个指针,指针指向该项目的树根指针,树根指针中包含了每个子目录的校验和子目录地址。即每次commit指向了该项目的一个快照。

同一个项目的commit与commit之间通过父子关系相连。

分支是一个指针,指向某次的commit指针,同时用HEAD指针指向当前所处正在使用的分支。

2.2 操作

2.2.1 创建新分支与切换分支

创建新分支

git branch testing

切换当前正在工作的分支

git checkout testing

创建分支并切换

git checkout -b testing

2.2.2 合并分支与删除分支

两种合并方式

合并方式一:merge

git checkout [合并的目的分支名]
git merge [被合并分支名]
git branch -d [被合并分支名]
// 创建hotfix分支并用head指向该分支(head未画)
git checkout -b hotfix
// 将head切换回master主分支准备合并 (head未画)
git checkout master

// 将hotfix分支合并到master
git merge hotfix

// 合并完毕删除hotfix分支
git branch -d hotfix

合并方式二:rebase

git checkout [被合并分支名]
git rebase [目的分支名]
git branch -d [被合并分支名]
// merge例子用rebase改写就是
git branch -b hotfix
git rebase master
git branch -d hotfix

其他

// 查看分支信息
> git branch

rebase和merge的区别:merge会使得commit结点形成树状。rebase会使得commit结点之间的关系尽量成链状,条理比merge更清晰,但是merge更安全。

2.2.3 远程分支控制

2.2.3.1 基本操作

origin源代表的是远程某个仓库的地址,例如https://github.com/misakisaysyes/test.git

// 查看远程信息源信息
git remote -v 
// 查看远程具体每个源中的信息(地址分支什么的)
git remote show origin
// 重命名远程源
git remote rename oldname newname
// 删除源
git remove originname

2.2.3.1 clone fetch pull push

git clone [仓库名] ([分支名])

使用git clone时,git会将仓库拉下来并:在本机上创建远端主分支origin master,以及创建本地主分支local master。开发人员在本地主分支上进行开发

git fetch [仓库名] ([分支名])

当在本地开发到一定时候想要知道远端版本更迭信息时,可以用git fetch拉取远端仓库信息。

git pull [仓库名] ([分支名])

git pull = git fetch + git merge pull会将最新的版本信息拉取下来并合到本地主分支中,会将代码更新到最新版。pull是通过比对本地的origin/master和远端的master,两者不一样。git才会将本地的代码更新到最新版。

git push [仓库名] ([分支名])

当push时分支名不存在时,远端会自动创建分支。

其他

"--"后紧跟[选项] --cache

"-"后紧跟[选项缩写] -b

选项后有值,用等号或者空格分隔后面的加不加引号无所谓。

使用git status不断查询当前状态和下一步要做什么

工作树 working tree:本机仓库目录结构,如示例中repo及repo以下目录。可以理解为工作目录

// 示例:本机有某个叫repo的仓库
|---home
    |---E:
        |---github
            |---repo
                |---.git
                |---imgs
                |---codes