1.Git基本概念——工作区域和状态
1.1.工作区域
Git仓库:用来保存项目的元数据和对象数据库的地方,克隆仓库指的就是克隆这里的数据。
工作目录(工作区):是对项目的某个版本独立提取出来的内容,可以在这基础上进行文件的修改。
暂存区域(暂存区):一个保存了下次将提交的文件列表信息的文件。
1.2.状态
已提交(committed):表示数据已经安全的 保存在本地仓库中。
已修改(modified):表示修改了文件,但还没保存到本地仓库中。
已暂存(staged):表示对一个已修改文件的当前 版本做了标记,使之包含在下次提交的快照中。
2.Git工作流程
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
3.Git基础命令
3.1 初始设置
git config --global user.name aaabbbccc # 配置用户名
git config --global user.email aaabbbccc@qq.com # 配置邮箱
通过 git config 设置一个用户名和邮箱,并且通过 ==git config --list== 查看相关初始配置信息, 这个信息主要用来告诉Git当前的操作者是谁。
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/git/Git/mingw32/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
pack.packsizelimit=2g
credential.helper=manager
user.name=aaabbbccc
user.email=aaabbbccc@qq.com
设置成功后就能在配置中看到设置后的用户名及邮箱。
3.2 初始化本地仓库
git init
- 通过命令 git init将一个目录变成git可以管理的仓库,这时候你当前目录下会多了一个.git的目录。这个目录是Git来跟踪管理版本的,不要乱改这个目录里面的文件,否则,会把git仓库破坏。
3.3 查看git仓库当前状态
git status
- 通过该命令,可以查看当前目录下,文件处于什么状态。
- 处于工作区未被追踪(untracked)
- 位于暂存区等待提交至仓库(changes to be commited)
- 在工作区中修改了但没有提交至暂存区(modified)
- 已经提交至本地仓库中(commited)
3.4 将文件从工作区提交至暂存区
git add . # 将所有文件添加到暂存区
git add 具体文件名 # 添加具体文件到暂存区
git add命令是从工作区添加文件到暂存区中,等待上传或保存。
3.5 将文件从暂存区提交至仓库
git commit -m ''
- 通过commit命令将暂存区的文件提交保存至仓库中。-m参数代表添加注释,""引号内添加注释内容
- 如果没有设置git用户名及邮箱,在commit时会提示(please tell me who you are),出现此提示代表还有没有配置初始用户名等设置。
3.6 查看git日志
git log
使用git log 命令查看所有提交至仓库的操作。
日常操作步骤
日常操作步骤为:
- [ ] - git init 初始化仓库
- [ ] - git add . 将文件添加至缓存区
- [ ] - git commit -m 将文件上传至仓库
4.撤销操作
4.1 将工作区中文件的改动撤销(适用于工作区修改,未提交至暂存区)
- 可以先通过git status命令查看工作区中有哪些文件进行了修改但还没有提交至暂存区的(即状态为modified)。
git checkout --具体文件名 # 还原某个修改过的具体文件
git checkout . # 还原所有修改过的文件
通过git checkout 命令将在工作区中修改但还没有提交至暂存区的文件撤销至未修改前的状态。
4.2 将暂存区中文件的改动撤销(适用于已提交至暂存区)
- 当文件改动已提交至暂存区后就不能再使用git checkout 命令来撤销改动,此时要通过 git reset命令撤销位于暂存区中的改动。
- 可以先通过git status命令查看处于暂存区中的文件(即状态为changes to be commited)。
git reset . # 还原所有已提交至暂存区的文件至工作区
git reset HEAD 具体文件名 # 还原某个已提交至暂存区的具体文件至工作区
当文件从暂存区还原至工作区后,再使用 git checkout 命令将工作区中的改动撤销。
4.3 撤销上一次提交至仓库中的操作,并将暂存区的文件重新提交至仓库
git commit --amend
- 当希望对上一次提交至仓库中的文件进行修改而不产生新的版本时,使用 git commit --amend命令。使用此命令时首先将希望修改的文件内容提交至暂存区中再使用此命令,即可覆盖最新的版本而不产生新的版本。
5.删除操作
5.1 手动删除文件
- 当文件进行手动删除后,使用命令 git status 可查询到删除的文件。在下面的例子中,我们首先在工作目录下手动删除了aaa.html文件。
上面代码可以看出,文件的改动是未提交至暂存区及仓库的,手动删除文件后需要执行commit操作将改动提交至仓库。
5.2 使用 rm 命令在git中删除文件
git rm 文件名
- 直接使用 git rm 命令将指定文件删除,会删除暂存区中的该文件,同时工作目录中的该文件也将被删除
使用 git status 查看状态,可以看到该删除文件处于暂存区中,使用git commit将改动保存到本地仓库中,也可以使用 git reset 命令将改动撤销至工作区,再使用git checkout将改动撤回。
git rm --cached 文件名
- 在 rm 命令后加上 --cached 参数,只会将文件删除提交至暂存区,并等待提交至本地仓库。
当加上 --cached 参数后,会产生上图所示的结果,git会认为是删除了一个名为aaa.xlsl的文件,并提交至暂存区中,并且新创建了一个名为aaa.xlsx的文件处于未追踪状态。
6.git分支
6.1 查看当前所有分支
- 使用 git branch 命令查看当前所有分支
git branch
6.2 创建新分支
- 使用 git branch dev 命令创建一个名为dev的分支
git branch 分支名
6.3 切换分支名
- 使用 git checkout dev 命令切换至dev分支
git checkout 分支名
- [x] !注意checkout命令用于 ++切换分支++ 及 ++撤销操作++ 的区别。
6.4 删除分支
- 使用 git branch -d dev 命令删除dev分支
git branch -d 分支名
- 如果当前处于 dev 分支,想要删除dev分支就会失败并报错,必须切换到其他分支才能删除dev分支。
7.代码合并
7.1 存在冲突时的合并
- 在master分支上创建一个 git_test.html 文件, 并提交保存至仓库中。
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>这是master分支啊</p>
</body>
</html>
- 创建一个dev分支并切换到 dev 分支,在dev分支同样创建一个 git_test.html,并提交保存至仓库中。
<!--git_test.html on dev-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>这是dev分支啊</p>
</body>
</html>
3.切换回 master 分支,使用 git merge 命令将 dev 分支上的代码合并至 master 分支。
提示两个分支中有同名文件 git_test.html 存在冲突,自动合并失败,需要手动合并冲突后再提交。
-
打开 git_test.html 文件后,文件变成下面的样子:
合并的同名文件存在差异时,git会将文件分为三个部分:
1. 从 HEAD 到 ======
2. 从 ====== 到 >>>>>>>
3. 在 >>>>>>> merge code 后的部分
前两部分为合并时同名文件的差异部分,在>>>>>>> merge code后的部分为两个文件相同的部分。
只需要将代码中不相同的那两部分进行统一,合并成一个结果即可。
- 将差异处理并保存后,重新进行提交,完成合并。
7.2 不存在冲突时的合并(快进式合并)
- 在master分支上创建一个 git_test.html 文件, 并提交保存至仓库中。
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>这是master分支啊</p>
</body>
</html>
- 创建一个 fix 分支并切换到 fix 分支,在 fix 分支同样创建一个 git_test.html,并提交保存至仓库中。
<!--git_test.html on fix-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>这是dev分支啊</p>
<p>这是添加的内容</p>
</body>
</html>
- 切换回 master 分支,使用 git merge 命令将 fix 分支上的代码合并至 master 分支。此时代码没有冲突,将直接合并成功,合并后代码显示为:
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>这是dev分支啊</p>
<p>这是添加的内容</p>
</body>
</html>
8.差异比较
8.1 工作区与暂存区的差异比较
- 使用 git diff 命令比较工作区与暂存区之间的差异。
git diff
8.2 暂存区与版本库的差异比较
- 使用 git diff --cached 命令比较暂存区与版本库之间的差异。
git diff --cached
8.3 不同版本之间的比较
- 使用 git diff [版本1-id] [版本2-id] 比较两个版本之间的差异。(通过git log --oneline查看相应的版本id)
# 比较版本622e836与895af11之间的差异
git diff 622e836 895af11
8.4 不同分支之间的比较
- 使用 git diff [分支名] 比较两个分支间的差异。假如当前处于master分支下:
git diff dev
上述命令将比较master分支与dev分支之间的差异。
8.5 工作区与版本库之间的比较
- 使用 git diff HEAD 比较工作区与版本库之间的差异。
git diff HEAD
上述命令将比较master分支与dev分支之间的差异。
9.git help文档
9.1 当对某个命令不熟悉时,可以使用 git help 命令后接不熟悉的命令名称,查看该命令的使用方法。比如对 log 命令不熟:
git help log # 查看log命令的使用方法