前置知识:命令行基础、Git的安装与配置。
【本文是个人总结与思考,若有不准确处欢迎指正。本文可能不适合Git纯小白阅读,适合接触过一点Git的人复习与查阅。纯小白可以去看文末的参考资料】
1. Git概述
Git用于版本控制、多人协作等情景。
Git开源、免费,是分布式系统(每台设备上都有Git仓库的完整备份)。
2. Git基础知识
2.1 Git仓库结构
随便一个文件夹都可以建立Git仓库以进行管理,在该文件夹下执行该命令即可初始化:
git
该文件夹下会生成一个.git子文件夹,用以存储所有的管理信息。
Git仓库结构基本如下图所示:
工作区:根目录下除了.git文件夹之外的部分,即受Git管理的、实际工作的区域。
暂存区:暂时存放工作区所有的更改。暂存区即.gitindex这个文件。
版本库:记录所有的版本与分支,HEAD指向当前分支。只要Git仓库还在,提交到版本库的数据基本是不会丢失的。
贮藏栈:用于保存/恢复工作区的临时状态。
对象库:记录所有的对象(即所有数据内容。文件会被压缩,重复的文件不会再次放入)。暂存区和版本库实际记录的其实是对象库中文件的索引,即所谓的“快照”。
2.2 Git版本控制
使用Git进行版本控制的基本工作流程是:
- 在工作区中增加/更改/删除文件。
- 暂存,将文件快照放入暂存区。
- 提交,将暂存区的快照永久存入版本库。
版本库可以回滚暂存区和工作区,达到版本控制的目的。版本库还可以上传到远程仓库,如GitHub,以更安全地保存数据,以及方便地分享给其他人。
部分命令的数据流如下图所示:
2.3 Git文件状态
Git仓库中的每个文件有特定的状态,如下图所示:
未跟踪:工作区中的新文件,暂存区和版本库都没有。有可能丢失。所有工作区的文件不是“未跟踪”就是“已跟踪”。
未修改:工作区文件未被修改,暂存区和版本库都有。难以丢失。如果工作区中所有文件均处于“未修改”的状态,则工作区是干净的。
已修改:工作区文件被修改,暂存区和版本库只有老版本。修改部分有可能丢失。文件等待被暂存。
已暂存:工作区文件被修改,暂存区有,版本库只有老版本或没有。修改部分有可能丢失。暂存区等待被提交。
查看所有文件的状态,使用命令:
git status
例如:
3. Git分支
3.1 分支简介
分支简单来说,就是版本序列的岔路。可以创建、切换、合并分支。
多人协作时,可以每个人分配一个分支,避免频繁地修改主分支。各个分支也可以设计为分管不同的功能,如用于修某个bug的分支、开发某个新功能的分支等等。
3.2 分支原理
版本是用链表的形式串起来的,新的版本指向其基于的老版本。
如上图所示,不新建分支的时候,版本序列就是一条线,每一个圆圈即一个版本节点,也即一次commit. master是分支名,只是一个指向该分支最终版本的游标。HEAD是指向当前工作区正在修改的版本的游标。
我可以在v4版本新建一个分支dev(developing,开发分支):
然后可以切换到dev分支基于v4开发v4.1(切换分支的时候,工作区必须处于干净的状态。切换分支只是改变HEAD游标):
也可以切换回master分支基于v4开发v5:
还可以把dev分支再合并到master分支,使v4.1和v5的修改同时保留在v5.1版本:
当然,合并分支的时候,可能会出现冲突。如果v4.1和v5版本对同一个文件的同一处进行了修改,合并的时候Git并不知道应该保留哪个修改,就会通知你去人工操作。
例如,v4.1版本把conflict.txt文件内容改成v4.1,v5版本把conflict.txt文件内容改成v5,现在将v4.1合并到v5,Git发现了冲突,展示在conflict.txt文件中:
现在将conflict.txt的内容改成v5.1并保存,然后重新add该文件,并commit,就解决了冲突。打印一下版本网络图,可以看到v5与v4.1合并到v5.1的情况:
4. Git其他常见功能
只记录了几个我大致理解过的功能。(毕竟Git里的东西太多了,我也不是啥都用过或者熟悉。)
在后面的章节中暂不涵盖这些功能的命令,需要者可以自己查阅资料。
4.1 忽略文件(.gitignore)
Git可以忽略一些工作区中不想用Git管理的文件。
在工作区根目录下新建一名为.gitignore的文件,把需要忽略的文件的文件名填在其中即可。
4.2 别名(config)
即自定义以简化git的命令。
比如说,如果你不想每次提交都输入git commit这条命令,你可以定义别名,然后每次只需输入git ci即可。
4.3 标签(tag)
标签有点像一个不能移动的分支游标,用于标记重要的版本节点。版本号是经典的标签,例如v1.0,v4.
4.4 贮藏(stash)
如果工作区正在开发中,还需要很长时间才能commit,此时突然有个修复bug的任务,要求立刻切换到bug分支进行别的开发。如果此时把工作区commit,这将是一次脏的commit,开发到一半意义不明。
Git支持将工作区完整地贮藏起来,贮藏在贮藏栈里面,以后可以恢复。贮藏工作区之后,工作区会回到未曾修改的干净版本,可以切换分支。
4.5 变基(rebase)
变基可以把本地的有分叉的提交历史整理成一条直线。
5. Git常用控制命令整理
关于Git的全局帮助,见章节6. Git常用查询命令整理。
命令中尖括号<>内填入相应的名称或内容,方括号[]内可填可不填。
5.1 开始新的Git仓库
新建一个本地的Git仓库:
git init
从GitHub克隆一个现成的Git仓库,远程仓库名称默认为origin:
git clone <url>
5.2 更新与提交
把新文件、已修改的文件添加到暂存区:
git add <file>
把所有被跟踪的文件(被修改、被删除,不包括新建)提交到暂存区:
git add -u
git add -update
把所有被修改以及新建的文件(不包括被删除)提交到暂存区:
git add .
把所有文件(包括新建、被修改、被删除)提交到暂存区:
git add -A
git add -all
把暂存区提交到版本库:
git commit -m <message>
把工作区的全部修改提交到暂存区与版本库:
git commit -a -m <message>
把文件从工作区与暂存区删去:
git rm <file>
把文件仅从暂存区删去:
git rm --cached <file>
重命名文件,并暂存该过程:
git mv <old_file> <new_file>
5.3 撤销操作
上次提交少添加文件,或者提交信息写错,覆盖上次提交:
git commit --amend
把暂存区的文件撤回到HEAD中的状态,即取消暂存:
git reset [HEAD] <file>
把当前分支撤回到某个版本,暂存区与工作区不变:
git reset --soft <commit>
把暂存区和当前分支撤回到某个版本,工作区不变:
git reset [--mixed] <commit>
把工作区、暂存区和当前分支全部撤回到某个版本【慎用!】:
git reset --hard <commit>
把工作区的文件撤回到暂存区的状态【慎用!】:
git checkout -- <file>
把工作区和暂存区的文件撤回到某个版本【慎用!】:
git checkout <commit> <file>
5.4 分支操作
在HEAD处新建分支:
git branch <branch>
在HEAD处新建分支并切换到它:
git checkout -b <branch>
切换到某分支:
git checkout <branch>
把某分支合并到当前分支:
git merge <branch>
删除分支:
git branch -d <branch>
强制删除分支:
git branch -D <branch>
5.5 远程仓库操作
添加远程仓库:
git remote add <remote> <url>
远程仓库重命名:
git remote rename <old_remote> <new_remote>
删除远程仓库:
git remote rm <remote>
从远程仓库抓取所有新内容:
git fetch <remote>
从远程仓库抓取并自动尝试合并到当前所在分支:
git pull
把本地分支<branch>推送到远程仓库的对应分支,选项-u可以指定默认远程仓库:
git push [-u] <remote> <branch>
把当前分支推送到远程仓库的对应分支:
git push <remote>
把当前分支推送到默认远程仓库的对应分支:
git push
让某本地分支跟踪某远程分支:
git checkout --track <local_branch> <remote>/<remote_branch>
创建本地分支并让其跟踪某远程分支:
git checkout -b <local_branch> <remote>/<remote_branch>
删除某远程分支:
git push <remote> --delete <remote_branch>
6. Git常用查询命令整理
获取全局帮助:
git help
获取某条命令的帮助:
git help <verb>
git <verb> --help
6.1 本地
查看工作区与文件的状态:
git status
状态简览:
git status -s
查看工作区与暂存区的具体差别,即未暂存的修改:
git diff [<file>]
查看暂存区与HEAD的具体差别,即已暂存的修改:
git diff --cached [<file>]
查看工作区与HEAD的具体差别,即未暂存和已暂存的全部修改:
git diff HEAD [<file>]
查看提交历史:
git log [选项]
查看命令历史:
git reflog
6.2 分支
查看所有分支,选项-v可以查看每个分支的最后一次提交:
git branch [-v]
查看所有设置的跟踪分支:
git branch -vv
查看已经合并到当前分支的所有分支:
git branch --merged
查看所有包含未合并工作的分支:
git branch --no-merged
6.3 远程
查看已经配置的远程仓库,选项-v可以查看url:
git remote [-v]
查看远程仓库的更多信息:
git remote show <remote>
参考资料
这个是比较专业的Git仓库结构的整理,想深入了解Git的可以看看:
Git 仓库结构 (一)*** - 江召伟 - 博客园www.cnblogs.com这个小白有点难以看懂,不过有些东西还是值得参考,里面推荐的一些文章也不错:
Git 教程 | 菜鸟教程www.runoob.com这个是Git官方资料,小白可以看,资料最详尽,但是很多功能很少用,重点不突出:
Git - Bookgit-scm.com这个教程比较通俗易懂,有详细的指导与案例,重点突出,小结也很精简,非常适合小白:
Git教程www.liaoxuefeng.com