Git版本管理软件使用心得
# 更新记录
2024.01.26更新: 更新了Git使用SSH连接对应Github的方法
2022.04.02更新 相信新手最抓狂的问题估计就是怎么在GitHub仓库中建新文件以及删除旧的文件,这篇文章就来一探究竟。看之前可以好好看看这张图, 结合文章内容就可以更好的理解git的机制了。
2023.01.29更新:更新了具体的操作案例和整理更完善的git命令大全,大家可以直接翻到最后的案例,结合实操案例,会好理解很多。
# 小介绍
这是一个想混迹Github不可缺少的重要工具,是Github仓库的版本控制工具。不过相信大多数人和我一样,最早接触时估计都给整的够呛,今天就专门介绍些简单的操作,方便大家初上手。
# 难度: 二星
这个工具最开始接触的时候可能不好理解,觉得用不明白,但其实内核极其强大,是一个极其离谱的版本管理工具。缺点就是上手较难,代码化操作时间久了经常忘记,但功能真的很强大,不得不学习,大家可以尝试我分享的实操案例,体验无限版本的代码回退。然后就可以赞叹这夸张的信息保存能力(关键是还不占空间)。
注意
想执行以下所有内容, 必须先把Git配置好, 所有操作都是基于Git的
可能有些小伙伴新入坑还没搞懂,这里再次提醒一下 GitHub是开源代码托管(存放、管理)平台 Git是进行开源软件的版本管理的(用人话说就是专用的文件上传下载工具)
安装教程我贴在这里, 有需要的小伙伴自取 Git - Downloading Package (git-scm.com) (opens new window) Windows系统Git安装教程(详解Git安装过程) - 学为所用 - 博客园 (cnblogs.com) (opens new window)
以下操作将重点介绍两个最常见的用途:
- 情景一: 把网上已经建立且运营中的仓库克隆(下载)至本地
- 情景二: 本地自己创建的项目, 想把文件共享出来供别人学(bai)习(piao),所以需要把本地文件上传上去
# 第一部分:基础操作介绍
场景:克隆Github上的仓库内容并进行基本的文件操作(读、写、修改等)
先讲讲克隆的效果, 执行完git的命令后, 会下载仓库内容至本地,并存放在一个与仓库同名的文件夹内, 并可进行更多操作
提示
如果仓库叫TommyZeng/picgo, 文件夹名字就会叫picgo
建议找一个文件比较多的仓库fork(转存)到自己的GitHub中, 来练习基础的增删查改
# 1. 首先是执行克隆指令
警告
注意仓库链接在这里
git clone + "仓库链接"
# 2. 执行初始化指令, 生成与仓库的通讯链接
注意
这个步骤在已经建好GitHub仓库的情况下并没有必要, 是在GitHub上没有建仓时让用户可直接在本地建仓的一种办法
git init #仓库初始化
2
2
会生成一个.git的隐藏文件,内部有包含与仓库通讯的文件, 要填写相关user信息, 可使用代码
git config --global user.name "xxx" #就是仓库名称斜杠前的id 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
2
2
# 3. 增删查改的方法
通常完成上一步后, 就会下载到相当多的文件夹
删除文件的方法:
大多数文档里的方法是用下面这个代码一个个删除,说实话动的文件多了NM就离谱
git rm "文件名" #删除文件
git rm -r "文件夹名字" #删除文件夹
2
2
# 批量删除/新建文件后同步至仓库
我们主要讲怎么批量删除/新建文件
步骤
第一步: 直接资源管理器(我的电脑)里删掉想要删除的文件, 或直接新建想要的文件
然后在git bash里输入git add .
(注意.与add之间空一格)把改动添加到缓存
然后用git commit -m "clear"
一次性全部删除
"引号里不一定要写clear, 任意字母都可以,但切记不能空着"
这是不是就不用一个个文件commit确认,特省事情
# 推送上传至仓库
提示
文件修改完后,用git push
即可推送本地仓库至远程仓库即可
注意
网上有说第一次推送仓库的时候好像得用这行代码的, 2022/04/02测试了几个仓库,都不用执行这步,可忽略
git push -u origin main #第一次推送main分支时使用-u指令
git push origin main
2
2
做到这一步会不会对这个图理解更深了?
workspace: 本地工作区 staging area: 缓存区/暂存区 local repository: 本地仓库 remote repository: 远程仓库
用一张图来表达就是
# 4.下载仓库内容至本地
警告
下载仓库内容到本地使用代码
git pull origin main # 获取远程分支main并合并到当前分支
注意一定时main分支, GitHub在2020年把主分支从默认的main改成了main
完成后即可按上面的增删步骤管理仓库内容
# 避坑
网上很多帖子会查出各种命令如
git add -A . #这个实测没啥用" ."就可以了
递归删除法(删除全部文件)
git rm xxx # 删除index中的文件
git rm -r * # 递归删除文件(可全删)
git commit -m 'add more files'一次提交所有文件
git status #告知你文件情况
git commit -m 'first commit'
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
这些命令基本都能用, 不过有些杂乱,且让人晕头转向, 不用太在意这些
# 第二部分:Git连接Github
两者通信依赖SSH或者HTTP进行连接,SSH是电脑长期连接拉去数据时最方便的方案,操作流程如下:
# 一、 生成 SSH 密钥
# 1. 打开终端
- 在 Mac 或 Linux 上,你可以直接打开 Terminal 应用程序。
- 在 Windows 上,你可以使用 PowerShell 或者如果安装了 Git,可以使用 Git Bash。
# 2. 运行 SSH 密钥生成命令
在终端中,输入以下命令来生成一个新的 SSH 密钥:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
11ssh-keygen
是用于生成 SSH 密钥的命令。-t rsa
指定密钥类型为 RSA,这是一种常用的密钥算法。-b 4096
指定密钥长度为 4096 位,这比默认的 2048 位更安全。-C
后面跟的是一个注释,通常是你的邮箱地址,用于帮助你识别这个密钥。这个邮箱应该是你的 GitHub 注册邮箱。
# 3. 指定密钥保存位置
- 当运行上述命令后,系统会询问你保存密钥的位置。如果你接受默认位置(通常是
~/.ssh/id_rsa
),直接按回车即可。如果你已经有了一个 SSH 密钥,系统会提示你是否要覆盖它。如果不想覆盖,可以输入一个新的文件名。
# 4. 设置密钥密码
- 接下来,系统会提示你输入一个密码(passphrase)。这是一个可选步骤,但为了增加安全性,建议设置一个密码。
- 这个密码每次使用这个密钥时都会被要求输入,可以防止未经授权的用户使用你的密钥。
- 输入密码后,系统会要求你再次确认。
完成这些步骤后,你的新电脑上就会生成一个新的 SSH 密钥对。接下来,你需要将生成的公钥(.pub
文件)添加到你的 GitHub 账户中,这样 GitHub 就可以识别并信任从你的新电脑发出的 SSH 连接请求了。
在 SSH 密钥生成过程中,当系统提示你输入密钥密码(passphrase)时,你可能注意到在输入时看不到任何反馈(例如星号或点),这是正常的。SSH 密钥生成工具为了安全考虑,不会在终端显示密码字符。即使你看不到输入的内容,你的输入是有效的。以下是这一步骤的详细说明:
# 输入 SSH 密钥密码
输入密码时无可视反馈:
- 当系统提示你输入密码时,即使你在键盘上输入,终端也不会显示任何字符。这是为了防止旁观者看到密码长度或模式。
- 正常输入你的密码即可,即使看不到任何字符变化。
确认密码:
- 输入完密码后,按下回车键。然后,系统会要求你再次输入密码以进行确认。
- 同样,在输入确认密码时,你也不会在终端看到任何可视反馈。
- 再次输入相同的密码,并按回车键。
完成密钥生成:
- 如果两次输入的密码相同,系统就会生成 SSH 密钥,并保存到指定的文件中。
- 你会看到一条消息,确认你的公钥和私钥的保存位置,以及一个随机生成的图案,表示你的密钥的指纹。
# 后续步骤
- 检查密钥:完成密钥生成后,你可以在指定的目录(通常是
~/.ssh
)下找到两个文件:一个是私钥(例如id_rsa
),另一个是公钥(例如id_rsa.pub
)。- 添加公钥到 GitHub:将公钥(
.pub
文件的内容)添加到你的 GitHub 账户中,以便 GitHub 可以识别你的新设备。记住,私钥是非常敏感的,必须保持安全,不要分享或发送给任何人。公钥是可以安全分享的部分,用于在服务如 GitHub 上进行身份验证。
# 二、复制 SSH 公钥
首先,你需要复制你刚生成的 SSH 公钥(.pub
文件)的内容。假设你使用的是默认的文件名和位置,你的公钥文件将是 ~/.ssh/id_rsa.pub
。你可以使用下面的命令来快速复制公钥内容到剪贴板:
在 macOS 或 Linux 上:
cat ~/.ssh/id_rsa.pub | pbcopy
11(如果
pbcopy
不可用,你可以手动打开该文件并复制内容)在 Windows 上使用 Git Bash:
cat ~/.ssh/id_rsa.pub | clip
11
# 三、添加 SSH 公钥到 GitHub
然后,将复制的公钥添加到你的 GitHub 账户:
- 登录到你的 GitHub 账户。
- 打开设置:点击右上角的头像,然后选择“Settings”(设置)。
- 添加 SSH 密钥:
- 在设置页面的侧边栏中,点击“SSH and GPG keys”。
- 点击“New SSH key”或“Add SSH key”按钮。
- 在“Title”字段中,给你的密钥一个容易识别的名称。这个名称是为了帮助你以后记住这个密钥是用在哪台电脑上的。
- 在“Key”字段中,粘贴你之前复制的公钥。
- 点击“Add SSH key”来保存新的密钥。
# 四、 测试 SSH 连接
完成公钥添加后,测试一下是否能够通过 SSH 连接到 GitHub:
- 打开终端或 Git Bash。
- 输入以下命令:
ssh -T git@github.com
11 - 如果是第一次连接 GitHub,可能会看到一个关于服务器身份的警告。输入
yes
继续。 - 如果一切设置正确,你将看到一条欢迎信息,如:“Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.”
这个欢迎信息表示 SSH 设置正确,并且你已经成功地通过 SSH 连接到了 GitHub。
# 五、开始使用 SSH 进行 Git 操作
一旦 SSH 设置完成,你就可以开始使用 SSH 进行 Git 操作了,例如克隆、推送或拉取仓库。使用 SSH URL 而不是 HTTPS URL 来克隆或操作你的仓库。
例如,克隆仓库的命令将类似于:
git clone git@github.com:username/repo.git
这些步骤确保了你可以安全地通过 SSH 与你的 GitHub 仓库交互。
# 常见问题解决
# 无法连接服务的解决方法
这部分如果是长期连接会用到SSH,这里有个坑是git的代理设置不对导致没有走上网的端口导致连不上,对应的报错代码如下:
Failed to connect to github.com port 443 after 21111 ms: Couldn't connect to server
如出现类似问题,可以试着用以下的代码,大概率可以解决。
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
2
2
# 实战操作案例——Git分支推送历史功能
更新出现异常解决办法
因为很喜欢给博客添加新功能,但又很容易出现不明bug,应该充分利用Git的定档备份功能,出现问题后及时回滚
显示分支提交命令,会显示出提交历史,和提交代码
git log #退出按Q即可
研究git checkout
和git reset
的区别,以及两者在操作上的区别
# 实战操作方法
# 情况一:修改提交了commit且push
方法一:
git reset --hard HEAD^ #一个^代表一个版本,倒退^^两个版本,~100=回退100个版本
git reset --hard id #回退到指定的id码
2
2
这个方法不推荐,因为会直接覆盖掉回退前的记录。(虽然不是真的删了)
1 --> 2 –> 3 直接变成 1 –> 2
这个时候再PUSH会提示线上版本比线下版本新,所以的强制提交
git push -f #强制提交
方法二:
git revert commit_id #用log里的版本号完全替代掉commit_id这几个字符
该命令意思是撤销,但保留提交记录
1 --> 2 –> 3 变成 1 –> 2 --> 3 –>4 将回退到2但以2作为主体新建新的
4
号commit注意: 操作中commit_id应写需要被移除的版本号,而上面reset则是输入要去到的版本号
输入完成后会进入和git commit --amend
一样的界面,用I
进入输入模式,在revert “”
的冒号里输入更新的名称,输入:wq
回车退出。
revert命令可以直接push,不需要担心push不上去,因为是新建的commit,不会出现线上版本比线下版本好的报错。
# 情况二:修改并提交了,但没有push
git reset --soft #撤销commit
11git reset --mixed 撤销commit和add两个动作
11
以上两个办法都不会真正删除文件,Git中依旧可以查找出并还原,方便在各个版本间穿梭
查看完整提交历史
git reflog
# 0924分支推送记录
当天由于更新出了bug,需要回滚到之前的版本,出现了很多问题,最核心的问题是
回滚后无法提交git push。
回退版本的reset和revert指令都不好用
git commit --amend指令很难用(其实是看错了操作方法)
# Git操作收获——commit --amend
git commit --amend #修改提交信息(用于修改最近一次提交的提交信息)
该模式下默认会显示很多行带注释的操作说明,按键盘I
健即可进入编辑模式,键盘上下键确定输入位置
进入编辑模式:
小写i:在光标所在行位置停止不动开始写入内容
大写I:在光标所在行行首开始写入内容
小写a:在光标所在行当前字符后开始写入内容
大写A:在光标所在行行尾开始写入内容
小写o:在光标所在行下一行开始写入内容
大写O:在光标所在行上一行开始写入内容
退出编辑模式:
:w
:保存文本
:q
:退出编辑模式
:w!
:强制保存,在root用户下即使文本只读也可以强制保存
:q!
:强制退出,所有改动不生效
:wq
:保存并退出
以上操作一定要记住,
:
号也是命令的一部分,退不出来是因为把冒号忘记了
操作参考git commit --amend 以及退出 vim 编辑器_vmespmvk的博客-CSDN博客 (opens new window)
# 0925分之推送报错——commit未出分支上,需要把commit重回分支
今天继续更新了一些网站样式,但由于中途好奇,用git checkout
到了昨天上传出bug的那个版本,然后又checkout回去继续修改。一切修改完成后,commit成功,但push时报错如下
TommyZeng@TommyLaptop MINGW64 /c/Tommy/DevProjectLocal/Blog-Vuepress (master|REBASE 2/3)
$ git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use
git push origin HEAD:<name-of-remote-branch>
2
3
4
5
6
7
2
3
4
5
6
7
究其原因,根据可查资料,显示当你在进行checkout
时提供了一个commit
而不是分支名称,你就进入了一种“特殊”的状态里 —— detached HEAD
。
可能发生的问题:
Git中的HEAD
指针能确定您当前的工作版本(以及放置在项目工作目录中的文件)。通常,当检出正确的分支名称时,Git会在您创建新提交时自动移动HEAD
指针。您将自动进入所选分支的最新提交。
当您选择通过commit
哈希值进行checkout
时,Git将不会为您执行此操作。结果是,当您进行更改并提交它们时,这些更改将不属于任何分支。
# 解决方法
问题分析:出现该错误的原因是因为checkout导致的HEAD指向了非master的仓库,导致push异常。
可以先讲目前更改的commit放入一个临时分支里,然后切换至master分支,再使用命令和临时分支合并(merge)
先查看下目前的commit列表
43c3519 (HEAD) HEAD@{0}: commit: 新版字体优化合并分支 #新建一个临时分支
ffa0c06 (HEAD) HEAD@{0}: commit: 新版界面字体优化——大改
b1432cb (master) HEAD@{1}: checkout: moving from b82a384012a1a07d083ed8afa0139bb87f98a2e1 to b1432cb
b82a384 HEAD@{2}: checkout: moving from master to b82a384
b1432cb (master) HEAD@{3}: commit: 更新了新翻译的部分
95021cc (origin/master, origin/HEAD) HEAD@{4}: commit: 女王文章翻译更新
2
3
4
5
6
2
3
4
5
6
**步骤一:**选取需要的分支名称43c3519,为其简历temp分支
git branch temp 43c3519
**步骤二:**切换至master主分支上(此时发现前面commit的更改都消失了)
git checkout master
**步骤三:**将temp的分之内容merge合并到master,master就出现了新改动的代码
git merge temp
完成以上步骤后即可正常推送,恢复正常
记得完成后删除temp分支,防止出现奇怪问题,删除方法
git branch -d temp
11
# 0926分支回退并重新push操作调研
前提:在完成开发后,发现出现不明bug,想回退到初始版本,并push到github,看看是不是玄学bug。
这里面的核心问题是,github-action自动部署与本地部署的效果不一致,一个叫banner-arrow的动态箭头元素竟然无法渲染出正确的位置和动画(action的版本)。
重命名分支操作
git branch -m master old-master #把master改名为old-master
强制推送至某分支
git push origin develop:master -f #强制将develop分支推送至master分支
但是还是无法改变原有的master分支,最后还是reset解决的
- 先切换至master分支
git reset --hard 要与master合并的分支
11
提示
最后研究了一圈发现,可能还是reset最好用,虽然会破坏记录,但是reflog
记录并不会消失
# 常用Git代码分享
图稍微有一点模糊,不过不影响,该图忘记是哪位大佬做的了,非常全面,有需要的可以自行下载