Git 基本操作指南
内容概要
这个作业属于哪个课程 | 2022面向对象程序设计 |
---|---|
这个作业要求在哪里 | 2022面向对象程序设计寒假作业1 |
这个作业的目标 | Git & Github |
作业正文 | 如下 |
其他参考文献 | Git - Lecture 1 - CS50's Web Programming with Python and JavaScript 2020 |
Git 简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git在大型项目的开发中,能够节省下大量的代码管理时间。极大地提高团队协作开发的效率。
Git 能为开发者做到
- 保持代码仓库的自动更新
- 同步多个开发者之间的开发进度
- 回溯代码进度
- 实现无损的测试和修改代码
Git 托管平台的注册
Git 是一款分布式的版本控制系统,需要一个代码托管平台来存放代码。
目前,最为流行的代码托管平台是 Github。但是,由于众所周知的原因,Github 在国内的访问非常不稳定。作为替代方案,国内也涌现出了许多出色的平台如 Gitee,GitCode等平台,为国内开发者用户提供服务。
这篇博客里就以 Github 为例,注册一个 Github 的账号。
简单的输入你的邮箱,密码,用户名。在通过邮箱验证后,即可完成注册一个 Github 的账号。
Git 安装
下载
进入 Git 的网站,找到大大的下载按钮。点击他进入到下载页面。
同样的,由于中国网络环境的问题。如果你的下载速度极慢,可以考虑使用阿里镜像源下载。
安装
安装非常简单。
打开安装包,如果没有什么特殊需要的话。直接保持默认选项即可。
只有中途有一个选择默认编辑器的选项(如图所示)需要根据你自己的情况选择。
我这里选择的是 VS Code。
Git 基本配置
安装完成后,在你的开始菜单中会出现一个新的 Git Bash
可以通过 Git 自带的 Bash 或者和 Windows 内建的 cmd 对 Git 进行基本的配置。
推荐使用 Bash,可以顺便熟悉一下 Linux 的命令行指令。
在第一次使用 Git 之前,主要要进行以下两项的配置
-
个人信息(name & e-mail)
-
代理(因人而异)
配置个人信息
在对远程代码仓库进行修改的时候,Git 需要知道你的信息才能够区分不同用户的修改。
要对自己的个人信息进行配置,你需要在 Bash 中输入
git config --global user.name "这里输入你的名字"
git config --global user.email "这里输入你的邮箱"
--global 意味着配置全局信息,Git 允许你在不同的工作目录下有不同的配置。
完成你个人信息的配置。
配置代理设置
没有代理,从远程仓库里面克隆代码极度痛苦。
你需要在 Bash 中输入
git config --global http.proxy http://127.0.0.1:1234(你的代理地址)
git config --global https.proxy https://127.0.0.1:1234(你的代理地址)
完成对代理的配置,享受顺畅的 Git 体验。
Git 基本概念
完成了 Git 环境的配置之后,我们来学习一下 Git 的基本命令。
在详细介绍 Git 命令之前,我们需要对 Git 的基本概念进行理解一下。
为了避免在团队开发时各个开发者对项目代码做重复性工作或是不同的代码更改,从而产生不必要的冲突拖慢工作效率。Git 将项目的源代码存储在远程托管平台 (host) 的远程仓库(remote repository)中,而非本地上。
在开发时,每个开发者都会在本地拥有一份完成的代码副本,并在本地完成对代码的所有更改。所有的更改都发生在本地,不会对远程仓库中的原始代码进行修改。
只有确认完成修改之后,开发者在本地提交更新(commit)。Git 会自动检测并记录下所有修改。(我觉得把这个理解成存档点挺好)
当一个阶段的工作全部结束后,开发者可以将本地的仓库推送(push)到远程仓库。此时,Git 会根据远程服务器端最新的代码内容与开发者本地的仓库进行比对。Git 根据具体情况自动合并双方的仓库(可能会出现冲突,需要手动更正),并且绝对保证代码的完整性。
至此,一次完整的仓库更新过程结束。
这样的流程可以解决人工同步代码时出现的很多不必要错误,并且 Git 能够提供回溯开发进度的功能。
Repository 仓库
Git 把一个项目或者说一个软件的全部相关代码文件存放的目录叫做 repository (仓库)。在 Github 上你可以根据自己的需要创建仓库,并以此来区分不同项目的文件。
Commit 提交
Git 把开发者每一次完成对项目的更改称作 commit。在我的理解中,一个 commit 就像是一个存档点,存储了上一个 commit 到当前这个 commit 的所有变更,像是对代码的增加,删除,修改。并且每个commit都可以附上一条信息,记录下你对仓库进行的具体修改。为未来的进度回溯提供必要信息。
Push & Pull 推送 & 更新
开发者可以将本地的仓库推送(push)到服务器端,也可以将服务器端的仓库下载(pull)回本地。在这个过程中,Git 能够自动的完成所有合并的工作。
当然,为了不造成混乱,不是所有人都可以 push 所有仓库。但你可以发起一个 pull request(请求别人 pull 你的本地 repository),在仓库管理者同意之后,你所提交的更改就可以合并到远程仓库中了。
Branch 分支
后面会详细提到。
Git 基本命令
刚才新建的 Github 账号里面现在还什么东西都没有。
Github 在与你账户名相同的 repository 下的 README.md 存放你对外展示的自我介绍。
那么这里就通过 Github 自我介绍的编辑来简单复盘一下 Git 的基本命令。
首先,在Github 的主页上找到绿绿的新建按钮,点击他。进入到新建 repository 的页面。
用自己的账户名作为仓库的名字。新建一个仓库。Github 默认会将此仓库作为存放个人信息的仓库。
完成新建之后,复制仓库的地址。下面的操作就要在本地进行了。
克隆远程仓库
最好在一个空白的目录下,打开 Git Bash。
输入
git clone https://github.com/zenor0/zenor0.git
看到这样的提示信息,就说明克隆成功完成了。
能看到工作目录下已经出现了远程仓库中的所有内容。
在本地仓库修改内容
打开用来存放个人信息的 README.md。
在本地编辑器里,可以完成对自我介绍的修改和编辑。
对本地仓库提交更改
在本地完成编辑之后,此时,我们在本地做的所有操作还尚未同步到 Github 的远程仓库中。
我们需要回到 bash 里面,使用如下命令完成本地仓库的同步。
git add README.md
git commit -m "First commit"
或者当修改的文件数量比较多的时候,可以偷懒。使用
git commit -am "Add more content"
省略一步add,一次性提交所有的更改。
将本地仓库推送到 Github
确认完成所有更改之后就可以 push
了
git push
如果你是第一次push
仓库的话,Git 会弹出一个登录 Github的窗口让你登录你的 Github 账号,完成第一次登录的配置。(当然,用SSH也可以嘛,再说...)
此时,刷新你的 Github 页面。
所有更改全部都已经同步到远程仓库。同时你还可以看到之前在 commit 时标注的内容。
此外,在 Github 上,你还能够看到之前所有提交过的 commit。
更新本地仓库
我们试着模拟远程仓库被其他开发者进行了修改。此时,我们需要更新本地的 zenor0 仓库。
首先,在 Github 的网页端完成对 README.md 的修改。
使用命令
git pull
完成对本地仓库的更新。
同步仓库时发生冲突
然而,不是所有的合并都能够自动的完成。例如,当本地仓库和远程仓库对同一个文件的同一行代码都进行修改的话,Git 无法判断要按照本地的内容合并还是要按照云端的内容合并。这个时候,Git 会在发生错误的代码中插入一段内容,其中包括本地和云端的两个版本代码以及这个冲突的哈希值。我们需要在本地解决了这个合并冲突之后,再进行同步的操作。
通过对远程仓库和本地仓库中的同一行进行修改,来模拟这种情况。我对云端和本地端的 README.md 的同一行进行了不同的修改。
如果,这个时候使用 push
会出现报错,要求先进行 pull
同步远程仓库。
然而,pull
操作同样会出错
Merge conflict in README.md
Automatic merge faild; fix conflicts and the commit the result.
自动合并出错; 请修复冲突并且提交更改.
此时在本地的编辑器中打开冲突文件,就能看见 Git 对冲突文件的修改。我们需要选择一个版本,来修复这个冲突。
修复后,保存文件。
成功同步仓库!
Git 分支 (branch)
Git 为开发者提供了一个极为强大的分支功能,这也是 Git 区别于其他版本控制系统的最显著特点。
理想化的软件开发流程是一个线性的过程,按部就班一步接着一步。是一种单线程的开发流程。
想象你正在开发一个项目,你正在为这个项目添加新的功能特性。
但是!在你写到一半的时候,你突然发现在添加这个功能的 commit 之前有一个 bug 没有修复。这个时候你就陷入到了一个两难的境地,是选择去修复这个 bug 丢弃掉写了一半的新功能,或是选择继续开发新功能而去忽略掉这个 bug。
而 Git 的 branch 给这种情况提供了第三种选项,你可以通过新建一个分支来做到同时开发两个分支(branch)。两个分支(branch)互不干扰。
在完成了两条分支的全部开发工作后,只需要在最后的时候进行合并就行了。将原本单线程的开发工作,变成了多线程工作。不仅能够提升开发效率,还能够保证有一个稳定的分支。非常牛逼。