Skip to the content.

Git

Git 是一款版本控制管理系统。

简单明了的说 Git 的作用就是,如果一组文件被 Git 管理起来了,那么对于这一组文件的所有变动,Git 都会记录下来,以便用户能够随意切换到某一个变动的版本。

Git 是什么?

安装

Ubuntu

sudo apt-get install git -y

Centos

sudo yum install git -y

查看 git 的版本

git [-v | --version]

基本操作

创建本地仓库

在一个目录下执行该指令

git init

此时目录下会存在一个.git目录。

配置基本信息

--global选项使得配置用户信息作用于全部仓库。

--global选项作用于删除全部仓库的用户配置信息

在创建完本地仓库以及配置好用户信息后,就能够正常使用 Git 了。

认识工作区、暂存区、版本库

下面这张图展示了工作区、暂存区和版本库三者之间的关系:

image

添加文件

将工作区中的文件变动添加到暂存区。

git add [file]

提交文件

将暂存区中的文件变动提交到版本库。

git commit [file] -m "commit message"

file未指定时,会将暂存区中的全部文件变动都提交到版本库。

-m后的提交信息要认真写,因为这个提交信息可以为以后用户进行版本回溯时提供非常重要的信息。

查看文件的修改信息

版本回溯

显示日志

每一次 commit 都是一个版本。

显示日志时,最重要的就是 commit ID,称为版本号。

进行版本回溯

git reset [--soft | --mixed | --hard] [HEAD]

选项说明:

版本回溯后反悔怎么办

版本回溯的原理

HEAD 里存的是当前分支头,版本回溯的原理就是直接修改当前分支头的指向。所以版本回溯的速度非常快。

image

Git 文档里说”Reset current HEAD to the specified state.“但仍不清楚,因为当 Git 仓库有多个分支时,上面的描述就不够清晰。

撤销修改

删除文件

  1. git rm file
  2. git commit -m "commit message"

分支管理

基础命令

查看分支

git branch

创建分支

git branch <name>

切换分支

git checkout <name>

创建并切换分支

git checkout -b <name>

删除分支

git branch -d <name>

强制删除分支

git branch -D <name>

当分支上有未提交的内容时,-d 是删除不了分支的,只能用 -D 来删除。

合并分支

git merge <name>

比如分支 A 想要合并分支 B 的内容,那么首先要处于分支 A,然后执行 git merge B

上述命令默认的合并模式是 Fast-forward,在该模式下进行合并,在查看日志时,是看不出来最新的提交究竟是合并得来的还是分支自己搞得。

image-20231215194308861

image-20231215194357496

所以建议在合并时不使用默认的合并模式,该用 no-ff 模式(no - fast forward 的缩写):

git merge --no-ff -m "message" <name>

由于新增了一个 commit ,所以必须要写提交信息。

image-20231215194725478

image-20231215194812479

合并冲突

假设分支 A 在 test.cc 文件里新增了一行然后提交了,分支 B 也在 test.cc 文件里新增了一行然后提交了。当分支 A 合并分支 B 的时候就会发生合并冲突。

image-20231215200127274

image-20231215200156823

很清楚的可以看到,11111111111 和 22222222222 冲突了,此时进去文件,手动把冲突中不想要的给删除掉就 OK 了。

image-20231215200348597

然后,用 git status 查看状态

image-20231215200426420

重新提交,再查看状态,就发现冲突成功解决,合并完成。

image-20231215200545672

远程操作

克隆远程仓库

git clone <远程仓库地址>

向远程仓库推送

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,则等同于下面命令:

git push <远程主机名> <本地分支名>

从远程仓库拉取

git pull <远程主机名> <远程分支名>:<本地分支名>

如果远程分支名与本地分支名相同,则等同于下面命令:

git pull <远程主机名> <远程分支名>

查看远程主机

git remote -v

忽略文件

创建 .gitignore 文件。

touch .gitignore

将不想上传/不能上传的文件的后缀添加进去,比如 mac 老是自动生成一个 .DS_Store 文件,我们不想上传它,那就将这个后缀添加进去:

image-20231216163537754

若不想上传 .so 文件,则把该后缀也添加进去

image-20231216163650172

若此时,想上传某个 b.so 文件,有两种做法:

标签管理

打默认标签

git tag <tagname>

默认标签是默认打在最新的 commit id 上的。

打指定标签

git tag <tagname> <commit id>

打标签时添加说明

git tag -a <tagname> -m "message" [commit id]

查看标签

git tag

标签的列出顺序不是按照时间来排序的,而是按照字母排序的。

查看标签详细信息

git show <tagname>

删除标签

git tag -d <tagname>

推送单个标签

git push origin <tagname>

推送全部标签

git push origin --tags

删除本地标签

git tag -d <tagname>

删除远程标签

先删除本地标签,然后再推送

git push <远程主机名> :refs/tags/<tagname>

实战——演示实际开发流程

一些命令小知识

**为什么有时 git push/pull ,有时 git push/pull <远程主机名> <分支名>:<分支名> **

在本地仓库和远程仓库的分支之间建立连接的情况下,在当前分支下直接使用 git push/pull 就能与远程仓库的对应分支进行沟通。而默认情况下,克隆下来一个远程仓库,默认就有 main 与 origin/main 或者是 master 与 origin/master 的连接,并且默认处于 main/master 分支下,所以就能直接 git push/pull 与 origin/main(master) 进行沟通。

在本地仓库和远程仓库的分支之间没有建立连接的情况下,使用 git push/pull,就不行,因为 git 不知道你想与哪个分支进行沟通。所以此时就要指定本地分支名和远程分支名。

如果远程仓库有 3 个分支,此时克隆下来的仓库就默认有 3 个连接。

如何查看建立了哪些连接?

git branch -vv

远程仓库没有 feature 分支,本地仓库新建了一个 feature 分支,本地 feature 分支如何连接(并创建)到远程仓库的 feature 分支?

在 git push 的后面加上参数如下:

git push --set-upstream origin <远程分支名> # 这里是 feature

image-20231218112432284

单分支开发

实战流程:

image-20231218102517107

程序员 A 提交代码

image-20231218102725273

程序员 B 提交代码

image-20231218105759764

main 分支合并 dev 分支

有两种方式:

这里只演示命令行操作:

不能直接 main 分支直接合并 dev 分支,因为合并大概率会有冲突,而在 main 分支上解决冲突很容易出现问题,所以正确做法是 dev 分支先 合并 main 分支,解决掉可能存在的冲突后,再让 main 分支合并 dev 分支。但由于是在本地的命令行上操作,所以不确定本地仓库的 main 分支是否是最新的,所以 main 分支要先 pull 一下。

image-20231218110735410

删除分支

image-20231218152936620

多分支开发

实战流程:

image-20231218153241947

image-20231218153337257

程序员 A 的操作

image-20231218153626817

程序员 B 的操作

image-20231218161358695

此时程序员 B 生病了,由程序员 A 帮助程序员 B 进行开发

image-20231218161551812

此时程序 A 帮助程序员 B 完成了一部分功能,然后程序员 B 病情好转,能上班了

image-20231218161820804

分支 feature1 和分支 feature2 的任务都已完成

feature1 分支下有一个文件 feature1.cc,内容是 111

feature2 分支下有一个文件 feature2.cc,内容是 222 333 done

然后就要将 feature1 的内容和 feature2 的内容合并到 main 分支上

先合并 feature1 分支

先切换到 feature1 分支上,合并 main 分支,解决可能存在的冲突,然后再切换到 main 分支上,合并 feature1 分支,最后 push。

但在合并 main 分支的时候,需要先切换到 main 分支上,进行 pull,因为要保证 main 分支是最新的(远程仓库永远是最新的,本地仓库可能不是)。

image-20231218164654722

再合并 feature2 分支

跟 main 分支合并 feature1 分支道理一样。

image-20231218165040483

查看 GitHub 仓库,发现目的成功完成

image-20231218165151192

最后,删除远程仓库的 feature1 分支和 feature2 分支,然后删除本地仓库的 feature1 分支和 feature2 分支与本地仓库的远程分支的记录

image-20231218165722549

经验总结

企业开发模型

一个项目从零开始到最后交付,往往需要经过以下几个阶段:规划、编码、构建、测试、发布、部署和维护,当代码体量小时,以上阶段往往一两个人就足矣完成,但是当代码体量很大时,就需要很多的人组成不同的团队来共同为该项目发光发电。

image-20231218194240939

这些团队所跟进的代码不可能是在同一台服务器上的,因为这样不利于产品的稳定和开发,所以就诞生了很多种系统开发环境。

系统开发环境

Git 分支设计规范

下面是最常见的一种 GIt 分支设计规范:Git Flow 模型。

image-20231218195403130

分支 名称 适用环境
master 主分支 生产环境
release 预发布分支 预发布/测试环境
develop 开发分支 开发环境
feature 需求开发分支 本地
hotfix 紧急修复分支 本地

master 分支

release 分支

develop 分支

feature 分支

hotfix 分支

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。