1 Git简介
Git 是一个开源的分布式版本控制系统。
什么叫版本控制?比如你接了一个项目,码完初版拿给甲方,然后甲方对你指指点点,所以你把初版存了副本开始撰写第二版,写完又被指指点点,直到无穷版甲方告诉你还是初版好,更可怕的是那个什么加了什么什么删了什么什么的那一版好,然而你早就忘了哪次改了什么,不仅寻找某个特定版本困难,也占用了大量的存储空间。
Git就很优雅的解决了这一问题,每次提交可以备注信息,可以对比内容查看每次的增删改补,想退回哪一次的提交版本轻而易举。
2 Git下载与安装
2.1 下载
2.2 安装
除了第四步选择一下编辑器,其他全部默认,疯狂点击Next
-
下载完成后启动
-
next
-
无需修改,next
-
选择所需编辑器,next
-
next
-
next
-
next
-
next
-
next
-
next
-
next
-
next
-
next
-
install
3 Git配置
Git Bash下输入命令,借助git config命令进行配置。
Bash(Bourne Again shell)是linux系统下的shell,相当于windows的Command shell 和 powershell。
3.1 用户名和邮箱
输入以下命令:
$ git config --global user.name "your name"
$ git config --global user.email "your email"
没有报错即为配置成功。
此时打开用户配置文件.gitconfig会发现用户名、邮箱和安装时选择的编辑器已经写入文本。如下:
用户配置文件目录:
C:\Users\“your name”\.gitconfig
系统配置文件目录:
D:\Git\etc\gitconfig
$ git config --global --list #查看用户配置
$ git config --system --list #查看系统配置
3.2 环境变量
环境变量安装完成后已经自动配置,也可以自行将“D:\Git\cmd”添加进环境变量。
4 Git使用
4.1 Git原理
各个区域及其命令:
文件的四种状态:
4.2 本地仓库部分
4.2.1 创建工作目录
所需命令:
cd
#change directory 切换目录
mkdir
#make directory 创建目录
touch <filename>
#Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。
若文件不存在,系统会建立一个新的文件。
ls
#显示指定工作目录下之内容
- 在F/Gittest目录下创建一个名为Gittest1的工作区,输入如下命令:
$ cd /F/Gittest
#切换至 Gittest目录下
$ mkdir Gittest1
#在 Gittest目录下创建一个名为 Gittest1的工作区
$ cd Gittest1
#切换至工作区目录
此时我们创建了一个名为"Gittest1"的目录作为工作区。
- 在工作目录中建立两个文件gittest1.md、gittest2.md,
$ touch gittest1.md
$ touch gittest2.md
- 查询工作目录下内容:
$ ls
gittest1.md gittest2.md
4.2.2 工作目录下创建Git 仓库
所需命令:
git init
#初始化Git仓库
工作目录下使用命令:
$ git init
Initialized empty Git repository in F:/Gittest/Gittest1/.git/
可以看到工作目录下生成了一个名为" .git "的目录(该目录默认隐藏),它是Git进行版本控制的,无需在这个目录下手动进行任何操作。
4.2.3 工作区文件添加到暂存区
4.2.3.1 添加至暂存区
所需命令:
git add <filename>
#上传工作区目录下单个文档
git add .
#上传工作区目录下所有文档
输入命令添加两个文件到索引区:
$ git add gittest1.md
$ git add gittest2.md
4.2.3.2 相关查询
所需命令:
part1:
git ls-files
#查看添加进暂存区的文件
默认执行的是git ls-files --cached(简写-c)
part2:
git status
#查看文件状态
git status <filename>
#针对一个文件
git status -s
#简短输出
part3:
cat <filename>
#查看文件具体内容
查看添加进暂存区的文件
$ git ls-files
gittest1.md
gittest2.md
查看文件状态
$ git status gittest1.md
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: gittest1.md
如果此时将工作区中的文件修改,再次查询状态
$ git status gittest1.md
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: gittest1.md
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gittest1.md
可见告知文件已经修改。
4.2.3.3 移出
所需命令:
git checkout <filename>
#最新添加进暂存区的文件替换覆盖掉工作区现有的对应文件,工作区的新文件不会被删除。
git checkout .
#全部替换
比如我们已经将"gittest2.md"添加进暂存区,我在工作区中又进行了修改,但改错了,需要恢复到添加进暂存区的那一份。如下:
$ git checkout gittest2.md
Updated 1 path from the index
4.2.4 暂存区文件提交本地仓库
4.2.4.1 提交至Git仓库
所需命令:
git commit -m <备注信息>
#提交本地仓库
$ git commit -m "第一次提交本地仓库"
[master (root-commit) d32fb05] 第一次提交本地仓库
2 files changed, 4 insertions(+)
create mode 100644 gittest1.md
create mode 100644 gittest2.md
4.2.4.2 相关查询
所需命令:
part1:
git log
#查看提交记录,如果提交记录过多无法完全显示,敲击 回车继续查看
git log -p -number
#查看number次提交记录并展示修改内容
git log --pretty=oneline
#精简显示
q
#退出git log
part2:
git reflog
#由于HEAD指针回退,会导致有的commit记录在git log命令中无法看到,使用该命令可以看到所有commit记录。
$ git log
commit d32fb05d09de84068e1fe0d3203de9af99c3820b (HEAD -> master)
Author: *** <***@*.com>
Date: Mon Mar 21 17:06:31 2022 +0800
第一次提交本地仓库
其中,输出第一行的编码 “d32fb05…” 称作commit id,版本回退的时候我们以commit id作为每个提交版本的索引标识(只需前七位即可锁定版本);当然,也可以直接要求回退到上几次提交的版本。
4.2.4.3 修正与移出
所需命令:
part1:
git commit --amend
#重新添加暂存区后,输入此命令提交,覆盖上一次提交
part2:
git reset <filename>
#将文件从本地仓库移动到暂存区
git commit --amend
很适用于提交之后发现一些小错误,这次提交不值得占用一个版本,修改小错误后添加暂存区,使用这个命令提交便可以覆盖掉未修改前提交。
$ git reset gittest2.md
$ git status gittest2.md
On branch master
nothing to commit, working tree clean
4.2.4.4 版本回退
所需命令:
git reset --hard HEAD~n
# HEAD指针指向上n个版本,即回退到上n个版本
git reset --hard <commit id>
# HEAD指针指向commit id对应的版本,即到达commit id对应的版本
4.3 远程仓库部分
4.3.1 生成SSH公钥
本地Git仓库和远程仓库之间的连接是通过SSH加密,所以需要添加SSH公钥。步骤如下:
- 在C:/User/<YourName>目录下开启Git Bash,输入以下命令:
$ ssh-keygen -t rsa -C <Email>
#其中 rsa为加密方式
#"Email"只是SSH Key的名称,起到标识作用,不加-C "Emial"亦可
然后连续四次回车,生成SSH公钥,如下所示:
- 此时C:/user/ “UserName"目录下生成一个”.ssh"文件夹
内部含有两个文件,后缀pub(public)为公钥,rsa为私钥。将公钥放置到Github账户,与本地私钥匹配,即可通过Git将本地文件上传文件至Github。
可以使用以下命令查看公钥内容,复制后待用:
$ cat C:/user/ "UserName"/.ssh/id_rsa.pub
- 注册登录GitHub或Gitee
(1)个人设置 >> 安全设置 >> SSH公钥
GIthub同理
(2)将公钥文档 “id_rsa.pub” 的内容粘贴到"公钥"位置,"标题"可任意输入
点击确定,验证密码(Github/Gitee的密码)后即成功添加。
4.3.2 建立远程仓库
-
右上角加号 >> 新建仓库
Gitee:
Github:
-
输入信息,点击创建
输入以下命令可以检验是否成功:
$ ssh -T git@github.com
如有如下报错,注意输出的提示内容,先输入yes再回车,不要直接回车
4.3.3 本地仓库与远程仓库连接
-
克隆/下载 >> SSH >> 复制
-
(1) 连接远程仓库:
所需命令:
git remote add "远程仓库命名" "URL"
$ git remote add origin "上一步复制的SSH链接"
# origin是 Git对远程仓库的默认命名,若希望关联多个远程仓库需要用不同命名进行区分。
(2) 查看远程库信息:
所需命令:
git remote -v
#查看所有远程仓库,-v即–verbose
可以看到已经连接成功。
- 与远程仓库解除关联:
所需命令:
git remote rm <远程仓库名称>
#与远程仓库解除关联,rm即remove
git remote rename "old_name" "new_name"
#修改远程仓库名
$ git remote rm origin
4.3.4 本地推送文件至远程
所需命令:
git push -u origin master
#本地推送至远程仓库origin的主分支master
#注意:2020年10月起Github已将主分支名称从master变更为main
直接推送可能会出现如下错误:
因为远程仓库内含有 “README.md” 等文件,但本地仓库不存在,需要本地和远程的文件合并后才能推送本地新文件。
所以先将两个仓库内容合并,当本地也出现远程仓库的文件再进行推送,命令如下:
$ git pull --rebase origin master
$ git push -u origin master
也可使用 -f (–force) 强制推送,但可能导致远程新文件被覆盖,慎用,命令如下:
$ git push -u origin master -f
若希望删除远程仓库文件:文件右键 >> 删除
4.3.5 从远程克隆项目到本地
工作区可以自己建立,也可以直接从远程仓库克隆一个项目。
所需命令:
git clone "URL"
#克隆一个远程仓库项目到本地
$ git clone git@gitee.com:panplcode/gittest.git
Cloning into 'gittest'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (13/13), done.
查询发现,除了我们新建的Gittest1工作区,远程仓库的gittest被拉取到本地作为工作区。
$ ls
Gittest1/ gittest/
4.4 分支
分支(branch)的作用是从开发主线上分离,让你的分身(分支)去学习一个东西,学完后可以合并到本体(主分支master)。
4.4.1 创建与切换分支
所需命令:
git branch <branchname>
#创建分支git checkout <branchname>
或者git switch <branchname>
#切换分支git checkout -b <branchname>
或者git switch -c <branchname>
#创建并切换分支(相当于1、2两条命令)git branch -d <branchname>
#删除分支
可以看到已经从主分支master切换到分支dev。
4.4.2 分支提交
分支共用工作区与暂存区
4.4.3 合并分支
所需命令:
git merge <branchname>
#合并指定分支到当前分支
4.4.4 多人协同
4.4.5 合并冲突
冲突产生的原因是不同分支间相同文件的相同部分产生了不同的修改,Git不知道到底要留存哪个分支的修改,所以出现合并冲突需要手动取舍。
所需命令:
git log --graph
#查看分支合并图
4.4 图形化界面(GUI)
Sourcetree、TortoiseGit
参考
[1] Git 官方文档
附录
1 github使用技巧
1.1 检索
1.1.1 检索项目
s
聚焦搜索框,搜索限定用法详见
Github官方文档(中文版)
1.1.2 检索项目文件
t
项目内文件搜索框
b
查看文件改动记录
1.2 在线查看与运行
- 直接点击文件查看
- 项目页面按英文状态句号
.
,可跳转网页版VSCode阅读代码; - 网址前加
gitpod.io/#/
前缀,可跳转网页版VSCode运行
2 github相关软件与扩展
3
edge://net-internals/#hsts