Git(版本控制器)
在我们对于文档进行操作的时候,很多时候可能会出现多个文档,对这些文档进行多个版本的保存和记录就变成必要的。通俗的讲,就是记录每次的修改和记录版本迭代的管理系统。目前最主流的版本控制器就是Git。但是git无法知道二进制文件的修改和变化,只能知道大小变化,但是可以知道文本文件每次修改内容。
在Ubuntu中安装Git
通过以下命令查看git的版本:
git --version
首先我们得先卸载好git才能安装。
sudo apt-get remove git -y

接着通过以下命令安装git,输入命令后就会相应下载安装包,接着就安装成功了。
sudo apt-get install git -y
在服务器上创建仓库
在新建的Linux文件夹下创建仓库,通过git init来创建本地仓库。
git init

通过tree .git/来查看文件详情git仓库详情。

新增配置:
在这里我们需要配置自己的名字和邮箱地址:

查看一下配置信息,发现已经配置好了:

同时 我们也可以删除配置项,通过该命令删除:
git config --unset user.name

如果是配置了global选项,那就会使得当前服务器下的所有git仓库都进行配置,而不是就当前仓库。在这里就是把当前名字生效于所有仓库。

想要删除全局生效的配置,像前面加上--global就可以了。不允许在.git文件下进行修改。

在与.git/文件并列的文件中称之为工作区,.git不属于工作区。

stage:暂存区(索引)。
add:将新增的内容存入暂存区。
commit:将暂存区提交到master分支。
Head:一个指针,指向master。
objects:存放了历史版本的数据。
修改的工作区内容会写入对象库,会写入对象库的一个新的git文件中,也就是维护了所有的版本,所有修改的内容都会被管理。
添加文件:

将文件添加入暂存区,并且提交。

也可以进行多次add并且一次性提交到git仓库中。

git追踪管理的其实是修改,而不是文件。
文件撤销修改删除
如果对文件在工作区修改之后,查看文件的状态,文件就会被提示已经修改了。

显示差异:
git diff

通过git diff文件名的形式就可以查看之前暂存区和现在在工作区中的数据不同的地方。
这里的+++文件是修改后,---文件是修改前。

这里的0代表着从0行开始修改到第一行。当我们使用git add后,工作区就和暂存区内容一样了。

当我们commit之后,就可以发现已经没有分支需要提交了,工作区已经干净了。
git diff head
查看工作区和版本库有区别的地方。
版本回退:
git reset --soft --mixed --hard
回退版本库中的内容 ,哪些内容进行回退实际上
- soft:只回退版本库。
- mixed:回退版本库和暂存区。(默认选项)。
- hard:回退所有版本。
实际上hard要慎用,因为hard会回退所有的代码,并且找不回工作区中的代码。


打印日志就会发现已经全部不见了,,但是!这里由于我们打印过之前的版本就可以通过之前版本来再次再次回退。这时候就可以回退代码了。
git relog//记录本地每一次提交
版本回退实际上就是将原本指向旧版本的指针进行修改。

也就是修改master的指针。
撤销修改(工作区中):
比如有这样的情况,在本地工作区发现代码写的很烂,想回复到上个版本。但是只有工作区中有内容。
git checkout-- 文件名

撤销修改(工作区和暂存区):
将当前代码回退到和版本库内容一致的情况,也就是当前版本,就可以回退到当前版本和版本库中的内容保持一致。
git reset HEAD 文件名

将暂存区中的内容进行回退到版本库中的内容一致,然后再将工作区中的内容也进行回退。
撤销修改(全部修改):
远程仓库中没有这一段代码,才可以进行撤销。
git reset --hard HEAD^

删除文件:
如果要删除文件,就要把修改操作添加到暂存区和提交到工作区,这样才能更新后续的数据。这时候在工作区和暂存区和版本库中的文件才会被删除。

但是这里其实是有简化操作的,实际上可以通过两步,就可以完成操作,通过git提供的rm命令,通过git rm就可以删除工作区和暂存区中的数据,再通过commit命令将修改操作提交。

git的分支:
Head指向mastet,master指向最新一次的提交,也就是指向主线,当然了我们也可以创建一些其他的分支然后进行合并。

通过git branch打印现在本地有哪些分支,这里我们只先创建了master分支。

Head指针不仅仅可以指向master分支,也可以指向其他分支,被指向的分支就是当前正在工作的分支,如果正在master上工作,master前面就会有一个*号。
创建新分支
这里我们通过git branch创建一个新的分支dev,可以看到当前dev分支就被创建出来了,

切换分支
通过
git checkout 分支名

这时候head就指向了dev分支,如果想要合并的话,就可以通过merge命令进行合并,如果想要合并到master分支上,就要通过git merge操作进行合并。
合并分支
当我们在dev分支下面进行操作并且add和commit ,这时候切换到master分支后,发现数据不存在了,这就是因为我们没有合并。

当我们合并完其他的分支就可以看到这里的数据就已经同步了。

当然了,前提情况是别的分支已经进行了add和commit操作。

删除分支
删除分支只能在其他分支上面删除,这里我们已经切换到了master分支下面。
git branch -d dev
git上面创建,合并和删除分支很快,所以git鼓励我们使用分支,这样的分支操作和在master上面操作是一样的,但是更加安全。
强行删除
git branch -D
如果已经进行提交操作了,想把分支的内容删掉,就可以使用强制删除的方式删除。
合并分支的冲突

当我们在合并dev1和master的时候git就不知道要保留master的ccc还是dev1的bbb,这里我们将创建以上的环境。
git checkout -b dev1
通过此命令既创建dev1的分支,又切换到dev1的目录下面,这时候再合并就会出现冲突。

打开vim文件,就可以看到以下内容:

第一个是我们当前分支的内容,第二个是dev1分支的内容。但是这里的保留内容由我们自己决定,我们可以打开文件,并且进行删除。merge冲突需要手动解决,并且需要提交。
git --no-ff -m "内容" dev1
不使用fastford模式,并且提交,最好使用no-ff模式,
--no-ff
:禁用快进式合并。在默认情况下,如果当前分支的提交历史是线性的,Git 会使用快进式合并,即直接将当前分支的指针移动到被合并分支的最新提交处,不会创建一个新的合并提交。使用--no-ff
选项后,无论是否可以快进,Git 都会创建一个新的合并提交,这样可以保留分支的合并历史,方便后续查看。
开发人员在dev分支下面进行操作,日常开发环境,在进行测试多次之后,再合并到master主分支之上了。有了分支可以拉取多人的分支,并且进行合并,多人协作。

bug分支
线上环境会部署master主分支的代码,在master上修复如果再修复出一个更大的bug,就会有更加严重的问题。
如果开发到一半发现master线上有bug(开发还没提交),可以先使用git stash进行存储到git中,然后切换到master分支,然后新建并且切换到新的修复分支然后修复后进行merge。再切回开发分支,再通过git stash pop返回开发环境。
建议:最后合并开发的代码和修改bug代码的时候,不要在master上面合并,将dev合并master分支,在dev上面解决冲突后,再在master合并dev分支。
远程仓库
HTTPS

克隆远程仓库从中央仓库中,查看https协议进行克隆。


将远程仓库克隆到本地仓库后进入,会发现.git版本库。


本地仓库和远程仓库的交互就通过push和pull来完成
SSH
要想使用SSH协议,必须要需要把本地公钥放到git服务器上面,个人可以在设置中配置SSH公钥,如果没有配置任何的公钥就会报错。
在用户主目录下面查看有没有.ssh文件,再查看是否已经配置公钥和私钥,
在这里虽然已经有.ssh文件了,但是实际上并没有配置公钥和私钥,以下命令配置公钥和私钥。在.ssh文件中。一路回车就可以创建好了。
ssh-keygen -t rsa -C "1632100162@qq.com"

这里就可以看到已经创建好了这两个文件,打开pub文件,复制其中的内容,就可以拷贝公钥了。也就可以克制远程仓库了。

在本地进行推送。

本地拉取
git pull origin master:master
从远程仓库拉取,并且与本地合并代码,就可以实时更新远端代码。
git配置文件(gitignore)
在日常开发中,有一些文件不想被提交到远端仓库,比如保存了数据库密码的文件,不想让git追踪管理的。但是在初始化我们并没有创建这个文件。

如图就是忽略以.so和.ini结尾的文件。

如果不想被忽略,就在gitignore文件中排除该文件:通过!号的形式。

git标签
可以对下一次提交进行打标签,也可以对已经提交的进行打标签,对某一次的提交进行打标签。

对git标签进行描述,并且可以通过show命令查看详情。

删除git标签:

推送到远程仓库:
一次性推送:
git push 仓库名 --tags
日志:
添加文件的内容的日志:
git log
git log --pretty=oneline
