我们开发的项目,也需要一个合适的版本控制系统来协助我们更好地管理版本迭代,而Git正是因此而诞生的(Git 是一位顶级大佬在一怒之下只花了2周时间用C语言开发的)
首先我们来了解一下 Git 是如何工作的:
可以看到,它大致分为4个板块:
它是一个分布式的控制系统,因此一般情况下我们每个人的电脑上都有一个本地仓库,由大家共同向远程仓库去推送版本迭代信息。
①首先请前往Git官网去下载最新的安装包:https://git-scm.com/download/win
②接下来,就按它的默认配置进行安装。。。
③安装完成后,在桌面鼠标右键,选择 Git Bash Here
打开,然后设定用户名和邮箱来区分不同的用户:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 可以查看配置好的信息
git config --global -l
①我们可以将任意一个文件夹作为一个本地仓库,并在该文件夹中Git Bash Here
打开,输入:
git init
输入后,会自动生成一个.git
目录,注意这个目录是一个隐藏目录,而当前目录就是我们的工作目录。
②创建成功后,我们可以查看一下当前的一个状态,输入:
git status
如果已经成功配置为Git本地仓库,那么输入后可以看到:
这表示我们还没有向仓库中提交任何内容,也就是一个空的状态。
回到目录…
接着我们来看看,如何使用 git 来管理我们文档的版本。
①我们在本地仓库的工作目录中创建一个 hello.txt 文本文档,接着输入:
git status
其中Untracked files
是未追踪文件的意思,也就是说,如果一个文件处于未追踪状态,那么 git 不会记录它的变化,始终将其当做一个新创建的文件。
②这里我们将其 添加到暂存区,那么它会自动变为被追踪状态:
git add hello.txt # 也可以 add . 一次性添加目录下所有的
再次查看当前状态:
现在文件名称的颜色变成了绿色,并且是处于Changes to be committed
下面,因此,我们的 hello.txt 现在已经被添加到暂存区了。
③提交到 Git 本地仓库中
git commit -m '提交时的描述'
④我们可以查看提交记录:
git log
git log --oneline #一行简化
git log --graph #图形化输出
回到目录…
①我们的文件发生变更后,如何提交:
git status #可以先查看一下状态
git add hello.txt #添加到暂存区
git commit -m '第一次变更'
或者,此策略只适用于修改后文件,不适用于新建的文件(未追踪)
git commit -a -m '再一次变更'
②我们还可以查看最近一次变更的详细内容:
git show [也可以加上commit ID查看指定的提交记录]
再次查看当前状态,已经是清空状态了:
接着我们来查询一下提交记录,可以看到一共有两次提交记录:
③我们可以创建一个.gitignore
文件来确定一个文件忽略列表,忽略列表中的文件存在且不被追踪。
# 这样就会匹配所有以txt结尾的文件
*.txt
# 虽然上面排除了所有txt结尾的文件,但是这个不排除
!666.txt
# 也可以直接指定一个文件夹,文件夹下的所有文件将全部忽略
test/
# 目录中所有以txt结尾的文件,但不包括子目录
xxx/*.txt
# 目录中所有以txt结尾的文件,包括子目录
xxx/**/*.txt
回到目录…
当我们想要回退到过去的版本时,就可以执行回滚操作。执行后,可以将工作空间的内容恢复到指定提交的状态:
git reset --hard commitID
执行后,会直接重置为那个时候的状态。再次查看提交日志,我们发现之后的日志全部消失了。
那么要是现在我又想回去呢?我们可以通过查看所有分支的所有操作记录:
git reflog
回到目录…
①查看当前仓库中存在的所有分支:
git branch
我们发现,默认情况下是有一个master分支的,并且我们使用的也是master分支,一般情况下master分支都是正式版本的更新,而其他分支一般是开发中才频繁更新的。
②创建一个新的分支:
git branch test
# 对应的删除分支是
git branch -d test
现在我们修改一下文件,提交,再查看一下提交日志:
git commit -a -m 'branch master commit'
通过添加 -a 来自动将未放入暂存区的已修改文件放入暂存区并执行提交操作。查看日志,我们发现现在我们的提交只生效于 master 分支,而新创建的分支并没有发生修改。
③切换分支:
git checkout test
我们会发现,文件变成了此分支创建的时的状态,也就是说,在不同分支下我们的文件内容是相互隔离的。
④查看所有分支日志:
git log --all --graph --oneline
回到目录…
①将 test 分支内容合并到 master 分支上
# 先切回 master 分支
git checkout master
# 合并命令
git merge test
如果同一文件发生了冲突,会有如下提示:
我们可以查看一下是哪里发生了冲突:
git diff
因此,现在我们将 master 分支的版本回退到修改 hello.txt 之前或是直接修改为最新版本的内容,这样就不会有冲突了,接着再执行一次合并操作,现在两个分支成功合并为同一个分支。
除了直接合并分支以外,我们还可以进行变基操作,它跟合并不同,合并是分支回到主干的过程,而变基是直接修改分支开始的位置,比如我们希望将 test 变基到 master 上,那么 test 会将分支起点移动到 master 最后一次提交位置:
git rebase master
变基后,test 分支相当于同步了此前 master 分支的全部提交。
我们还可以选择其将他分支上的提交作用于当前分支上,这种操作称为 cherrypick:
git cherry-pick <commit id>:单独合并一个提交
这里我们在 master 分支上创建一个新的文件,提交此次更新,接着通过 cherry-pick 的方式将此次更新作用于 test 分支上。
回到目录…
虽然前面我们基本讲解了git
的命令行使用方法,但是没有一个图形化界面,始终会感觉到很抽象,所以这里我们使用IDEA来演示,IDEA内部集成了git模块
,它可以让我们的git版本管理图形化显示,当然除了IDEA也有一些独立的软件比如:SourceTree
(挺好用)
回到目录…
远程仓库实际上就是位于服务器上的仓库,它能在远端保存我们的版本历史,并且可以实现多人同时合作编写项目,每个人都能够同步他人的版本,能够看到他人的版本提交,相当于将我们的代码放在服务器上进行托管。
远程仓库有公有和私有的,公有的远程仓库有GitHub
、码云Gitee
、Coding
等,他们都是对外开放的,我们注册账号之后就可以使用远程仓库进行版本控制,其中最大的就是GitHub,但是它服务器在国外,我们国内连接可能会有一点卡。私有的一般是GitLab
这种自主搭建的远程仓库私服,在公司中比较常用,它只对公司内部开放,不对外开放。
下面我们以 GitHub 为例进行讲解:
①我们先创建一个自定义的远程仓库
②创建本地仓库,并将工作目录的内容提交到本地仓库。
git init
git add .
git commit -m '初始化提交'
③我们将本地仓库中的内容推送到远程仓库
# git remote add 远程仓库名称 远程仓库地址
git remote add origin https://github.com/WangShaoyu01/GitStudy.git
# git push 远程仓库名称 本地分支名称[:远端分支名称]
git push origin master
注意: push后面两个参数,一个是远端名称,还有一个就是本地分支名称,但是如果本地分支名称和远端分支名称一致,那么不用指定远端分支名称,但是如果我们希望推送的分支在远端没有同名的,那么需要额外指定。
推送前需要登陆账户,GitHub 现在不允许使用用户名密码验证,只允许使用个人
AccessToken
来验证身份,所以我们需要先去生成一个Token
才可以。
生成步骤: 个人头像 -> settings -> Developer settings -> Personal access tokens -> Generate new token -> 勾选 repo、gist、user -> 得到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
当然,我们也可以使用 SSH 来实现一次性校验,我们可以在本地生成一个rsa公钥:
ssh-keygen -t rsa
cat ~/.ssh/github.pub
接着我们需要在 GitHub 上上传我们的公钥,当我们再次去访问 GitHub 时,会自动验证,就无需进行登录了。
报错:
fatal: unable to access 'https://github.com/WangShaoyu01/GitStudy.git/': OpenSSL SSL_read: Connection was reset, errno 10054
产生原因:一般是这是因为服务器的 SSL 证书没有经过第三方机构的签署,所以才报错
解决办法:解除 ssl 验证后,再次 git 即可
git config --global http.sslVerify false
推送后,我们发现远程仓库中的内容已经与我们本地仓库中的内容保持一致了,注意,远程仓库也可以有很多个分支。
④我们也可以将远端和本地的分支进行绑定,绑定后就不需要指定分支名称了:
git push --set-upstream origin master:master
git push origin
回到目录…
如果我们已经存在一个远程仓库的情况下,我们需要在远程仓库的代码上继续编写代码,这个时候怎么办呢?
我们可以使用克隆操作来将远端仓库的内容全部复制到本地:
# git clone 远程仓库地址
git clone https://github.com/WangShaoyu01/GitStudy.git
这样本地就能够直接与远程保持同步。
在 N 个人协作写代码的情况下,必然会出现每个人本地仓库 和 远程仓库 不一致的情况,这样直接提交就会出错!
如果远程仓库中的提交和本地仓库中的提交没有去编写同一个文件,那么就可以直接拉取,拉取后会自动进行合并,合并完成之后我们再提交即可。
但是如果两次提交都修改了同一个文件,那么就会遇到和多分支合并一样的情况,在合并时会产生冲突,这时就需要我们自己去解决冲突了。
所以应该这样操作:
# 抓取:只获取但不合并远端分支,后面需要我们手动合并才能提交
git fetch origin
# 合并:在我们的 master 分支进行合并操作
git merge origin/master
# 推送
git push origin
或者
# 拉取:获取 + 合并
git pull origin
# 推送
git push origin
①先从远程仓库抓取内容,因为此时仓库中可能存在新的内容
②此时我们需要手动合并。现在在我们的 master 分支进行合并操作
③最后我们再把合并后的内容推送到远程仓库
如果工作中存在不协调的地方,比如现在我们本地有两个仓库,一个仓库去修改 hello.txt 并直接提交,另一个仓库也修改 hello.txt 并直接提交,就会出现错误:
一旦一个本地仓库推送了代码,那么另一个本地仓库的推送会被拒绝,原因是当前文件已经被其他的推送给修改了,我们这边相当于是另一个版本,和之前两个分支合并一样,产生了冲突,因此我们只能去解决冲突问题。
回到目录…
总结:
提示:这里对文章进行总结:
本文是对 Git 的学习,了解了Git的工作流程,学习了Git本地仓库的添加、提交和回滚,分支的创建、合并和变基,以及连接远程仓库并且抓取、拉取和推送。还有Git在IDEA中的用法。之后的学习内容将持续更新!!!