【手把手带你操作 | 一万字总结】Git操作入门与GitHub 实践(一)

简介: 【手把手带你操作 | 一万字总结】Git操作入门与GitHub 实践(一)

Git 与 GitHub 简介


Git 与 GitHub 历史

Linux 之父 Linus 在 1991 年创建开源的 Linux 操作系统之后,多年来依靠全世界广大热心志愿者的共同建设,经过长足发展,现已成为世界上最大的服务器系统。系统创建之初,代码贡献者将源码文件发送给 Linus,由其手动合并。这种方式维持多年后,代码量已经庞大到人工合并难以为继,于是深恶集中式版本控制系统的 Linus 选择了一个分布式商业版本控制系统 BitKeeper,不过 Linux 社区的建设者们可以免费使用它。BitKeeper 改变了 Linus 对版本控制的认识,同时 Linus 发现 BitKeeper 有一些不足,而且有个关键性的问题使之不能被广泛使用,就是不开源。


在 2005 年,BitKeeper 所在公司发现 Linux 社区有人企图破解它,BitKeeper 决定收回 Linux 社区的免费使用权。Linus 对此事调解数周无果,找遍了当时已知的各种版本控制系统,没有一个看上眼的,一怒之下决定自己搞一个。Linus 花了十天时间用 C 语言写好了一个开源的版本控制系统,就是著名的 Git。


2007 年旧金山三个年轻人觉得 Git 是个好东西,就搞了一个公司名字叫 GitHub,第二年上线了使用 Ruby 编写的同名网站 GitHub,这是一个基于 Git 的免费代码托管网站(有付费服务)。十年间,该网站迅速蹿红,击败了实力雄厚的 Google Code,成为全世界最受欢迎的代码托管网站。2018 年 6 月,GitHub 被财大气粗的 Microsoft 收购。2019 年 1 月 GitHub 宣布用户可以免费创建私有仓库。根据 2018 年 10 月的 GitHub 年度报告显示,目前有 3100 万开发者创建了 9600 万个项目仓库,有 210 万企业入驻。



在 GitHub上创建仓库

首先,打开 GitHub 注册个人账户并登录。登录后,在个人主页的右上角点击 New repository 创建新的仓库:

1.png


打开页面如下图所示,填入相关信息。根据你的需求来

2.png



安装 git

git 下载链接:https://git-scm.com/downloads

3.png


然后按自己需求来就好了


添加 SSH 关联授权

在 2021 年 8 月 GitHub 更新后,已经不再允许使用账户密码操作 GitHub,必须使用 SSH 密钥登陆。所以我们可以在系统中创建 SSH 公私钥,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。


终端执行 ssh-keygen 命令按几次回车生成公私钥,公私钥存放在主目录下的隐藏目录 .ssh 中的两个文件中


4.png


之后如上图最后操作,将公钥复制出来,如下操作进行添加

5.png


创建一个

6.png

Title 自定义,把剪切板中的内容粘贴到 Key 中,点击绿色按钮添加 SSH Key 即可:

7.png

添加成功之后则如下:

8.png

使用 SSH 的好处主要有两点:


  • 免密码推送,执行 git push 时不再需要输入用户名和密码了;
  • 提高数据传输速度。它不是必须的,比如在课程中挑战环境是不可保存的,一次性的,这种环境就没有必要创建 SSH 了,因为相较好处来说,还是太麻烦了。


克隆 GitHub 上的仓库到本地

现在克隆前面我们在 GitHub 上创建的仓库,使用 git clone + [仓库地址] 命令即可,这是标准的克隆仓库命令。


回到仓库主目录,点击Code,点 SSH,然后复制这个链接。


重要的一点:只有使用这种 git 开头的地址克隆仓库,SSH 关联才会起作用。

9.png

准备一个目录,存放你的工程

0.png



前往该目录之后,使用 git 命令拉取


git clone 地址

如图会自动创建一个和你仓库名称一样的目录

10.png


进入仓库主目录,如下图所示,仓库主目录中有个 .git 隐藏目录,它里面包含了仓库的全部信息,删掉这个目录,仓库就变成普通的目录了。进入到仓库目录中,命令行前缀发生了一些变化,出现了红色的 main ,它就是当前所在的分支名:


11.png


当我们在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 main。GitHub 可以看成是免费的 Git 服务器,在 GitHub 上创建仓库,会自动生成一个仓库地址,主机就是指代这个仓库,主机名就等于这个仓库地址。克隆一个 GitHub 仓库(也叫远程仓库)到本地,本地仓库则会自动关联到这个远程仓库,执行


git remote -v

命令可以查看本地仓库所关联的远程仓库信息:

12.png


Git 要求对本地仓库关联的每个远程主机都必须指定一个主机名(默认为 origin),用于本地仓库识别自己关联的主机,git remote 命令就用于管理本地仓库所关联的主机,一个本地仓库可以关联任意多个主机(即远程仓库)。


克隆远程仓库到本地时,还可以使用 -o 选项修改主机名,在地址后面加上一个字段作为本地仓库的主目录名,举例如下:


git remote -v

git remote -v

13.png

另一个在其它 Git 教程中常见的命令


git init

它会把当前所在目录变成一个本地仓库,因为有 GitHub 的存在,这个命令在我们的生产生活中用到的次数应该是零,除非你想费时费力自己搭建服务器。操作截图如下:

14.png


Git 基础操作


Git 仓库三的区域


Git 本地仓库有三大区域:


  • 工作区
  • 暂存区
  • 版本区。


这是一个概念,有这个了解即可,随着使用 Git 的时间增多,慢慢就会理解这三个区域的作用以及为何要这么设计,学习阶段只需按照文档逐步操作即可。接下来我们以命令为主线介绍 Git 的操作。

1.png

注意,所有 Git 命令都以 git 开头。


完整修改、提交、推送操作


首先,进入仓库主目录, 查看整个仓库的状态

git status

2.png


修改工作区

创建一个文件并再次查看仓库状态,这步操作是在工作区中:

3.png


如上图所示,新建文件后,命令行前缀又发生了一些微小的变化,红色 main 后面出现了 * 星号,这表示工作区或暂存区有变化,对文件进行增删改操作都会出现这个星号,另外使用 git status 命令亦可查看详情。


添加修改至暂存区以及撤销修改

按照上图的提示,使用 git add [文件名] 命令跟踪此新建文件,即把新增文件添加到暂存区,以备提交:

git add one.txt

4.png


如果对多个文件或目录进行了增删改,可以使用命令全部添加到暂存区。

git add .

注意这里有个概念,当我们修改了工作区,git add 命令是将这些修改添加到暂存区,暂存区记录的只是修改。


如果要撤销暂存区的修改怎么办?根据上图的提示,执行 git reset -- [文件名] 或者 git rm --cached [文件名] 命令即可:

git reset -- one.txt
# 或者
git rm -- cached one.txt

5.png

上图的命令,如果省略最后的文件名,把命令写成 git reset -- 即可把暂存区的全部修改撤销。好,现在暂存区的修改被撤销,又回到了工作区。


现在介绍另一个命令 git diff,它可以用来查看工作区被跟踪的文件的修改详情,此时新建文件 one.txt 并未被跟踪,而已被跟踪的文件 README.md 无修改,所以看不到。注意,只有在版本区中存在的文件才是被跟踪文件。

git diff

我们先修改 README.md 文件,然后执行此命令:

6.png

此时会跳到新的页面,即工作区修改详情页,按 Q 退出此页面:

7.png


现在,将工作区的两处修改(新增文件 one.txt,修改文件 README.md)全部添加到暂存区,并使用 git diff --cached 查看暂存区的全部修改:

8.png

同样,此命令也会跳到新的页面,即暂存区修改详情页:

9.png


查看提交历史

接下来,将执行 git commit 命令把暂存区的修改提交到版本区,生成一个新的版本。


在此之前,先介绍另一个命令 git log,它用来查看版本区的提交历史记录,当前只有一个提交,就是在 GitHub 上创建新仓库时的初始化提交。同样此命令也会跳到新页面,如下图所示:


git log

关于查看提交历史记录的命令,有些常用的选项介绍一下:


  • git log [分支名] 查看某分支的提交历史,不写分支名查看当前所在分支
  • git log --oneline 一行显示提交历史
  • git log -n 其中 n 是数字,查看最近 n 个提交
  • git log --author [贡献者名字] 查看指定贡献者的提交记录
  • git log --graph 图示法显示提交历史

10.png

配置个人信息

接下来需要对 Git 进行一些本地配置:


  • user.email:写入你自己注册 GitHub 账号的邮箱
  • user.name:你自己的 GitHub 账号名字

这两个命令设置你的身份信息如下图。git config -l 可以查看配置信息(就不展示截图了):

11.png

完成后,系统自动生成 Git 的配置文件,就是主目录中的隐藏文件 .gitconfig :

12.png

上图所示的配置文件也是可以直接手动修改。

提交暂存区的修改

现在执行 git commit 命令生成一个新的提交,一个必须的选项 -m 用来提供该提交的备注:


git commit -m 'new file one.txt'

13.png


提交后,暂存区的修改被清空,执行 git log 查看提交记录,紫色框中的十六进制序列号就是提交版本号,这是很重要的信息,每个提交都有自己单独的版本号,就像公民身份证号一样:

14.png

观察上图的提交信息,提交版本是按时间倒序排列的,也就是最近的提交排在最上面,你可能需要查看时间正序排列的信息,那么可以使用 git log --reverse 命令。


现在介绍一个超级实用、使用频率极高但几乎所有 Git 教程都不重视的命令 git branch -avv,它用来查看全部分支信息:


git log --reverse
# 或者
git branch -avv

15.png

上图有三行信息,依次说明:


第一行,开头的星号表示当前所在分支,绿色的 main 是分支名,之所以是绿色,也是因为它是当前所在分支。后面第二项是版本号,第三项中括号里面蓝色的字,表示此分支跟踪的远程分支的名字,当然啦,这也是克隆远程仓库到本地时的默认设置 – 创建 main 分支并自动跟踪远程同名分支;冒号后面黑色文字表示本地分支领先其跟踪的远程分支一个提交。最后一项是提交时填写的备注信息。


第二行,是 Git 指针信息,它指向远程仓库的 main 分支,这行信息暂不重要。


第三行,远程分支信息,详见第一行的解释。


在执行 commit 命令时,再介绍一个我并不推荐的选项 -a ,它的作用是将未添加到暂存区的修改,也就是工作区的修改也一并提交,但会略过未被跟踪的文件,比如新建文件 one.txt,此命令的完整格式:git commit -am xxxxx 。谨慎的做法是按照前文的顺序,修改工作区 - 提交到暂存区 - 随时使用 git status 查看仓库状态 - 将暂存区的修改提交到版本区生成一次新的提交。


最后一个环节,将本地新增的提交推送到 GitHub 远程仓库中,命令是 git push,后面不需要任何选项和参数,此命令会把本地仓库 main 分支上的新增提交推送到远程仓库的同名分支上,因为当前所在的分支就是 main,而且上文提到,它已经跟踪了远程仓库的同名分支:


git push

16.png此命令可能需要再次输入你的 Github 用户名和密码,密码为隐藏数据,输入时看不到。推送成功后执行 git branch -avv 查看分支情况:

17.png

如上图所示,本地分支 main 与远程分支 origin/main 的版本号一致,通常看两个版本号是否一致,只需比对前四位。看一下网页上的情况:

18.png

完全符合预期。


一个小细节,在上图右侧有 “1 hours ago” 字样,因为这次提交操作是 1 小时前完成的,与推送操作的时间无关。


以上就是一次完整的修改 - 提交 - 推送操作。一次推送中可以包含多个 git commit 操作,也就是多个提交可以一起推送。


版本回退


如果发现 one.txt 文件内容有误,怎么做?可以修改此文件然后再次添加到暂存区、提交、推送,也可以撤销最近一次提交,修改文件后重新提交推送。现在使用后一种方法来演示撤销提交的操作流程。


首先执行 git reset --soft HEAD^ 撤销最近的一次提交,将修改还原到暂存区。


--soft 表示软退回,对应的还有

--hard 硬退回,后面会讲到,HEAD^ 表示撤销一次提交,HEAD^^ 表示撤销两次提交,撤销 n 次可以简写为 HEAD~n。软退回一个提交后执行 git branch -avv 命令查看

分支信息:


git reset --soft HEAD^

20.png21.png

可以看到本地仓库的 main 分支的版本号已经发生了变化,变成了前一次提交的版本号,中括号里也有提示信息,本地分支 main 落后其跟踪的远程分支 origin/main 一个提交。


执行 git status 查看仓库状态,果然上一个提交中的修改全部扔回了暂存区:

22.png


再次修改 one.txt 文件,执行 git add . 命令将新的修改添加到暂存区,然后执行 git commit 命令生成新的提交:

23.png


处理 commit 时间线分叉

执行 git status 和 git branch -avv 查看仓库状态和分支状态:

24.png25.png

可以看到本地仓库的 main 分支与远程仓库的 origin/main 分支在提交版本上有了冲突,又叫做提交时间线分叉。因为刚才的提交操作不是基于远程仓库 origin/main 分支的最新提交版本,而是撤回了一个版本。这种情况下也是可以将本地 main 分支推送到远程仓库的,需要加一个选项 -f ,它是 --force 的简写,这就是强制推送:

git push -f

26.png


执行 git branch -avv 看一下分支信息,本地 main 与远程 main 的版本号一致,前四位都是 704c,在浏览器上刷新 GitHub 页面,结果如预期:


27.png


本地仓库 commit 变化历史

假设此时发现情况不对,之前的那次的提交是正确的,刚才的版本回退操作全都是误操作,怎么办?再次执行一次版本回退吗?当然不需要啦,我们有 git reflog 命令,它会记录本地仓库所有分支的每一次版本变化。实际上只要本地仓库不被删除,随你怎么折腾,都能回退到任何地方。reflog 记录只存在于本地仓库中,本地仓库删除后,记录消失。


执行此命令如下图所示:


git reflog

28.png

怎么回退到 c44bfd0 那个版本呢?可以直接执行命令 git reset --hard [版本号] ,如果记不清版本号,也可以根据上图第 3 行的信息,执行 git reset --hard HEAD@{2} 命令,其中 HEAD@{2} 就是上图第 3 行第 2 列所示,这个命令的意思是回到当前分支最近两次提交版本变化前:

git reset -- hard HEAD@{2}
# 或者
git reset -- hard c44bfd0

29.png

还想反悔,刚才还是改对了,怎么办?再执行一次即可,这次大括号里就是 1 了:

30.png


重要的一点,本节全部命令中,只有 push 是需要联网执行的,它对远程仓库进行了修改。


目录
相关文章
|
17天前
|
人工智能 缓存 开发工具
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
|
4天前
|
开发工具 git
Git项目如何配置,如何上传至GitHub。其详细步骤
Git项目如何配置,如何上传至GitHub。其详细步骤
7 0
|
12天前
|
网络安全 数据安全/隐私保护
解决git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas
解决git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas
|
13天前
|
存储 开发工具 git
|
13天前
|
开发工具 git 开发者
【专栏】探讨了 Git 中的 `git rebase` 操作,它用于重新应用提交到另一分支,改变历史顺序
【4月更文挑战第29天】本文探讨了 Git 中的 `git rebase` 操作,它用于重新应用提交到另一分支,改变历史顺序。与 `git merge` 不同,rebase 重写提交历史,提供简洁线性的历史记录。文章介绍了 rebase 的基本操作、应用场景,如整理提交历史、解决冲突和整合分支,并强调了使用注意事项,如避免在公共分支上操作。尽管 rebase 可以带来整洁的历史和冲突解决便利,但其潜在的风险和可能导致的历史混乱需谨慎对待。理解并恰当使用 `git rebase` 可以提升开发效率和代码质量。
|
17天前
|
开发工具 数据安全/隐私保护 C++
vs2019中同步到github上的用户名错误_控制面板和vs的git全局设置重新登录
vs2019中同步到github上的用户名错误_控制面板和vs的git全局设置重新登录
17 0
|
19天前
|
前端开发 JavaScript 网络安全
Git(3) 使用Github管理项目
Git(3) 使用Github管理项目
25 0
|
27天前
|
数据可视化 开发工具 git
Git代码版本管理入门
Git代码版本管理入门
|
27天前
|
Linux 开发工具 git
还不会 Git 子模块操作?一文教你学会 git submodule 的增、删、改、查!
还不会 Git 子模块操作?一文教你学会 git submodule 的增、删、改、查!
|
1月前
|
开发工具 git
git如何创建新分支,GitHub默认分支是main怎么连上
git如何创建新分支,GitHub默认分支是main怎么连上
16 0