Git 是一个开源的分布式版本控制系统
,是目前世界上最先进
、最流行
的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。
特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能
和高可用性
使用 Git 管理的项目,拥有三个区域,分别是工作区
、暂存区
、Git 仓库
。
工作区:处理工作的区域.
暂存区:已完成的工作的临时存放区域,等待被提交.
Git仓库:最终的存放区域.
已修改(modified):表示修改了文件,但还没将修改的结果放到暂存区.
已暂存(staged):表示对已修改文件的当前版本做了标记,使之包含在下次提交的列表中.
已提交(committed):表示文件已经安全地保存在本地的 Git 仓库中.
注意:
工作区的文件被修改了,但还没有放到暂存区,就是已修改
状态。
如果文件已修改并放入暂存区,就属于已暂存
状态。
如果 Git 仓库中保存着特定版本
的文件,就属于已提交
状态。
①在工作区中修改文件
②将你想要下次提交的更改进行暂存
③提交更新,找到暂存区的文件,将快照永久性存储到 Git 仓库
①将尚未进行版本控制的本地目录转换为 Git 仓库
②从其它服务器克隆
一个已存在的 Git 仓库
如果自己有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,需要执行如下两个步骤:
①在项目目录中,通过鼠标右键打开“Git Bash”
②执行 git init
命令将当前的目录转化为 Git 仓库
git init 命令会创建一个名为 .git
的隐藏目录,这个.git目录就是当前项目的Git仓库
,里面包含了初始的必要文件
,这些文件是 Git 仓库的必要组成部分
。
工作区中的每一个文件可能有 4 种状态
,这四种状态共分为两大类
Git 操作的终极结果:让工作区中的文件都处于“未修改
”的状态。
可以使用 git status
命令查看文件处于什么状态.
在状态报告中可以看到新建的 index.html
文件出现在 Untracked files
(未跟踪的文件) 下面。
未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件
;Git 不会自动将之纳入跟踪范围,除非明确地告诉它“我需要使用 Git 跟踪管理该文件
使用 git status
输出的状态报告很详细,但有些繁琐。如果希望以精简的方式显示文件的状态
,可以使用如下两条完全等价的命令,其中 -s 是 --short
的简写形式
# 以精简的方式显示文件状态 git status -s git status --short
未跟踪文件前面有红色
的 ??
标记
使用命令 git add 开始跟踪一个文件。 所以,要跟踪 index.html 文件
git add index.html
此时再运行 git status
命令,会看到 index.html 文件在Changes to be committed
这行的下面,说明已被跟踪
,并处于暂存状态
以精简的方式显示文件的状态:
新添加到暂存区
中的文件前面有绿色
的 A
标记
现在暂存区中有一个 index.html 文件等待被提交
到 Git 仓库中进行保存。可以执行 git commit
命令进行提交,其中 -m 选项
后面是本次的提交消息
,用来对提交的内容做进一步的描述
git commit -m "新建了index.html文件"
证明工作区中所有的文件都处于“未修改
”的状态,没有任何文件需要被提交
如果需要被暂存的文件个数比较多,可以使用如下的命令,一次性将所有的新增和修改过的文件加入暂存区
git add .
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 在这种情况下,我们可以创建一个名为 .gitignore
的配置文件,列出要忽略的文件的匹配模式。
文件 .gitignore 的格式规范如下:
①以 # 开头
的是注释
②以 / 结尾
的是目录
③以 / 开头
防止递归
④以! 开头
表示取反
⑤可以使用 glob 模式
进行文件和文件夹的匹配(glob 指简化了的正则表达式)
所谓的 glob 模式
是指简化了的正则表达式:
① 星号 *
匹配零个或多个任意字符
②[abc]
匹配任何一个列在方括号中的字符
(此案例匹配一个 a 或匹配一个 b 或匹配一个 c)
③ 问号 ?
只匹配一个任意字符
④ 在方括号中使用短划线
分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)
⑤ 两个星号 *
表示匹配任意中间目录
(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)
Git的基本操作:
1.初始化 Git 仓库的命令
git init
2.查看文件状态的命令
git status
或git status -s
3.一次性将文件加入暂存区的命令
git add .
4.将暂存区的文件提交到 Git 仓库的命令
git commit -m "提交消息"
5.查看提交日历
git log/reflog -n --oneline
6.切换版本
git reset --hard ID
分支的概念
分支在实际开发中的作用
在进行多人协作开发的时候,为了防止互相干扰,提高协同开发的体验,建议每个开发者都基于分支进行项目功能的开发
master主分支
在初始化本地 Git 仓库的时候,Git 默认已经帮我们创建了一个名字叫做 master 的分支。通常我们把这个master
分支叫做主分支
。
在实际工作中,master 主分支的作用是:用来保存和记录整个项目已完成的功能代码
。
功能分支
由于程序员不能直接在 master 分支上进行功能的开发,所以就有了功能分支
的概念。
功能分支
指的是专门用来开发新功能的分支
,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上
查看分支列表
使用如下的命令,可以查看当前 Git 仓库中所有的分支列表
git branch
注意:分支名字前面的*
号表示当前所处的分支
。
创建新分支 git branch 分支名称
使用如下的命令,可以基于当前分支
,创建一个新的分支
,此时,新分支中的代码和当前分支完全一样
git branch 分支名称
切换分支
使用如下的命令,可以切换到指定的分支上
进行开发
git checkout login
分支的快速创建和切换
使用如下的命令,可以创建指定名称的新分支
,并立即切换到新分支
上
# -b 表示创建一个新分支 # checkout 表示切换到刚才新建的分支上 git checkout -b 分支名称
注意:
"git checkout -b 分支名称
" 是下面两条命令的简写形式:
① git branch 分支名称
② git checkout 分支名称
合并分支
功能分支的代码开发测试完毕之后,可以使用如下的命令,将完成后的代码合并到 master 主分支上
# 1. 切换到 master 分支 git checkout master # 2. 在 master 分支上运行 git merge 命令,将 login 分支的代码合并到master分支 git merge login
合并分支时的注意点:
假设要把 C 分支的代码合并到 A 分支,则必须先切换到A分支
上,再运行git merge命令
,来合并 C 分支!
删除本地分支
当把功能分支的代码合并到 master 主分支上以后,就可以使用如下的命令,删除对应的功能分支
git branch -d 分支名称
遇到冲突时的分支合并
如果在两个不同的分支中
,对同一个文件
进行了不同的修改
,Git 就没法干净的合并它们。 此时,我们需要打开这些包含冲突的文件然后手动解决冲突
# 假设:在把reg分支合并到master分支期间,代码发生了冲突 git checkout master git merge reg # 打开包含冲突的文件,手动解决冲突之后,再执行如下的命令 git add . git commit -m "解决了分支合并冲突的问题"
将本地分支推送到远程仓库
如果是第一次
将本地分支推送到远程仓库
# -u 表示把本地分支和远程分支进行关联,只在第一次推送的时候需要带 -u 参数 git push -u 远程仓库的别名 本地分支名称:远程分支名称 # 实际案例 git push - u origin payment:pay # 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化 git push -u origin payment
注意:第一次推送分支需要带 -u 参数
,此后可以直接使用git push
推送代码到远程分支。
查看远程仓库中所有的分支列表
通过如下的命令,可以查看远程仓库中,所有的分支列表的信息
git remote show 远程仓库名称
可以使用如下的命令,把远程分支最新的代码下载到本地对应的分支中
# 从远程仓库,拉取当前分支最新代码,保持当前分支的代码和远程分支代码一致 git pull