@
目录在开始使用 Git 管理项目的版本之前,需要将它安装到计算机上。可以使用浏览器访问如下的网址,根据自己的操作系统,选择下载对应的 Git 安装包:https://git-scm.com/downloads
Git安装教程——挣扎的工程师的博客-CSDN博客
安装完 Git 之后,首先要设置自己的 用户名 和 邮件地址。因为通过 Git 对项目进行版本管理的时候,Git 需要使用这些基本信息,来记录是谁对项目进行了操作
进入 Git Bash
:
$ git config --global user.name "username"
$ git config --global user.email "userEmail"
注意:如果使用了 --global
选项,那么该命令进行全局配置,只需要运行一次,即可永久生效。
通过 git config --global user.name 等 全局配置的操作信息会被写入到 C:/Users/用户名文件夹/.gitconfig
文件中。这个文件是 Git 的全局配置文件,配置一次即可永久生效。该文件可以通过记事本打开。
除了使用记事本查看全局的配置信息之外,还可以运行如下的终端命令,快速的查看 Git 的全局配置信息:
$ git config --list --global
$ git config user.name
可以使用 git help <verb>
命令,无需联网即可在浏览器中打开帮助手册,例如:
$ git help config
完整的手册比较详细,也可以用git <verb> -h
选项获得更简明的“help”输出在控制台:
$ git config -h
如果自己有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,需要执行如下两个步骤:
Git Bash
git init
命令将当前的目录转化为 Git 仓库工作区中的每一个文件可能有 4 种状态,这四种状态共分为两大类,如图所示:
Git 操作的终极结果:让工作区中的文件都处于 “未修改” 的状态。
可以使用 git status
命令查看文件处于什么状态,例如:
在状态报告中可以看到新建的 index.html
文件出现在 Untracked files
(未跟踪的文件) 下面。
未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非明确地告诉它“我需要使用 Git 跟踪管理该文件”。
文件状态列表:
Untracked files
: 未跟踪 的文件changes to be committed
: 已被跟踪 并处于 暂存状态 的文件Changes not staged for commit
: 已跟踪 ,内容发生了变化,但还没有放到暂存区 的文件使用git status -s
输出的 精简的状态报告,其中 -s
是 --short
的简写形式:
文件状态表示符:
??
: 未跟踪状态 的文件A
: 已被跟踪 并处于 暂存状态 的文件M
:已跟踪 ,内容发生了变化,但还没有放到暂存区 的文件M
: 表示文件 已修改 且 已放入暂存区D
: 表示在 工作区 和 Git仓库中 的该文件已被删除git add
功能:
使用命令 git add 指定文件名
开始跟踪一个文件, 比如:
执行 git commit
命令 把 暂存区中 的文件 提交到 Git 仓库中进行保存
其中 -m
选项后面是本次的提交消息,用来对提交的内容做进一步的描述:
文件提交之后查看文件状态,输出结果表示: 工作区中所有的文件都处于 “未修改” 的状态,没有任何文件需要被提交。
当文件已经被 Git 跟踪,并且 工作区和 Git 仓库 中的 该文件内容保持一致。当我们修改了工作区中 该文件 的内容之后,通过 检查文件状态 ,会看到如下的内容:
工作区中 当文件处于 已跟踪 并 被修改,通过 git add 指定文件名
把该文件 放到 暂存区 中
当 文件被修改过并处于暂存区中,处于 Staged
状态时,再次通过命令 git commit -m "提交消息"
将暂存区中记录的 该文件 的快照,提交到 Git 仓库中进行保存
撤销对文件的修改指的是:把对工作区中对应文件的修改,还原成 Git 仓库中所保存的版本,比如
撤销操作的本质:用 Git 仓库中保存的文件,覆盖工作区中指定的文件。
操作的结果:所有的修改会丢失,且无法恢复!危险性比较高,请慎重操作!
如果需要被暂存的文件个数比较多,可以使用git add .
,一次性将所有的新增和修改过的文件加入暂存区,比如:
如果需要从暂存区中移除对应的文件,可以使用如下的命令:
git reset HEAD 要移除的文件名称
:移除 暂存区中 的指定文件git reset HEAD .
:移除 暂存区中 的所有文件比如:
Git 标准的工作流程是 工作区 → 暂存区 → Git 仓库,但有时候这么做略显繁琐,此时可以跳过暂存区,直接将工作区中的修改提交到 Git 仓库,这时候 Git 工作的流程简化为了 工作区 → Git 仓库。
通过 git commit -a
,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,比如:
从 Git 仓库中移除文件的方式有两种:
git rm -f 指定文件名
: 从 Git 仓库和工作区中同时移除对应的文件git rm --cached 指定文件名
: 只从 Git 仓库中移除指定的文件,但保留工作区中对应的文件比如:
总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 在这种情况下,可以创建一个名为 .gitignore
的 配置文件,列出要忽略的文件的匹配模式。
文件 .gitignore 的格式规范如下:
#
开头的是注释/
结尾的是目录/
开头防止递归!
开头表示取反所谓的 glob 模式是指简化了的正则表达式:
*
匹配 零个或多个任意字符[abc]
匹配 任何一个列在方括号中的字符 (此案例匹配一个 a 或匹配一个 b 或匹配一个 c)?
只 匹配一个任意字符-
(短划线) 分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)**
表示 匹配任意中间目录(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)# 忽略所有的 .a 文件 *.a # 但跟踪所有的 lib.a ,即便前面已经忽略了所有 .a 文件 !lib.a # 只忽略当前目录下的 TODO 文件,而不是忽略 subdir/TUDO /TUDO # 忽略在任何目录下名为 build 的文件夹 build/ # 忽略 doc/notes.txt , 但不忽略 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录及其子目录下的 .pdf 文件 doc/**/*.pdf
git log
: 输出提交历史信息git log -数字
: 可指定展示的 提交历史信息 的数量git log -数字 --pretty=oneline
:指定提交历史信息 只在一行上展示git log -数字 --pretty=format:"%h | %an | %ar | %s"
: 自定义输出提交历史信息的输出格式%h
: 提交的简写哈希值%an
: 作者的名字%ar
: 作者修订日期,按多久以前的方式显示%s
: 提交说明比如:
git reset --hard <CommitID>
: 更具指定的提交 ID 回退到指定版本git reflog --pretty=onlime
: 在旧版本中擦看提交历史信息比如:
分支是为了助于多人协同开发的项目,比如有如下图的使用场景:
在初始化本地 Git 仓库的时候,Git 默认已经帮创建了一个名字叫做master
的分支。通常我们把这个master 分支叫做 主分支。
master 主分支的作用是:用来保存和记录整个项目已完成的功能代码。
因此不建议开发者直接在master分支上修改内容。
由于不能直接在 master 分支上进行功能的开发,所以就有了 功能分支 的概念。
功能分支指的是 专门用来开发新功能的分支 ,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上
在 Git bash中使用命令 git branch
可以查看当前 Git 仓库中所有的分支列表,比如:
注意:分支名字前面的 *
号表示 当前所处的分支。
使用命令git branch 分支名称
,可以 基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一样,如图所示:
比如:
使用命令git checkout 分支名称
,可以切换到指定的分支上进行开发,
比如:
使用命令:
# -b 表示创建一个新分支 # checkout 表示切换到刚才新建的分支上 git checkout -b 分支名称
可以创建指定名称的新分支,并立即切换到新分支上
如图:
比如:
功能分支的代码开发测试完毕之后,可以使用如下的命令,将完成后的代码合并到 master 主分支上:
# 1. 切换到主分支master git checkout master # 2. 在master分支上运行 git merge 命令, 将 功能分支合并到 master分支 git merge login
如图:
注意:假设要把 C 分支的代码合并到 A 分支,则必须先切换到 A 分支上,再运行 git merge 命令,来合并 C 分支!
比如:
当把功能分支的代码合并到 master 主分支上以后,就可以使用如下的命令,删除对应的功能分支:
git branch -d 分支名称
如图:
比如:
注意:
在没有合并分支的情况下删除分支Git会作出提示,可用命令git branch -D 分支名称
强制删除分支。
如果在 两个不同的分支中 ,对 同一个文件 进行了 不同的修改,Git 就没法自动合并它们并报出提示。 此时根据提示,需要手动打开这些包含冲突的文件然后 手动解决冲突。
# 假设:在把 B 分支合并到 A 分支期间,Git Bash 报出冲突提示 git checkout A git merge B # 打开包含冲突的文件,手动解决冲突之后,在执行如下命令 git add . git commit -m "解决了分支合并冲突的问题"
比如:
如果是首次将本地分支推送到远程仓库,需要运行如下的命令:
# -u 表示把本地分支和远程分支进行关联,只首次推送的时候需要带 -u 参数,远程分支名称可省略 git push -u 远程仓库别名 本地分支名称:远程分支名称
注意:首次推送分支需要带 -u
参数,此后可以直接使用 git push
推送代码到远程分支。
比如:
通过命令git remote show 远程仓库名字
,可以查看远程仓库中,所有的分支列表的信息,比如:
跟踪分支指的是:从远程仓库中,把远程分支下载到本地仓库中。需要运行的命令如下:
# 从远程仓库中,把对应的远程分支下载到本地仓库,保持本地分支和远程分支名相同 git checkout 远程分支名称 # 从远程仓库中,把对应的远程分支下载到本地仓库,并把下载的本地分支进行重命名 git checkout -b 本地分支名称 远程仓库名称/远程分支名称
比如:
可以使用命令git push
,从远程仓库,拉取当前分支最新的代码,保持当前分支的代码和远程分支的代码一致,比如:
可以使用如下的命令,删除远程仓库中指定的分支:
# 删除远程仓库中,指定名称的远程分支 git push 远程仓库名字 --delete 远程分支名称
比如: