目录
Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的软件开发项目。
本文我们将学习git的基础使用。
git的安装
Windows下的安装
在Windows环境下我们可以访问git官网下载
Linux下的安装
Linux下我们可以使用命令安装
sudo apt install git
初始化配置
在完成安装后,Linux系统可以直接在命令行操作。Windows则需要在git Bash中操作。
在Window下右键,即可进入git Bash。
我们可以对git进行一些简单的配置。
用户名配置:
git config --global user.name "username"
git:为了区分git命令与系统命令,git命令都会有git前缀。
config:表示配置git环境
--global:表示配置整个git环境
邮箱配置 :
git config --global user.email "邮箱"
同样可以使用命令查看git的配置情况。
git config --global --list
执行效果:
新建仓库
首先我们需要一个空目录创建仓库,这里我们提前准备了一个目录gitlearn。我们可以使用 init 命令在当前目录来初始化一个新的Git仓库。
git init
我们使用ls命令查看当前目录
可以看到当前目录多了一个 .git 隐藏目录,这个目录包含了Git仓库的所有必要文件和对象,它是Git跟踪项目历史和元数据的核心部分。
工作区域与文件状态
git的本地数据管理分为三个区域。
工作区(Working Directory):
这是项目目录中的普通文件和文件夹,你可以在这里修改、添加或删除文件。暂存区(Staging Area):
通常指的是Git的索引(index),一个准备下次提交的文件列表,位于.git目录下的index文件中。本地仓库(Local Repository):
这是.git目录,包含所有分支的提交历史、标签和引用
在git中文件有五种状态
- 已修改(Modified):文件已经被更改,但还没有暂存。
- 已暂存(Staged):对已修改文件的更改已经暂存,准备在下次提交时被包括进去。
- 未跟踪(Untracked):文件是新添加的,Git尚未开始跟踪。
- 已删除(Deleted):文件已经被删除,但这个删除操作还未提交。
- 已删除(Deleted):文件已被删除,但这个更改需要暂存并提交才能记录在本地仓库中。
添加与提交文件
我们可以使用 status 命令查看仓库的状态。
git status
我们新建一个file1.txt的文本文件,然后查看仓库状态。
可以看到仓库中有一个红色文件 file1.txt,红色表明 file1.txt 处于未跟踪状态。我们可以使用 add 命令将他提交到暂存区。
git add 文件名
可以看到在我们执行了add命令后 file1.txt 变为了绿色这表明文件已经存在了暂存区等待被提交。同时我们可以使用 rm 取消暂存。
git rm --cached 文件名
现在我们通过 commit 命令将文件提交。
git commit -m "文件信息"
这里我们使用 -m 选项简化操作,如果不使用-m,会调用终端的注释编辑器让你输入描述信息。
可以看到file1.txt 被成功提交,注意提交时只会提交暂存区文件,不会提交工作区文件。
add命令还支持使用通配符指定暂存文件,也可使用目录作为参数。
git add *.c //暂存所有.c后缀文件。
git add . //暂存当前目录所有文件。
回退版本
我们可以使用reset命令回退版本。
-
--soft:
- 只移动 HEAD(HEAD 是一个指针,指向当前分支的最新提交) 到指定的提交版本,不改变暂存区和工作目录。
- 使用场景:如果你想要撤销一个提交,但保留所做的更改,以便重新提交。
-
--mixed( 默认选项):
- 将 HEAD 和暂存区都重置到指定的提交,但不改变工作目录。暂存区中的更改会被清除。
- 使用场景:如果你想要撤销一个提交以及其暂存区的更改,但保留工作目录中的更改。
-
--hard:
- 将 HEAD、暂存区和工作目录都重置到指定的提交。所有未提交的更改都会丢失。
- 使用场景:如果你想要完全回到某个特定的提交状态,不保留任何未提交的更改。
我们可以使用 log 命令查看历史版本。
git log
我这里做了三次提交,第一次提交了file1.txt,第二次提交了file2.txt,第三次提交了file3.txt。
现在我们使用 reset 命令回退到上一次提交。
git reset --hard HEAD^ //^代表上一个版本
可以看到第三次提交消失,回退到了上一个版本,
使用查看当前工作区,file3文件也消失了。
如果不小心误操作也可以通过git reset回退到操作前的版本。我们使用 reflog 命令查看操作版本。
git reflog
我们可以根据提交ID进行回退。
可以看到我们成功回退到第三次提交的版本。
对比差异
我们可以 diff 命令对比文件或目录的内容在不同版本之间的差异。
git diff
在不添加参数的时候,默认比较的是工作区与暂存区的差异。我们修改一下file3的内容。由空变为git。
可以看到git列出了file3的变化。通过设置参数 --cached 可以比较暂存区与仓库中的差异,如果参数是两个版本的提交ID,比较的则是不同提交之间的差异。 git buff 也可以比较不同分支的差异,这部分会在分支介绍。
删除文件
删除文件有两种方式,第一种直接删除工作区文件更新暂存区再提交到本地仓库。
第二种方法我们可以使用 rm 命令。
git rm 文件名
使用 rm 命令会同时删除暂存区与工作区文件。加上 --cached 参数后 会将文件从暂存区删除,但保留在工作区中。
忽略文件
在提交文件到仓库时有一些文件是不需要被提交的,我们可以设置 .gitignore 配置文件来忽略这些文件。
.gitignore 每行一个模式,用来指定忽略的文件或目录。空白行会被忽略。以 #
开头的行是注释。.gitignore 也支持使用通配符,如 *.log 为忽略所有以 .log 结尾的文件。下面是一些简单的语法。
- 忽略特定目录
build/
- 忽略build
目录及其所有子目录和文件。- 忽略特定扩展名的文件:
*.tmp
- 忽略所有扩展名为.tmp
的文件。- 排除规则:
- 如果你想从忽略中排除某些文件或目录,可以在模式前加上
!
。!important.log
- 不忽略名为important.log
的文件。- 指定特定路径:
dir/*.txt
- 忽略dir
目录下所有扩展名为.txt
的文件。- 忽略所有 .git 文件:
.git/
- 忽略.git
目录下的所有文件。
注意:如果文件已经添加到了仓库,使用 .gitignore 无法忽略。我们简单演示一下。
我们新增了一个dir目录,目录下有一个 hello.c 的文件,同时新增了两个日志文件.log1.log 与 log2.log。我们查看一下本地仓库状态。
可以看到这些新增文件处于未跟踪状态。我们新增 .gitignore 文件,并忽略这些文件。
再次查看仓库状态 ,可以看到指定文件已经被忽略。
ssh配置
下面我们来介绍远程仓库的使用,首先我们需要一个github或者gitee的账号,然后我们需要在本地创建一个ssh的key,因为github/gitee是使用ssh服务进行通讯的。可以使用下面的命令创建一个密匙。
ssh-keygen -t rsa -C "样例"
-t:指定密钥类型,默认是 rsa ,可以省略。
-C:设置注释文字,比如邮箱。
-f :指定密钥文件存储文件名,一般我们默认,让存储到默认路径以及默认文件名
执行命令后git会要求输入生成的sshkey文件名,我们可以回车使用默认文件名
然后会让你输入密码,这里我们输入回车表示空密码,输入密码后,系统会再次要求你确认密码。确认无误后,密钥生成完成。
生成的ssh文件如果不使用-f指定的话会生成在用户目录下的.ssh目录中,.ssh是隐藏文件,可以使用ls -ah看到,使用cd ~进入用户主目录,然后cd进入到.ssh目录中可以看到文件
可以看到.ssh目录生成了很多文件其中,id_rsa与id_rsa.pub是我们刚刚生成的密匙。 id_rsa是私匙,id_rsa.pub是公匙,我们需要打开公钥文件,然后复制公钥中的内容。然后我们打开gitee/github,我这里使用gitee演示,打开账户设置。
选择ssh公匙,接着添加我们的公钥。
接着输入账号密码,我们的ssh就配置成功了。
关联本地仓库与远程仓库
我们这里介绍两种操作,将远程仓库克隆到本地,与关联本地仓库到远程仓库。
将远程仓库克隆到本地
我们在gitee上创建一个远程仓库。
现在我们有了一个远程仓库,我们可以通过 git clone 命令克隆远程仓库到本地。
git clone 仓库地址
可以看到克隆成功后目录下多了一个gitlearn目录,这就是我们克隆下来的远程仓库。
我们在本地仓库中新建一个文件并提交。
可以看到本地仓库多了一个文件,我们再来看看远程仓库,可以看到远程仓库还是空的。
git是一种分布式版本控制系统,我们的本地仓库与远程仓库其实是两个仓库,如果需要将修改同步,我们需要使用 pull 与 push 指令。
git push 将本地仓库的代码推送到远程仓库。
git pull 从远程仓库获取最新版本的代码
我们执行一下push指令。
可以看到本地仓库同步到了远程仓库。
将本地仓库关联到远程仓库
现在我们学习如何将本地仓库关联到远程仓库,首先新建一个仓库。
之前的学习中我们创建了一个 gitlearn 本地仓库,现在我们将这个仓库关联到远程仓库。 我们可以使用以下命令
git remote add 自定义仓库名 仓库路径
简单执行一下命令。
可以看到远程仓库同步了本地仓库的文件与提交信息。 在本地仓库中可以使用以下命令查看本地仓库关联的仓库地址。
git remove -v
分支简介与基本操作
在Git中,分支是管理代码变更的一种方式。每个分支代表一个独立的开发线,你可以在分支上进行开发、测试和修复,而不会影响主分支。
我们可以使用 branch 命令创建一个分支
git branch 分支名
branch 命令也可以显示当前项目所有分支。现在我们创建一个分支 dev。
我们可以使用 switch 命令切换到 dev 分支。
git switch 分支名
现在我们在 dev 分支创建一个文件。主目录中有一个main.txt文件。
我们切换到主分支。 可以看到主分支只有main文件。
合并分支
我们可以使用 merge 将指定分支合并到当前分支。
git merge 分支名
现在我们将 dev 分支合并到 master 分支。
可以看到 dev.txt 文件被合并到了 master 分支。合并后原分支不会消失,需要手动删除。
git branch -d 分支名 //删除已合并的分支
git branch -D 分支名 //强制删除分支
解决合并冲突
当两个分支对同一文件的同一行或段落进行了不同的修改,我们合并时就会发生冲突,需要手动选择合并更改。Git会用<<<<<<<
, =======
, 和 >>>>>>>
标记冲突区域。
我们新建了一个仓库,我们有两个分支,mater分支中 main.txt 文件的内容是 test master ,dev 分支中 main.txt 中内容是 test dev。现在我们合并两个分支。
执行合并命令后合并失败,我们需要手动保留内容,然后提交完成合并。
我们手动提交完成合并。
结语
到这里我们已经完成了git的学习。笔者能力有限,如有错漏之处,欢迎指正。同时很多命令只是讲了基础用法,如果大家想要深入学习可以参考git 官方文档。感谢观看!