概述
Git 是一个免费且开源的分布式版本控制系统,被广泛用于软件开发中的代码版本控制。通过使用 Git,开发者可以高效地追踪文件的变化历史,并支持多人协作开发。本教程将带你快速了解 Git 的基本概念和操作,帮助你开始使用 Git 管理你的项目。
安装 Git
在开始之前,你需要安装 Git。访问 Git 官方网站 下载并安装适用于你操作系统的 Git 版本。安装完成后,可以通过命令行输入 git --version
来验证是否安装成功。
安装完成后,需要设定用户名和邮箱来区分不同的用户:
git config --global user.name "sqm"
git config --global user.email "email@example.com"
然后通过下面的命令查看
git config --global -l
基本命令介绍
创建本地仓库
我们可以将任意一个文件夹作为一个本地仓库,输入:
git init
输入后,会自动生成一个**.git
**目录,注意这个目录是一个隐藏目录,而当前目录就是我们的工作目录。
创建成功后,我们可以查看一下当前的一个状态,输入:
git status
如果已经成功配置为Git本地仓库,那么输入后可以看到:
这表示我们还没有向仓库中提交任何内容,也就是一个空的状态。
添加和提交
接着我们来看看,如何使用git来管理我们文档的版本,我们创建一个文本文档,随便写入一点内容,接着输入:
git status
其中Untracked files是未追踪文件的意思,也就是说,如果一个文件处于未追踪状态,那么git不会记录它的变化,始终将其当做一个新创建的文件,这里我们将其添加到暂存区,那么它会自动变为被追踪状态:
git add hello.txt
#也可以 add . 一次性添加目录下所有的
添加之后,再查看当前状态:
现在文件名称的颜色变成了绿色,并且是处于Changes to be committed下面,因此,我们的hello.txt现在已经被添加到暂存区了。
接着我们来尝试将其提交到Git本地仓库中,注意需要输入提交的描述以便后续查看,比如你这次提交修改了或是新增了哪些内容:
git commit -m 'Hello World'
如果是提交被修改的文件是可以直接提交的,可以不用先添加再提交
git commit -a -m "Modify second"
接着我们可以查看我们的提交记录:
git log
git log --oneline #简化输出
git log --graph #以图像的方式输出
再次查看当前状态,已经是清空状态了:
接着我们可以尝试修改一下我们的文本文档,由于当前文件已经是被追踪状态,那么git会去跟踪它的变化,如果说文件发生了修改,那么我们再次查看状态会得到下面的结果:
也就是说现在此文件是处于已修改状态,我们如果修改好了,就可以提交我们的新版本到本地仓库中:
git add .
git commit -m 'Modify Text'
我们还可以查看最近一次变更的详细内容:
git show [也可以加上commit ID查看指定的提交记录]
# 如果不带 commit ID 默认查看的是最新一次的记录
下面这个就是 commit ID
我们可以创建一个 .gitignore
文件来确定一个文件忽略列表,如果忽略列表中的文件存在且不是被追踪状态,那么git不会对其进行任何检查:
# 这样就会匹配所有以txt结尾的文件
*.txt
# 虽然上面排除了所有txt结尾的文件,但是这个不排除
!666.txt
# 也可以直接指定一个文件夹,文件夹下的所有文件将全部忽略
test/
# 目录中所有以txt结尾的文件,但不包括子目录
xxx/*.txt
# 目录中所有以txt结尾的文件,包括子目录
xxx/**/*.txt
回滚
当我们想要回退到过去的版本时,就可以执行回滚操作,执行后,可以将工作空间的内容恢复到指定提交的状态:
git reset --hard [commitId]
执行后,会直接重置为那个时候的状态。再次查看提交日志,我们发现之后的日志全部消失了。
那么要是现在我又想回去呢?我们可以通过查看所有分支的所有操作记录:
git reflog
这样就能找到之前的commitID,再次重置即可。
分支
分支就像我们树上的一个树枝一样,它们可能一开始的时候是同一根树枝,但是长着长着就开始分道扬镳了,这就是分支。我们的代码也是这样,可能一开始写基础功能的时候使用的是单个分支,但是某一天我们希望基于这些基础的功能,把我们的项目做成两个不同方向的项目,比如一个方向做Web网站,另一个方向做游戏服务端。
因此,我们可以在一个主干上分出N个分支,分别对多个分支的代码进行维护。
分支是一种机制,它允许你在仓库中创建独立的开发线。每个分支都是一系列提交的历史记录。通常,main
或 master
分支被认为是主要的开发线,而其他分支则用于开发新功能、修复错误或实验性工作。
创建分支
我们可以通过以下命令来查看当前仓库中存在的分支:
git branch
我们接着来基于当前分支创建一个新的分支:
git branch test
# 对应的删除分支是
git branch -d test
# 强制删除
git branch -D test
现在我们修改一下文件,提交,再查看一下提交日志:
git commit -a -m 'branch master commit'
查看日志,我们发现现在我们的提交只生效于master分支,而新创建的分支并没有发生修改。
我们将分支切换到另一个分支:
git checkout test
然后修改一下 hello.txt 文件的内容,然后提交到 test分支上。我们可以看看当前的分支状态:
git log --all --graph
可以看到 有一个小分叉出现了
合并分支
我们也可以将两个分支更新的内容最终合并到同一个分支上,我们先切换回主分支:
git checkout master
接着使用分支合并命令:
git merge test
会得到如下提示:
在合并过程中产生了冲突,因为两个分支都对hello.txt文件进行了修改,那么现在要合并在一起,到底保留谁的hello文件呢?
我们可以查看一下是哪里发生了冲突:
git diff
因此,现在我们将master分支的版本回退到修改hello.txt之前或是直接修改为最新版本的内容,这样就不会有冲突了,接着再执行一次合并操作,现在两个分支成功合并为同一个分支。
变基分支
除了直接合并分支以外,我们还可以进行变基操作,它跟合并不同,合并是分支回到主干的过程,而变基是直接修改分支开始的位置,比如我们希望将 test 变基到master上,那么 test 会将分支起点移动到master最后一次提交位置:
git rebase master
变基后,test分支相当于同步了此前master分支的全部提交。
优选
我们还可以选择其将他分支上的提交作用于当前分支上,这种操作称为cherrypick:
git cherry-pick <commit id>:单独合并一个提交
使用IDEA版本控制
创建
创建完成之后
这个时候查看一下目录
分析
- 黄色,是在 .gitignore 中选择被排除的文件
- 红色,是未追踪状态的文件
- 白色,代表没有修改
提交
然后点击提交即可
提交之后
回滚
这里选择硬
这里我们可以看一下控制台,观察一下命令
分支
签出分治的作用就是创建分支之后自动切换到test分支,否则就还是master分支
可以观察一下小书签这个logo,表示当前所在的分支
切换分支
合并
远程仓库
远程仓库实际上就是位于服务器上的仓库,它能在远端保存我们的版本历史,并且可以实现多人同时合作编写项目,每个人都能够同步他人的版本,能够看到他人的版本提交,相当于将我们的代码放在服务器上进行托管。
远程仓库有公有和私有的,公有的远程仓库有GitHub、码云、Coding等,他们都是对外开放的,我们注册账号之后就可以使用远程仓库进行版本控制,其中最大的就是GitHub,但是它服务器在国外,我们国内连接可能会有一点卡。私有的一般是GitLab这种自主搭建的远程仓库私服,在公司中比较常用,它只对公司内部开放,不对外开放。
所以,我这里用 码云
远程账户认证和推送
接着我们就可以创建一个自定义的远程仓库了。
创建仓库后,我们可以通过推送来将本地仓库中的内容推送到远程仓库。
git remote add 名称 远程仓库地址
git push 远程仓库名称 本地分支名称[:远端分支名称]
注意 push
后面两个参数,一个是远端名称,还有一个就是本地分支名称,但是如果本地分支名称和远端分支名称一致,那么不用指定远端分支名称,但是如果我们希望推送的分支在远端没有同名的,那么需要额外指定。
推送后,我们发现远程仓库中的内容已经与我们本地仓库中的内容保持一致了,注意,远程仓库也可以有很多个分支。
克隆项目
如果我们已经存在一个远程仓库的情况下,我们需要在远程仓库的代码上继续编写代码,这个时候怎么办呢?
我们可以使用克隆操作来将远端仓库的内容全部复制到本地:
git clone 远程仓库地址
这样本地就能够直接与远程保持同步。
抓取、拉取和冲突解决
我们接着来看,如果这个时候,出现多个本地仓库对应一个远程仓库的情况下,比如一个团队里面,N个人都在使用同一个远程仓库,但是他们各自只负责编写和推送自己业务部分的代码,也就是我们常说的协同工作,那么这个时候,我们就需要协调。
比如程序员A完成了他的模块,那么他就可以提交代码并推送到远程仓库,这时程序员B也要开始写代码了,由于远程仓库有其他程序员的提交记录,因此程序员B的本地仓库和远程仓库不一致,这时就需要有先进行pull操作,获取远程仓库中最新的提交:
git fetch 远程仓库 #抓取:只获取但不合并远端分支,后面需要我们手动合并才能提交
git pull 远程仓库 #拉取:获取+合并
在程序员B拉取了最新的版本后,再编写自己的代码然后提交就可以实现多人合作编写项目了,并且在拉取过程中就能将别人提交的内容同步到本地,开发效率大大提升。
如果工作中存在不协调的地方,比如现在我们本地有两个仓库,一个仓库去修改hello.txt并直接提交,另一个仓库也修改hello.txt并直接提交,会得到如下错误:
一旦一个本地仓库推送了代码,那么另一个本地仓库的推送会被拒绝,原因是当前文件已经被其他的推送给修改了,我们这边相当于是另一个版本,和之前两个分支合并一样,产生了冲突,因此我们只能去解决冲突问题。
如果远程仓库中的提交和本地仓库中的提交没有去编写同一个文件,那么就可以直接拉取:
git pull 远程仓库
拉取后会自动进行合并,合并完成之后我们再提交即可。
但是如果两次提交都修改了同一个文件,那么就会遇到和多分支合并一样的情况,在合并时会产生冲突,这时就需要我们自己去解决冲突了。