1、第一次安装使用
git下载地址:https://git-scm.com/download
1.1 配置用户名、邮箱
这是非常重要的,因为每次Git提交都会使用该用户信息。
设置
在 git bash 输入以下命令。
git config --global user.name ""
git config --global user.email ""
查看信息
git config --global user.name
git config --global user.email
1.2 为常用指令配置别名(可选)
可以简化每次输入过长的命令。
在用户目录中创建 .bashrc
文件
windows 系统下的用户目录位置:C:\Users\用户名
touch ~/.bashrc
使用 alias
命令:给命令取别名
可以在 git bash 使用 vi/vim 编辑器编辑,也可以直接在本地打开编辑。
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息,ll命令本身等同于 ls -l
alias ll='ls -al'
生效
在 windows 系统的家目录中创建的 .bashrc 不像 linux 系统那样,修改后不需要执行 source
命令进行生效,在 windows 系统下需要执行该命令。
source ~/.bashrc
遇到的问题
如果 ~/.bashrc
是第一次创建的话,重新打开 git bash 可能会显示下面的信息,不用理会,它只是在家目录新生成了一个 ~/.bash_porfile
文件。
2、新建本地仓库
在本地选择/创建一个空目录作为本地 Git 仓库
在 git bash 输入
git init
如果创建成功后可在文件夹下看到隐藏的 .git 目录。
3、基础操作指令
Git 工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行 Git 的命令而发生变化。
使用如下命令可以让文件在这三个状态间切换:
- git add (工作区 --> 暂存区)
- git commit (暂存区 --> 本地仓库)
3.1 查看修改的状态(status)
作用:查看的修改的状态(暂存区、工作区)
git status
3.2 添加工作区到暂存区(add)
作用:添加工作区一个或多个文件的修改到暂存区
git add 单个文件名|通配符
3.3 提交暂存区到本地仓库(commit)
作用:提交暂存区内容到本地仓库的当前分支
git commit -m "注释内容"
3.4 查看提交日志(log)
作用:查看提交记录
git log [option]
options
- –all:显示所有分支
- –pretty=oneline:将提交信息显示为一行
- –abbrev-commit:使得输出的 commitId 更简短
- –graph:以图的形式显示
最好的查看效果就是将所有的选项全部选上,也就是前面给命令取别名的 git-log
,即:
git log --pretty=oneline --all --graph --abbrev-commit
3.5 版本回退
作用:版本切换
# commitID 可以使用 git-log 或 git log 指令查看
git reset --hard commitID
# 查看已经删除的提交记录
git reflog
3.6 添加文件至忽略列表(.gitignore文件)
作用:把指定的文件无需纳入 Git 的管理中,也就是在执行 git add
和 git commit
都不会将这些文件放入到暂存区和仓库之中。
在工作目录中创建 .gitignore 文件
列出要忽略的文件模式
# 忽略所有以 .a 结尾的文件
*.a
# 一定要管理 lib.a 文件,即使上面忽略所有以 .a 结尾的文件
!lib.a
# 忽略当前目录下的 TODO 文件,子目录下的 TODO 文件照常管理
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc/ 目录下所有以 .txt 结尾的文件,但子目录下的 .txt 文件照常管理
doc/*.txt
# 忽略 doc/ 目录下的所有 .pdf 文件(包括子目录)
doc/**/*.pdf
3.7 可能遇到的问题
(1)将工作区保存到暂存区(add 命令):
链接
warning: LF will be replaced by CRLF in xxx.
The file will have its original line endings in your working directory
原因:文件中换行符的差别导致的。这个提示的意思是说:会把windows格式(CRLF(也就是回车换行))转换成Unix格式(LF),这些是转换文件格式的警告,不影响使用。git默认支持LF。windows commit 代码时 git 会把 CRLF 转 LF,update 代码时 LF 换 CRLF。
解决方法:
git rm -r --cached .
git config core.autocrlf false
git add .
git commit -m ""
4、分支管理
分支作用:可以把的工作从开发主线上分离开来进行重大的 Bug 修改、开发新的功能,以免影响开发主线。
4.1 查看本地分支
git branch
4.2 创建本地分支
git branch 分支名
4.3 切换分支(checkout)
git checkout 分支名
# 接切换到一个不存在的分支(创建并切换)
git checkout -b 分支名
4.4 合并分支(merge)
一个分支上的提交可以合并到另一个分支
git merge 分支名称
4.5 删除分支(branch -d/D)
不能删除当前分支,只能删除其他分支
# 删除分支时,需要做各种检查
git branch -d b1
# 不做任何检查,强制删除
git branch -D b1
4.6 合并冲突
发生冲突的原因一般是两个分支对同一文件做出了不同的修改,Git 无法判断要如何进行修改,于是就将判断权交给用户,让用户进行修改。
4.7 使用示例
(1)在 master 分支创建了 aaa.txt
空文件,并执行 add 和 commit 命令将其保存到本地仓库中,并将该操作备注为 “创建 aaa.txt 文件”。
(2)新创建一个 child_1 子分支,该子分支的进度与 master 分支一致。
(3)在 child_1 子分支中修改 aaa.txt
内容,并保存到本地仓库中,并将该操作备注为 “修改 aaa.txt 文件”。可以看到 master 分支的进度还处于创建 aaa.txt 文件
阶段,而在 child_1 分支中则多了个修改 aaa.txt 文件
的操作。
(4)提交后转回到 master 分支,证实了(3)所说的,在 child_1 子分支上提交的修改后的 aaa.txt
文件在 master 分支上并未存在,还是处于空白状态。
(5)在 master 分支再次创建一个 child_2 子分支,发现 child_2 分支也继承了 master 分支的进度。
(6)在 child_2 子分支在创建一个 bbb.txt
文件,并进行修改,分别各自执行 add 和 commit 命令将其保存到本地仓库中。
(7)再次返回到 master 分支,创建并修改一个 ccc.txt
文件,保存到本地仓库中。
(8)将 child_1 子分支和 child_2 子分支分别合并到 master 分支当中去。
(9)对比(7)、(8)的三幅图,可以得知最重要的几个结论:
- 红色线:master 主分支没有实现的步骤。
- 绿色线:master 主分支已经实现的步骤。
- * 号:该分支所实现的步骤。
- 缩进:master 主分支没有缩进,子分支在父分支的基础上进行一个缩进(以 * 号为标准)。
5、远程仓库
5.1 添加远程仓库(remote add)
操作之前要先在 github/gitee 创建一个新的仓库。
git remote add <远端名称> <仓库路径>
- 远端名称:默认是 origin,取决于远端服务器设置。
- 仓库路径:从远端服务器获取此 URL。
5.2 配置SSH公钥
# 生成 ssh 公钥,不断回车即可(如果之前生成过的视情况是否需要覆盖原来的公钥)
ssh-keygen -t rsa
# 获取公钥
cat ~/.ssh/id_rsa.pub
Gitee 设置账户公钥
验证是否配置成功
ssh -T git@gitee.com
5.3 查看远程仓库(remote)
git remote
5.4 推送到远程仓库(push)
注:在推送之前要将文件保存到本地仓库中。
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
# 如果远程分支名和本地分支名称相同,则可以只写本地分支
git push origin master
# 该语句的意思是将本地仓库的 master 分支推送到远程仓库的 master 分支,该语句等同于上面那条语句
git push origin master:master
- -f:表示强制覆盖。
- –set-upstream:推送到远端的同时并且建立起和远端分支的关联关系,此时就可以使用
git push
命令直接进行推送了,无需指定分支名。
# 查看本地分支与远程分支的关联关系
git branch -vv
5.5 从远程仓库克隆(clone)
git clone <仓库路径> [本地目录]
- 本地目录可以省略,会自动生成一个目录
5.6 从远程仓库中抓取(fetch)
git fetch [remote name] [branch name]
git merge 分支名称
- 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并。
- 如果不指定远端名称和分支名,则抓取所有分支。
5.7 从远程仓库中拉取(pull)
git pull [remote name] [branch name]
- 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于
fetch + merge
。 - 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
5.8 推送/拉取冲突
在多人协作时,很可能会遇到如下问题:
-
在将 A 文件推送(push)到远程仓库时发现有人已经对 A 文件进行了修改,并且修改的内容与你本地的 A 文件不一致,推送被阻止。
-
你修改 A 文件很长时间了,还没有修改完,但是想看其他人是否有对该文件进行了其他的修改,于是执行了拉取(pull),发现确实是有人对其了修改,拉取被阻止。
那要如何得知其他人所做的修改呢?也就是如何解决该冲突呢?
在前面的命令可以得知,如果在合并分支的时候发现相同文件不一致,会在该文件中标注出来冲突的位置,让用户自行选择需要保留哪个内容。这里也是如此,要使用抓取(fetch) + 合并分支(merge)命令解决该问题。
5.9 可能遇到的问题
(1)推送/抓取时的报错:
链接
原因:本地仓库与远程仓库的内容不一致导致的(远程仓库有一些内容本地没有,或者是相同文件的不同内容)。
解决办法:
如果想要强行提交
git push -f origin master
如果想要强行拉取
git pull origin master --allow-unrelated-histories
(2)每次推送到远程仓库需要输入账户密码:
链接
git: 'credential-manager' is not a git command. See 'git --help'.
解决办法:
git config --global credential.helper store
# 再次进行推送
git push origin master
# 输入账号密码后下次就不用输入了