为了练习使用 Git,我开始阅读文档以及 Opensource.com 上的一些文章,特别是 Seth Kenlon 的介绍。读完后,就到了进行实际练习的时候了。
和许多本科计算机科学专业的学生一样,我做过编程作业和实验。我保存了所有这些工作,所以为什么不使用这些代码创建一个 Git 练习仓库呢?然后,我可以运行代码并修复任何问题,这将让我练习进行提交和创建分支。通过这样做,我可以展示基本的 Git 熟练程度。
我对版本控制并不陌生。我使用过较旧的工具,例如 CVS 和 Subversion,并且多年前曾担任 Borland (现为 Micro Focus) StarTeam 的管理员。但是,我的 Git 经验仅限于少量使用 Atlassian Bitbucket。我不是 Git 大师。
是时候学习了。
评估旧代码
在过于习惯 GUI 工具和 GitHub 以及 GitLab 等网站之前,我想花时间在命令行上,以便充分理解 Git 的工作原理。我首先检查是否安装了 Git,所以我尝试运行 git 命令。但是,它没有安装,不过这个问题很容易使用发行版软件包管理器解决。例如,在 Ubuntu 上,您可以运行 sudo apt install git 来安装此工具。在 Fedora 上,sudo dnf install git 也能完成这项工作。
运行软件包管理器后,快速检查确认 Git 现已安装
$ git --version
git version 2.17.1
此时,我找到了我的旧文件,并将它们重新排列成一个可以很好地工作的目录结构。这些文件来自我的 CSC121 课程的作业——实验 2。目标是编写一个应用程序,扮演加油站的角色。用户必须选择燃料等级和要购买的加仑数。等级决定了每加仑的成本,然后乘以加仑数以得出总购买成本。我仍然有 C 源代码和编译后的二进制文件。
~/GIT/CSC121/lab2$ file *
Lab2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, not stripped
Lab2.c: C source, ASCII text
这段源代码只有 33 行代码。我很好奇这个 20 多年前编译的二进制文件是否仍然可以执行。
~/GIT/CSC121/lab2$ ./Lab2
GoGo Gas station
enter type of gas;r-regular;p-premium;s-super:
它成功运行的事实证明了向后兼容性!
我开始思考我可以对代码进行哪些更改。我想先完成更多测试,看看代码是否运行正确。例如,购买 10 加仑高级汽油的结果是
p
enter quantity;# of gallons:
10
type of gas pumped:premium
price of premium gas per gallon:$1.30
your total cost is:$ 13.000000
我的第一个想法是,“哇,20 年前汽油真便宜!” 鉴于这个简单的测试,我确定我确实有一个小型、有用的代码项目可以用作 Git 练习。
设置仓库
开始使用 Git 的第一步是创建一个仓库。我还配置了一些东西来开始,例如设置我在 Git 中的身份,由我的用户名和电子邮件地址定义。为了设置我的身份,我确保我位于我打算使用的工作目录中,在本例中是我的 lab2 目录。
创建仓库的命令很简单
$ git init
Initialized empty Git repository in /home/alan/GIT/CSC121/lab2/.git/
我今天经常使用的一个命令是 git status,用于检查仓库的状态。在新仓库上运行此命令会得到以下结果
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
Lab2
Lab2.c
nothing added to commit but untracked files present (use "git add" to track)
以上结果揭示了重要的信息。在本例中,它们告诉我我当前位于 master 分支上,并且没有任何提交。Git 还将我的工作目录中的两个文件列为未跟踪,因为它们尚未被添加。下一步是添加这些文件。
是否添加编译后的二进制文件是一个取决于您的用途的决定。通常,二进制文件存储在二进制仓库中,并且不会添加到 Git 中,因为 Git 无法 diff 二进制文件。在我的例子中,我想保留这个特定的二进制文件。我使用 git add 命令将这两个文件添加到仓库中。
该命令不产生任何输出,但是再次检查状态会显示 Git 不再将文件列为未跟踪
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: Lab2
new file: Lab2.c
添加文件后,我执行了 git commit,使用 -m 选项包含一条消息
$ git commit -m "Lab2 首次提交"
就是这样!仓库已填充。再次检查状态显示一切正常
$ git status
On branch master
nothing to commit, working tree clean
为了加强我所学到的知识,我重复了这个过程几次,很快就熟悉了维护仓库的最常见任务。我掌握了使用 git add 添加文件和使用 git rm 删除文件的方法。我也知道如何提交这些更改。接下来要处理的项目稍微复杂一些:git branch。
使用 Git
Git 分支用于隔离工作。当新功能正在开发中但需要保持独立直到准备好公开发布时,通常会使用此策略。
我认为创建一个名为 original 的分支来存储原始文件是个好主意。这样,如果我有不同的分支并且准备好合并回 master,我就不会覆盖旧版本。我使用 git branch 命令执行此操作,指定新分支的名称
git branch original
此步骤将 master 复制到新分支。要列出分支,我使用不带参数的 git branch 命令。星号表示我的活动分支
$ git branch
* master
original
我使用 git checkout 来查看我的新分支。再次,git branch 使用星号来指示我的活动分支
$ git checkout original
Switched to branch 'original'
$ ls
Lab2 Lab2.c
$ git branch
master
* original
早些时候,我确定了原始代码中我想更改的内容。因此,为了保持新版本的组织性,同时保留当前代码,我专门为更新创建了另一个分支,名为 Fix2019。我将其设为我的新活动分支并删除了二进制文件。
$ git branch Fix2019 master
$ git checkout Fix2019
Switched to branch 'Fix2019'
$ git rm Lab2
rm 'Lab2'
此时,我编辑了我的代码以更新价格。高级汽油绝对不再是 1.30 美元了,所以我将其提高到 2.75 美元。实际更新的 C 代码如下所示
{
printf ("type of gas pumped:premium\n");
printf ("price of premium gas per gallon:$2.75 \n");
price=2.75*quantity;
printf ("your total cost is:$ %f\n",price);
}
我保存了文件并尝试重新编译
$ cc Lab2.c -o Lab2
太棒了,编译成功了!作为测试,我再次运行了二进制文件并购买了 10 加仑高级汽油(记住 20 年前总成本是 13.00 美元)。
$ ./Lab2
GoGo Gas Station
enter type of gas;r-regular;p-premium;s-super:
p
enter quantity;# of gallons:
10
type of gas pumped:premium
price of premium gas per gallon:$2.75
your total cost is:$ 27.500000
现在这十加仑汽油要 27.50 美元了!我可能要多走路了!
命令 git status 总结了我已采取的所有操作
$ git status
On branch Fix2019
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: Lab2
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Lab2.c
Untracked files:
(use "git add <file>..." to include in what will be committed)
Lab2
我必须将我的更改提交到 Fix2019 分支。我使用 git add . 添加了更新后的代码和新二进制文件,然后执行了 git commit
$ git add .
$ git status
On branch Fix2019
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: Lab2
modified: Lab2.c
$ git commit -m "Update gas prices"
[Fix2019 fba4b56] Update gas prices
2 files changed, 3 insertions(+), 3 deletions(-)
rewrite Lab2 (100%)
在某个时候,我可能想要使用较新的代码更新 master 分支。此任务通过将包含新代码的分支合并到 master 分支来完成。在本例中,这意味着我将 Fix2019 合并到 master 分支。合并是从接收新代码的分支完成的,所以首先我必须检出 master 分支
git checkout master
对旧价格的 grep 显示 master 分支仍然包含旧代码
$ grep $1.30 Lab2.c
printf ("price of premium gas per gallon:$1.30 \n");
所以是时候合并了。最后一次对新价格的 grep 将确认合并
$ git merge Fix2019
$ grep $2.75 Lab2.c
printf ("price of premium gas per gallon:$2.75 \n");
结论
这个练习帮助我开始使用 Git。它只涵盖了本地仓库的基础知识,作为分布式版本控制系统,Git 提供了更多功能,但这足以让我入门。现在轮到你了。找一个简单的项目,将其加载到 Git 中,开始学习吧。
评论已关闭。