柚子快报邀请码778899分享:Linux:git的基础操作

http://yzkb.51969.com/

git的下载

版本控制系统一般分为两种,集中式版本控制系统,分布式版本控制系统

什么是集中式版本控制系统:版本库集中存放在中央服务器,工作时候使用自己的电脑,当工作时候在中央服务器上拉取最新版本的代码,然后开始工作,工作完成之后,将自己编写完的代码再推送给中央服务器。

他的缺点也显而易见,当中央服务器宕机时全部的工作就无法再去进行,而且无法确保每个人的网络速度都很快,拉取推送代码会很慢浪费大量时间。(比较有代表性的是:svn,svc等)

什么是分布式版本控制系统:我们的每个主机设备就是一个完整的版本库,我们可以直接在我们本地进行工作,也不用网络,当我们多人协作的时候,只需要相互推送一下代码,这样就可以看到各自的内容

分布式是目前比较热门的一种方式,优点就是不用连接网络确保了我们工作时候只需要在本地,即使是多人协作,他的速度也是非常快的。

缺点就是,可能在本地储存需要大量的储存,在数据方面需要大量的维护

(在线分布式库也有很多:github,gitlab,gitee)

什么是git:git是一个开源的分布式版本控制系统,开源有效,快速的对很小到非常大的项目版本进行管理

下载git

访问官网:

Git - 安装 Githttps://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

 

在这里选择下载的平台版本 

这里下载的gui界面

Gui界面也涵盖了各个平台的

初始化操作

git -v

 # 可以看到git版本

再使用git之需要先去配置一下用户名和邮箱

git config --global user.name 'tarro'

--global : 全局配置对所有仓库生效,如不加这个参数则只对当前仓库生效

--system : 系统配置,对所有用户生效(这个是系统级别配置,一般不使用,一般使用global)

(  其实用户名为tarro其实可以不用’’引起来 如果是kali tarro 中间有空格 那就一定需要’’ ,如果没有空格的情况下去掉空格也是可以的  )

配置完用户再来配置一下邮箱

git config --global user.email 123@qq.com

由于邮箱中间是没有空格的这里可以直接省略引号

git config --global credential.helper store   

保存一下用户名和密码这样就不用每次都输入了

git config --global --list

可以使用该命令去查看一下刚刚写入的内容

 

创建初始本地仓库

创建仓库一般有两种方式

在本地进行管理

git init

克隆远程仓库

git clone

创建本地仓库

git init

该命令直接把当前所在目录变成git的仓库

可以看到我们执行了该命令之后我们的目录后面就有提示一个master的标识

使用ls -a 还可以看到一个隐藏文件.git的文件,这个不可以进去删除,如果删除了里面的东西就可以造成git结构的破坏

如果我直接把.git这个目录删除那么这个目录也不在是master

还可以在git init 后面通过路径的方式去创建git仓库

git init my-git

我们这个就是在当前目录下生成一个git仓库,git init可以写相对路径,也可以写绝对路径

克隆远程仓库 

git clone git@github.com:KALItarro/git.git

这样就把我github上的仓库克隆到本地了

 

 

Linux搭建本地仓库

我准备了两个Linux,一个Windows,分别为

1.centos7   ip: 192.168.6.1    git主服务器

2.centos7   ip: 192.168.6.2    客户端

3.windows10 ip:192.168.6.254   客户端

我分别在Linux和Windows中都安装了git工具

先去搭建Linux的主服务器,在第一台6.1服务器上

去创建一个用户

useradd -m git

echo git:123 | chpasswd

让后切换到这个角色中

su - git

mkdir git && cd git

先去创建一个目录

git init --bare

直接创建一个裸模板库,就是不放在隐藏目录里,直接放目录里

现在就不需要去配置别的了,到第二台6.2服务器上操作即可

我先做个ssh免密,如果不做也是可以的,只不过每次远程操作都要输入密码

在6.2服务器上

ssh-keygen -t rsa

让后一直回车

ssh-copy-id git@192.168.6.1

输入yes然后输入git的密码123即可

先去创建一个名为git的文件夹(不是git也可以)

再去把项目克隆下来

git clone git@192.168.6.1:/home/git/git

由于我们还没在这个里面做任何配置,所以空的是正常的

再次进入刚刚克隆的git目录

创建一个1.html内容为1

echo 1 > 1.html

可以看到刚刚添加的一个,现在我将他添加到暂存区

git add .

这样就添加进去了

git status

可以查看做的操作

让后保存到本地

git commit -m '第一次修改'

-m是注释

下面这报错是没有写用户名和邮箱,设置一下就行

补充完之后再推送即可

git push origin master

推送成功,现在我们把git目录删除,再重新拉取一下就行

这样的话就保存进仓库了,后期做出了修改等操作都可以重新推送

这些就是linux上的一些操作

现在去win10上通过git自带的gui进行一次提交,windows上的git命令也是和Linux上一样的

 

然后多次输入密码

让后就成功连接并且克隆到本地了

我在做个目录中添加一个文件名为321

点击一下rescan就可以看到刚刚做出的操作了

然后依次向下点,分别是放到暂存区,写入本地,推送到服务器

当我们点击了push的时候,如果你没有写你的user名称和邮箱就会弹窗让你写,只需写完重新推送即可

现在我去Linux上拉取一下看看

也可以看到321,这样就同步成功了

工作区域和文件状态

git的工作区域主要分为3个:工作区,暂存区,本地仓库

git的文件一共有4种状态:未跟踪 ,未修改,已修改,已暂存

git init #创建本地仓库

git status #查看仓库状态

git add #添加到暂存区域

git commit #提交

上一节我已经创建了一个本地仓库

我在这创建了一个文件,再使用status去查看发现他是一个未跟踪的一个状态

我使用

git add file1.txt

他现在就是暂存区的了,再去放到本地仓库,他放本地仓库他只会放暂存区域的,我这里再创建一个文件

可以看到新文件没有放到暂存区域,所以等会提交并不会

git commit -m "第一次提交"

 如果不加-m会进入vim的交互模式写入介绍

可以到第一个文件已经不存在了,因为他只会提交在暂存区中的文件

还能通过通配符去匹配内容

我这里创建了几个文件在这个目录里,都是未跟踪状态 

git add *t

或者使用

git add .

将这个目录下所有的对象放到暂存区

 

这次使用

git commit

进行提交,会进入到vim的编辑模式

把介绍写在最上面

可以看到提交过后没有再提交的内容了 

使用

git log

查看提交的历史记录

还可以使用 

git log --oneline

查看简洁的更新内容

reset 版本回退

当需要回退版本的时候  就 使用 git reset 进行版本的回退,可以回退到某次的提交那次

reset 有三种用法 也是就是在后面加上三种参数

git  reset --soft   # 也就是保留工作区和暂存区的内容

get reset --hard  # 也就是丢弃工作区和暂存区的内容

get reset --mixed # 介于上面两者之间,他会保存工作区的东西但是不会保存暂存区的东西

mixed也是reset的默认参数

soft

这里我直接创建几个文件

然后将这个目录复制出来三个

一个目录演示一个操作

先进入到soft中演示一下soft的效果

可以看到我当前没有进行恢复,所以他里面没有要更新的东西,我把他恢复成第二次的记录,不出意外的话再去查看,他应该显示有个3.txt没有暂存,因为当时做第二个快照的时候没有第三个,他也不会去清除第三个,所以他肯定有一个3.txt的没有记录 

 

使用他前面的数值进行恢复一下

git reset --soft 93919bd

 

这样就恢复成功了,可以看到他保留了暂存区

 hard

进入git-hard/目录

可以直接使用HEAD^恢复到上一次快照

git reset --hard HEAD^

可以看到工作目录和暂存区都没有东西了

mixed

最后再去看一下mixed参数

切换到mixed工作目录之后,直接执行

git reset HEAD^

然后查看一下提交历史

可以看到他并没有保存暂存区

操作回溯

在实际操作中我们一般都是使用的,soft和mixed    , hard很少使用,他可能会造成误删除的效果,但是误删除了问题也不大,因为所有操作都是可以进行回溯的

我们再回到hard目录中

使用

git reflog

查看一下操作的历史记录

 

git reset --hard 6892b0f

就直接恢复到指定的步骤了        

diff查看差异

git diff 用于查看差异

可以查看工作目录差异,暂存差异,分支差异等

 

我准备了3个文件,分别是1,2,3.txt   每创建了一个文件夹都进行了一次备份

我直接去更改一下3.txt文件内容

然后使用

git diff

可以看到他的一个改动信息

默认的是工作区和暂存区进行一个比较

可以使用git add .暂存区同步一下

查看工作区和版本库之间的差异 

git diff HEAD

查看暂存区和版本库之间的差异 

git diff --cached

 还可以进行版本之间的比较

只用前面的数值比较即可 

git diff 3854b95 07f5c66

比较上一次提交的版本和当前的提交版本之间的变化

git diff HEAD~ HEAD

 git diff HEAD^ HEAD也是一样的

git diff HEAD~2 HEAD

 就表示之前的两个版本

git diff 3.txt

也可以针对某个文件查看差异内容

git diff 查看分支差异的话直接加上分支的名称就可以了

从版本库中删除文件

有两种办法一种直接在工作目录中删除再同步  一种直接在版本库删除

但是暂存区中的3.txt还没被删除掉

再去更新一下暂存区

发现3.txt没了,这种办法十分的低效

可以直接使用git rm命令去删除

他会把本地工作区和暂存区的都删除掉

 如果不想删除本地的话可以在后面加上--cached

git rm --cached 文件名

 

忽略文件

忽略文件就是不应该加入到版本库中的文件

只要在.gitignore中列出要忽略的清单,他就不会去提交到仓库中

现在我创建了两个log文件

我现在不想把access.log提交到仓库中,我可以这样做

echo access.log > .gitignore

再去提交一下

发现access.log成功被隐藏

我们也可以使用通配符进行配置

我直接编辑.gitignore这个文件

意思是所有log后缀的文件都不上传

现在一切以.log结尾的文件都不上传了

因为刚刚已经上传过了,虽然还有他,但是我现在对other.loh插入一些数据看看 

可以看到他还是会进行记录的,因为他有个前提就是必须是先在.gitignore里写要忽略的文件

如果我已经提交上去了再去进行忽略就是无效的

这时通过git rm命令删除一下就行

 

git rm --cached other.log

此外还可以对整个目录进行忽略

这个就是对整个temp进行忽略

他是支持一些简单的Linux中正则表达式的

这就是一个简单的案例

管理远程仓库

创建好github账户之后创建一个新的仓库

 

创建好仓库等会在下一步,想克隆远程仓库进行工作必须要先进行ssh密钥的认证 

windows上生成ssh密钥 

ssh-keygen -t rsa

一直回车

再去c盘下找到你的用户目录里 

有个.ssh的目录里面id_rsa.pub 内容就是我们需要的密钥

里面这串就是密钥

 Linux下获取密钥

 ssh-keygen -t rsa

一直回车

这个就是密钥

将密钥放入github

然后回到仓库中

点击ssh

然后回到我们设备上

克隆到本地

git clone git@github.com:KALItarro/git.git

不要写我的地址,后面要写你的仓库地址

我这里创建了一个文件,加到了缓存区,又进行了提交,最后推送到github上

现在我到github上看一下

可以成功看到内容了推送成功

关联本地仓库

上一节展示了将仓库克隆下来再进行同步

这次要展示的是将本地已有的仓库推送到公网仓库上

再去创建一个github仓库

然后我在本地创建了一个仓库

我再把他进行暂存,再提交一下本地就可以进行下一步了

复制一下仓库地址

git remote add origin git@github.com:KALItarro/git1.git

git branch -M main

git push -u origin main

这就成功的传上来了   push 是上传   pull是拉取

上传是把本地的数据上传上去,也就是让仓库和本地的进行同步

拉取就是让本地的仓库和github仓库进行同步

我去github里修改一下东西

现在我创建的100个文件都是空文件,我现在在github的在线仓库中的66文件中写入一下东西

 

再到本地进行拉取

 可以看到文件内容被拉取下来了

他拉取下来的内容会被合并,当本地也有同样的文件可能会导致合并失败

还可以用fetch他不会去进行合并

git分支的管理

git的仓库默认是main

使用命令

git branch

可以看到目前就一个main分支

我现在创建3个文件,每创建一个提交一次

我这里使用的GitKraken可以看到每次提交的一个过程

创建分支

现在我创建一个名为dev的分支

git branch dev

现在就可以看到dev分支了,再去进入分支

进入分支

git checkout dev

使用checkout也是可以进入分支的,但是checkout他是可以恢复文件,有些情况下当文件名和分支名称重复了之后,再去使用checkout恢复,他只会先去切换分支

官方因为这个操作,又出了个switch他和checkout都是可以进行切换分支,但是switch是专门用来切换分支的

git switch main

我再切换回dev

git switch dev

 我再到dev分支下创建一些文件,并提交

 再切换回main分支

git switch main

 

可以看到dev里的和main的不同步所以他们互不干扰

合并分支

我现在在main里 想把dev的内容合并到main里  

git merge dev

如果想把main的合并进dev里的话,需要先切换到dev里然后执行 git merge main

可以看到现在dev合并过来了

git log --graph --oneline --decorate --all

可以看到合并的情况

删除分支

当我合并完分支之后 

发现dev分支依然存在

分支必须要进行手动删除

git branch -d dev

-d是删除已合并的分支,无法删除未合并的

-D是强制删除,都可以删除

解决合并分支冲突

我先在main分支的main内容为1

我切换到feach分支中去修改main1中的内容并且去提交

git switch feach

再去提交,再换回main分支也去修改main1的文件内容

也是去提交,再进行合并,由于都是在一个文件同样的位置,所以合并就报错

git merge feach

可以看到已经报错了

git diff

可以看到具体的内容

main1中成这样的,我们再这里进行合适的调整之后,再去提交就自动进行合并了

合并成功了

如果想终止合并的话可以使用

git merge --abort

柚子快报邀请码778899分享:Linux:git的基础操作

http://yzkb.51969.com/

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: