0 系统概述
版本控制分为本地版本控制(lvcs),中心化版本控制(cvcs),以及分布式版本(dvcs)控制:
local 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