不知道大家是否有过相同的经历,总之在毕业之前我都是这样管理自己的文档的(图1
),尤其是写毕业论文期间,文档一度累积到V30
,虽然到后面前29个版本几乎没用上😂,只是求个心里安慰而已。不过,有人说我这种还是好的,他以前的管理方式是这样的(图2
),这分明是在挑战我国汉字的博大精深啊😄!
工作后接触到Git
这个东西,真香!原因有二:(1)Git只管理修改的内容,而不是上述那种一股脑复制一份的思路,所以即使版本再多,整体的体量也不会太大;(2)记录每次的修改后版本,并且可以查看修改说明(图3
),这个很重要,图1
中V1\V2这种形式,其实你根本不知道那个版本是你想要的。所以本期就是关于Git
的学习内容,花了大概一个月左右断断续续整理出来的,希望能帮助大家从入门到放弃。
图1
图2
图3
00 概念
简化的整体流程
untracked files present
Changes to be committed
working tree clean
add是将工作区(可见)内容的修改添加到git版本库(暂存区)中(也就是所谓的对文件进行跟踪track),而commit是一次性将所有暂存区的文件修改提交到master分支中,提交之后,若对工作区不作任何修改,则git status 提示:nothing to commit, working tree clean工作区很干净
01 基本命令
未安装软件的可以先跳转至[02 安装及远程测试阶段](#02 安装及远程测试阶段)
代码 | 说明 |
---|---|
ls #llist | 查看当前目录下的内容 |
cd #change directory | 更改运行目录(文件名不区分大小写)cd image即到下一级目录 ; cd … 即返回上一级目录 |
pwd #print working directory | 输出git-bash运行的绝对路径 |
mkdir #make directory | 创建目录(文件夹) |
touch | 创建文件 |
rm #remove | 删除文件 |
clear | 清屏 |
history | 查询命令输入历史(clear不会清除历史) |
exit | 退出 git-bash |
02 安装及远程测试阶段
Git Download 提供安装版和便携版(免安装),开始时我为了节省C盘空间选择了免安装版,但后续实际使用过程中发现免安装版的Git-Bash无法更改启动时的默认目录,每次都需要无数次的
cd
来切换目录,所以后面又换回了安装版,这里我推荐大家下载安装包版。
-
安装完Git之后,需要进行配置(用户名和邮箱),以便对你的操作进行标识;
-
进行远程协同时,还需要配置密钥,这样你每次推送远程仓库时就不需要输入账号密码了,服务器通过密钥就能验证你的身份;
代码 | 说明 |
---|---|
git config -l | 查看本机配置 |
git config --global user.name “caobingyong” | 设置本机用户名称 |
git config --global user.email “caobingyong.tjad.cn” | 设置本机用户邮箱 |
ssh-keygen -t rsa -C “caobingyong@tjad.cn” | 生成SSH公钥(每个机器对应一个公钥) |
ssh -T git@gitee.com #@github.com | 测试电脑与服务器的连接(出现success表示连接成功) |
图. 将本地生成的公开密钥在Gitee中备案
小插曲:现在很多公司都有自己的云桌面(尤其疫情期间),公司的云桌面一直在提示尽量不要在C盘存东西,因为有被清理的风险,而Git的密钥又是默认存在
C:\Users\yourUserName\.ssh
路径下的,为了避免密钥丢失的情况,大家提前在云桌面的个人盘中备份密钥文件夹,此外我还做了一个cmd批处理程序(网盘下载地址,提取码:YHQN
),方便能快速恢复密钥。
03 Git本地仓库管理操作
代码 | 说明 |
---|---|
git init | 在本地创建全新的仓库 |
git log | 查看提交历史,输入”q“退出 git log --pretty=oneline |
git clone [url] # https://gitee.com/kuangstudy/openclass.git | 克隆远程仓库 |
git status | 时刻掌握仓库当前的状态 |
git diff | 康康具体修改的内容 |
git restore | 撤销工作区的修改(未加入暂存区)老版本为 Checkout |
git restore –staged | 撤回暂存区的修改(对于已经加入暂存区的文件,需要先撤回,才能git restore 来还原文件) |
git add | 将当前文件添加到暂存区,git add .添加所有更改到暂存区 |
git commit -m “描述文字”(将其理解为文件的快照) | 提交到本地仓库,-m参数即添加提交说明 |
git reset --hard HEAD^ | 回退到上一个提交的版本(HEAD表示当前,HEAD^表示上一个版本,HEAD^^表示上上一个版本) |
git reset --hard (框内为 commit ID,输入部分即可) | 向前撤回?后悔药 找到提交号就能恢复(git reflog记住你每一次命令,通过这个找 commit ID) |
git tag | 查看已有标签 |
git tag -a v1.2 -m “my version 1.2” | 为指定commit ID打标签(无框内信息时,则为当前最新提交打上标签) |
git show v1.2 | 显示标签信息 |
git push origin | 默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上(具有多个标签时:git push <remote> --tags ) |
git tag -d | 删除本地标签(删除远程仓库标签:git push origin --delete ) |
版本回退的底层逻辑:HEAD指针调节
04 Git远程仓库操作
本地Git仓库和远程仓库之间的传输是需要SSH密钥来确认身份的,所以在进行任何远程操作之前,用户应确保自己已经完成[02 安装及测试阶段](# 02 安装及测试阶段)中的远程连接
代码 | 说明 |
---|---|
git remote add origin [项目的SSH] | 本地仓库与远程仓库关联(origin为远程仓库的别名,不建议更改,可通过git remote -v查询) |
git remote set-url origin git@gitee.com:/.git | 远程仓库改名后,地址更改导致无法push,更改关联的方式 |
git fetch origin master | 将远程仓库的更新取回本地(与git pull 的区别) |
git pull --rebase origin master | 从远程master分支拉取代码与本地仓库合并,保证本地文件为绿色 |
git push -u origin master | 推送到远程master分支( -u 可以关联本地与远程的master分支,后续直接git push origin master即可) |
git push -f | 以本地为准,强制推送(慎用) |
冲突问题
两个用户对同一个文件进行了修改,在Pull时必然产生冲突。
-
通过
git status
可以查看冲突情况 -
Pull之后的文件保存了冲突双方的内容,用必须解决冲突,再次提交。
<<<<<<<HEAD 我的内容 ==== 他的内容 >>>>>>>commit ID
05 分支
分支的意义:功能 开发/更新 周期较长,然而同步不完整的代码又会影响别人的开发工作,导致 现有程序失效,同时又想随时在远程同步自己的进度,避免本地文件损坏带来的风险。
分支仅自己可见,不影响别人工作
默认状态HEAD指向master
新建分支,并切换到该分支
在新建分支中更改并提交(此时master分支不变)
融合分支
删除新建分支
代码 | 说明 |
---|---|
git branch | 列出所有分支,当前分支前面会标一个* 号 |
git branch | 创建分支 |
git switch | 切换分支 |
git switch -c | 创建并切换到该分支 |
git merge | 合并指定分支到当前分支 |
git branch -d | 删除分支 |
git log --graph | 查询分支合并图 |
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活都在自己的分支上,dev
则作为测试分支,待新功能测试时,所有相关的开发者将代码都合并到dev
分支来,测试无误后,再把dev
分支合并到master
上。
团队协作模式
开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
当master代码改动了,需要更新开发分支(dev)上的代码
git checkout master
git pull
git checkout dev
git merge master
git push -u origin dev