CS61B: Git的工作流与使用

前言

虽说大家应该都会用git来进行版本控制以及云端备份,但是如果是合作开发次数较少的情况下,我们可能会对分支冲突等这些情况不知道怎么去处理,下面我们来一步步梳理一下。

Git中的抽象概念

首先git把本地仓库称为暂存区,也就是提交文件的快照至暂存区,必要时可以返回某个快照,也就起到了版本控制的作用。

git init

首先是初始化一个本地仓库

1
git init

这个init命令会在本地创建一个隐藏的.git文件,其中就包含了一些重要的数据来维护本地仓库,我们不应该修改这个文件里面的内容,以免造成文件损坏。

git status

在创建好本地仓库后,我们来新建一个文件试试

1
touch mass.txt

然后随便往这个里面写一些东西

1
echo "hello" >> mass.txt

此时,如果我们想要对mass.txt进行版本控制,就需要把这个文件添加到追踪记录里面。我们先来看看当前是否有未进行提交的文件呢

1
git status

然后git给了我们这些提示信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        mass.txt

nothing added to commit but untracked files present (use "git add" to track)

它提示我们有一个未追踪的文件,也就是说,你必须告诉git,让它追踪这个文件,否则将无法对mass.txt进行版本控制。

git add

我们可以将先要追踪的文件或文件夹列在这个命令后

1
git add <file/folder>

添加mass.txt

1
git add mass.txt

然后这是git的提示信息

1
2
3
4
5
6
7
8
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   mass.txt

它告诉我们,我们已经要追踪mass.txt了,它还提示我们,如果不想追踪这个文件,可以使用

1
git rm --cached <file>

这个命令是很有用的,因为有的时候你不小心追踪了一个配置信息文件,而这个配置文件实际上没有必要存储在云端,所以你可以使用这个命令去除你追踪过的某个文件。

当然,你还可以把所有不需要追踪的文件全部写入一个.gitignore中,这是一个文本形式的文件,这样在git status的时候,git就会忽略他们。

git commit

当你觉得我目前所有的工作做完后,功能也实现的差不多了,你就可以使用git commit来把这些文件加入暂存区。

1
git commit -m "实现了xxx"

-m是指message的信息,这也是你对当前工作的一个快速总结,当你不小心搞砸后,你就可以回到你的这次commit

当然,也可以不指定任何参数

1
git commit

这样会弹出一个vim的标签,如果需要更多的提交信息,那么就可以使用这个页面。

git checkout

每次我们使用git commit进行提交后,就会对应生成多个哈希信息,如果我们希望回到某个版本,就可以使用git checkout回到对应的版本,我们可以使用git log来查看本地仓库的所有提交记录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ git log
commit fa373de6f7f4b8f1a58d368037fcd4f100871dd1 (HEAD -> main)
Author: XiaoPeng <xxx@gmail.com>
Date:   Thu Jul 31 14:53:30 2020 +0800

    test:mass.txt has "123"

commit 9d0b3365996a3486054c64453f1c8c499746c8e7
Author: XiaoPeng <xxx@gmail.com>
Date:   Thu Jul 31 14:52:35 2020 +0800

    test:clean mass/txt

commit之后还有一个哈希值,我们在checkout后指定对应的哈希值就可以切换到对应的版本

1
git ckeckout 9d0b3365996a3486054c64453f1c8c499746c8e7

然后会得到下面的提示

1
2
3
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

意思就是说HEAD指针不在最新的提交上,也就是分离头指针。我们现在来看看mass文件里面有什么

结果符合我们的预期,什么都没有。

合并冲突

冲突一般出现在多人合作中,尤其是对同一个功能的实现,在合作的时候,当我们把一项任务完成后,需要向远端同步

1
git push origin main

假设我们同步到远程的main分支,此时,如果提交,可能会触发拒绝提交的提示。这是因为你的本地分支可能落后远程分支,也就是说,在你之前,已经有人更新过远程分支了,为了防止文件内容的丢失,于是git就拒绝了你的提交,此时你需要先于远程分支进行同步

1
git pull origin main

其实pullgit fetchgit merge的合并命令,说的有些抽象,我们来画个图展示一下。

这是我们的远程仓库

image-20250801142707832

本地获取远程仓库后,又做了几次commit

image-20250801140949554

注意,此时我们本地仓库的分支最新是commit5,而远程的最新分支是在commit3上。

此时,如果有人在你之前就修改了远程分支,假设变成了这样

image-20250801142749539

也就是说,远程仓库的commit4commit5都是你所没有的,即你本地仓库的远程分支和远程仓库的分支是落后的。

git pull做的就是先从远程分支进行拉去,然后尝试合并,也就是完成了git fetchgit merge这两个命令

image-20250801143150036

此时,分支冲突就可能会产生,这个时候就需要我们去手动处理可能出现分支冲突的内容。

总结

学会这些命令后,基本上就可以达到实验中对我们的要求了,更多命令和技巧,可以在以后慢慢学哦!

Licensed under CC BY-NC-SA 4.0
花有重开日,人无再少年
使用 Hugo 构建
主题 StackJimmy 设计