Git是一个分布式的版本控制系统

版本控制系统(Version Control System),是一个记录一个文件或者若干个文件内容变化,以便于在将来查阅特定版本修订情况的系统,可以以标签管理的功能来达到这一的效果

特点

将文件回溯到之前的某个状态

可以从内容变更中看出,是谁提交的代码除了问题,易于排错

VCS(本地版本控制系统)的迭代:

a。VCS本地版本控制系统

b。集中的版本控制系统(Centrolized Version Control System)

c。分布式版本控制系统(Distributed Version Control System)

Git的特点:

1、只有在提交代码和拉取代码的时候需要网络

2、直接记录快照,而非差异比较

3、所有操作基本在本地

4、Git保证数据完整性

5、Git一般只添加数据

git的运行逻辑

file–>提交暂存区–>提交到本地仓库–>提交到远程仓库

现在来想一个环境,你的windows中某个目录的文件要拖到另一个目录中,当你鼠标点击文件开始拖动时,跟随鼠标的有一个文件的残影,就可以理解为只要你没松鼠标按键,文件一直在暂存区,但也不代表,原始位置就没有文件,当你的鼠标拖到另一个目录中,松开鼠标时,就上传到了本地仓库。远程仓库就只需要上传一下就好了

安装Git

一台4G内存的服务器

yum -y install git

Git本地仓库的基本操作

mkdir /tmp/test  # 创建本地仓库目录
cd /tmp/test/
git init   # 初始化本地仓库
初始化空的 Git 版本库于 /tmp/test/.git/

仓库本地仓库状态

git status
# On branch master
#
# Initial
#
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

创建提交文件

echo "cyj" > cyj.txt
git add cyj.txt # 建立对此文件的跟踪,存储在了暂存区
git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#    新文件:    cyj.txt
#
git commit -m "first"    
# 提交文件,如果没有成功,需要设置用户名和邮箱名,只是为了记录提交这个事是谁干的
git config --global user.email "mupeifeiyi@gmail.com"
git config --global user.name "mupei"
git commit -m "first"  # 再次提交
[master(根提交) ada9f09] first
 1 file changed, 1 insertion(+)
 create mode 100644 cyj.txt

修改文件后在返回之前的状态

git reset HEAD [file] 撤出缓存区

git checkout -- [file] 返回上一次进入缓存区修改之前的内容

echo "pjf" >> cyj.txt   # 修改文件内容
git add cyj.txt  # 提交到暂存区,进行跟踪
git reset HEAD cyj.txt  # 撤出暂存区
git checkout -- cyj.txt  # 返回到之前的内容,仅限于
cat cyj.txt 
cyj

查看提交日志

git log

git log
# 返回信息
commit ada9f094c2e1a98d2c760300da60c3067690b4f8  # 提交ID
Author: mupei <mupeifeiyi@gmail.com>  # 用户密码
Date:   Fri Mar 6 18:08:09 2020 +0800  # 提交时间

    first   # 提交标签

提交ID来进行返回指定的操作

git reset --hard [commit id]

git reset --hard ada9f094c2e1a98d2c760300da60c3067690b4f8
# 返回到产生这个id时,该文件的内容,同时会删除git log中,这个id之后的所有提交过的记录

Git远程仓库

需要注册GItHub的账户,登录进行创建远程仓库

创建新的仓库

image-20200306111327243

指定仓库名称hello,选择必须有权限的才可以提交到这个远程仓库,允许将存储库克隆到计算机上

new_repostory

图中红线部分是你的github新建hello仓库的https地址和ssh地址

hello_repository

如果要给远程仓库进行上传代码或者其他文件,因为我们创建的仓库是私有的,需要在本地记住生成密钥对上传到github上,经过验证才可以成功上传到远程仓库

ssh-keygen   # 生成密钥对
cat /root/.ssh/id_rsa.pub   # 将查看到的公钥复制到github上

登录github进行密钥的相关设置

github_setting

选中SSH并创建新的SSH key

new_SSH_key

将复制的公钥信息粘贴,并为它命名

SSH_key

add成功的界面如图所示

ssh_keys

回到github首页并进入新建的仓库hello

cd_hello

复制该仓库的ssh地址,用来从本机主机上传使用

copy_address

在本地添加远程仓库

git remote add origin git@github.com:mupeifeiyi/hello.git

将本地仓库的测试文件cyj.txt上传到github远程仓库

git push -u origin master  # 第一次上传需要输入yes确认
# 也只有第一次使用-u选项将本地仓库与远程仓库关联
# 将本地master主干的代码上传到刚才创建的origin指定的远程仓库上

可以登录github看到hello仓库中已经上传过的文件

push_success

完整上传到远程仓库的步骤

echo mupei >> cyj.txt   # 修改文件
git add cyj.txt   # 添加到暂存区
git commit -m "third"   # 提交到本地仓库
git push origin master   # 从本地仓库上传到远程仓库

Git仓库克隆

mkdir test1
cd test1
git clone git@github.com:mupeifeiyi/hello.git 
# 地址为远程仓库中生成的,会直接将远程仓库hello中的内容全部克隆到本地中

如果这个时候你在github中操作,将某个文件删除,但是本地不会知道该文件的变动,此时在进行上传push时,会报错,原因是因为数据紊乱,不允许提交到远程仓库了

将远程仓库中的内容拉取到本地,达到同步的效果,现在来模拟一下报错,删除远程仓库中,主干的一个文件

点击仓库中某个文件,删除即可

delete_fiel

将删除操作提交

image-20200306172412689

然后修改或者创建一个文件,尝试上传到远程仓库

echo "feiyi" >> pjf.txt 
git add pjf.txt
git commit -m "pjf"
git push origin master
# 报错
To git@github.com:mupeifeiyi/hello.git
 ! [rejected]        master -> master (fetch first)
error: 无法推送一些引用到 'git@github.com:mupeifeiyi/hello.git'
提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外
提示:一个版本库已推送了相同的引用。再次推送前,您可能需要先合并远程变更
提示:(如 'git pull')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。

解决方法一:git pull

现在直接运行git pull,拉取文件,然后上传

git pull
git push origin master

解决方法二:--force

git push origin master --force

方法二不推荐使用,有时候会使数据不一致

标签管理

tag对于远程仓库来说相当于快照和虚拟机的关系,可以查看不同时候上传代码的内容

git tag查看当前代码仓库已有的标签

一般在git push之后使用git tag [tag_name],然后将标签上传到远程仓库

git tag v1.0.1
git push origin v1.0.1   # 将创建的tag同步到远程仓库

搭配每次git push之后使用

上传之后可以在github看到该标签

see_tag

为了可以区别多个标签的操作,我们来创建多个标签验证

# 重新创建一个测试文件
echo "裴金凤我爱你" >> pjf.txt
git add pjf.txt   # 添加到暂存区
git commit -m "forth"   # 提交到本地仓库
git push origin master  # 从本地仓库上传到远程仓库
git tag v1.0.2   # 为刚上传的文件添加标签
git push origin v1.0.2  # 将标签上传得到github

此时通过git tag也可以看到创建的两个标签

[root@git test]# git tag
v1.0.1
v1.0.2

在github查看两个标签之间的变化

v1.0.1,在添加这个标签之前,只有cyj.txt一个文件

image-20200306160146873

v1.0.2,但是添加第二个标签之前,有上传了pjf.txt文件,一共两个

image-20200306160423791

git rm [file],删除远程仓库的file必须是远程仓库已有的

git rm cyj.txt
git commit -m "delete"  # 提交删除操作
git push origin master  # 将空目录上传到github
git tag v1.0.3  # 为删除的操作创建标签
git push origin v1.0.3  # 将标签上传

该标签下将没有任何文件

分支管理

主干:进入hello远程仓库之后,直接就在hello下,可以看到的所有内容,都在主干中

*在哪,哪个就是当前分支

创建分支git branch [name]

切换分支git checkout [name]

合并master与分支git merge [分支name]

删除分支git branch -d [分支name]

一般代码都是在分支上进行操作,因为不会影响到主干分支的代码情况,最后测试成功合并到主干即可

一个完整的分支举例:

# 比如现在有一个java项目需要做,开发首先要在分支上进行操作
git branch java  # 创建分支java
git checkout java   # 切换到分支java
# 虽然目录还在当前目录,但是对文件的操作后的提交是没有在主干
echo 123456 >> cyj.txt  # 修改项目文件
git add cyj.txt
git commit -m "java"
git push origin java   # 将java分支的内容上传到github

上传完成后,可以在github查看该分支

branch_new

在java分支查看cyj.txt文件

cat cyj.txt 

cyj
mupei
123456

切换回master分支再次查看

git checkout master
cat cyj.txt 

cyj
mupei

可以看出在分支中的任何操作不会影响master主干的数据

当java项目测试完成后要合并到master主干中进行使用

git merge java
# 再次查看文件
cat cyj.txt 
cyj
mupei
123456
# 已经变成了分支中的修改后的内容,之后再进行上传就OK了
git push origin master

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0