Git版本控制器

发布时间 2023-05-24 15:28:02作者: ArMinLi

Git工作图

四个区域和五种状态

四个区域

  • 工作区(Working Area)
  • 暂存区(Stage)
  • 本地仓库(Local Repository)
  • 远程仓库(Remote Repository)

五种状态

  • 未修改(Origin)
  • 已修改(Modified)&未追踪(Untracked)
  • 已暂存(Staged)
  • 已提交(Committed)
  • 已推送(Pushed)

install Git

打开一台虚拟机用来练习git的使用

yum -y install git

常见的 Git 命令

以下都是比较常用的一些git命令

开始一个工作区(参见:git help tutorial)
   clone      克隆一个仓库到一个新目录
   init       创建一个空的 Git 仓库或重新初始化一个已存在的仓库

在当前变更上工作(参见:git help everyday)
   add        添加文件内容至索引
   mv         移动或重命名一个文件、目录或符号链接
   reset      重置当前 HEAD 到指定状态
   rm         从工作区和索引中删除文件

检查历史和状态(参见:git help revisions)
   bisect     通过二分查找定位引入 bug 的提交
   grep       输出和模式匹配的行
   log        显示提交日志
   show       显示各种类型的对象
   status     显示工作区状态

扩展、标记和调校您的历史记录
   branch     列出、创建或删除分支
   checkout   切换分支或恢复工作区文件
   commit     记录变更到仓库
   diff       显示提交之间、提交和工作区之间等的差异
   merge      合并两个或更多开发历史
   rebase     本地提交转移至更新后的上游分支中
   tag        创建、列出、删除或校验一个 GPG 签名的标签对象

协同(参见:git help workflows)
   fetch      从另外一个仓库下载对象和引用
   pull       获取并整合另外的仓库或一个本地分支
   push       更新远程引用和相关的对象

git相关配置

你是谁,你的邮箱是什么。这样就知道是谁提交的代码了

[root@git ~]# git config --global user.name "lemon"              #名字
[root@git ~]# git config --global user.email "lemon_row@163.com"        #邮箱
[root@git ~]# git config --global color.ui true                       #颜色

检查git配置信息

这个 .gitconfig 是在你当前的家目录下的一个隐藏文件

[root@git ~]# cat .gitconfig 
[user]
	name = lemon
	email = lemon_row@163.com
[color]
	ui = true

Git使用案例

勤动手练习或使用,好记性不如烂笔头!

快速提交目录文件至本地仓库

[root@git ~]# mkdir project && cd project    #创建git工作目录
[root@git project]# git init                 #初始化该目录为git本地仓库
初始化空的 Git 版本库于 /root/project/.git/

[root@git project]# ls -a                   #初始化成功后会在该目录下生成一个.git的隐藏目录
.  ..  .git

[root@git project]# touch file{1..3}.txt     #创建三个文件

[root@git project]# ls
file1.txt  file2.txt  file3.txt

[root@git project]# git status               #查看暂存区状态
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	file1.txt
#	file2.txt
#	file3.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

[root@git project]# git add .                #将文件添加到暂存区
[root@git project]# git status               #查看暂存区状态
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#	新文件:    file1.txt
#	新文件:    file2.txt
#	新文件:    file3.txt
#

[root@git project]# git commit -m "NOW 1 add --> file1 file2 file3"        #将其提交至本地仓库
[master(根提交) 75b88ee] NOW 1 add --> file1 file2 file3
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt

[root@git project]# git status
# 位于分支 master
无文件要提交,干净的工作区

文件改名并重新提交至本地仓库

分两种:

使用 git mv 命令(推荐使用)

[root@git project]# git mv file1.txt file.txt     #修改file.txt文件名为file1.txt
[root@git project]# ls
file2.txt  file3.txt  file.txt
  
[root@git project]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	重命名:    file1.txt -> file.txt
#
[root@git project]# git add .
[root@git project]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	重命名:    file1.txt -> file.txt
#
[root@git project]# git commit -m "NOW 2 rename file1 --> file.txt"
[master dbff765] NOW 2 rename file1 --> file.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file1.txt => file.txt (100%)

[root@git project]# git status
# 位于分支 master
无文件要提交,干净的工作区

使用 mv 命令(不推荐使用)

[root@git project]# mv file.txt file1.txt    #修改file1.txt文件名为file.txt
[root@git project]# ls
file2.txt  file3.txt  file.txt

[root@git project]# git status               #查看一下暂存区状态
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add/rm <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	删除:      file.txt
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	file1.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@git project]# git rm file.txt
rm 'file.txt'

[root@git project]# git add file1.txt

[root@git project]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	重命名:    file.txt -> file1.txt
#

[root@git project]# git commit -m "NOW 3 rename file --> file1.txt"
[master 6e97421] NOW 3 rename file --> file1.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file.txt => file1.txt (100%)
 
[root@git project]# git status
# 位于分支 master
无文件要提交,干净的工作区

比对 工作目录文件内容、暂存区文件内容、本地仓库文件内容之间的差异

使用 git diff 命令来 比对 工作目录文件内容 与 暂存区文件内容

使用 git diff --cached 命令来 比对 暂存区文件内容、本地仓库文件内容

1.工作区 file1 内容 与 暂存区 file1 内容比较之间的差异

#给file1.txt文件加点内容 后并 提交到本地仓库
[root@git project]# echo 'aaaaa' >> file1.txt 
[root@git project]# git add .
[root@git project]# git commit -m "NOW 4 read-in file1.txt --> aaaaa"
[master 3485684] NOW 4 read-in file1.txt --> aaaaa
 1 file changed, 1 insertion(+)
 
#给file1.txt文件加点内容 不提交
[root@git project]# echo 'bbbbb' >> file1.txt 
[root@git project]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	修改:      file1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

#工作区与暂存区比较差役
[root@git project]# git diff file1.txt
diff --git a/file1.txt b/file1.txt
index ccc3e7b..be4e668 100644
--- a/file1.txt           #表示变动前的版本
+++ b/file1.txt           #表示变动后的版本
@@ -1 +1,2 @@
 aaaaa
+bbbbb                    #加入的内容

2.暂存区 file1 内容 与 本地仓库 file1 内容比较之间的差异

#将其修改的文件添加到暂存区中
[root@git project]# git add .
[root@git project]# git diff file1.txt
[root@git project]# 这个时候可以看到,工作区 与 缓存区 已经保持抑一致了

#暂存区与本地仓库比较差役
[root@git project]# git diff --cached file1.txt
diff --git a/file1.txt b/file1.txt
index ccc3e7b..be4e668 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1,2 @@
 aaaaa
+bbbbb

#然后将其所有暂存区内容提交至本地仓库
[root@git project]# git commit -m "NOW 5 read-in file1.txt --> bbbbb"
[master fdf30db] NOW 5 read-in file1.txt --> bbbbb
 1 file changed, 1 insertion(+)
[root@git project]# 
[root@git project]# git diff --cached file1.txt
[root@git project]# 此时可以看到,暂存区 与 本地仓库 已经保持抑一致了

理解 git commit 提交操作

可以将其理解为虚拟机的快照功能,简单来说就是每次commit就是相当于对文件做了一次快照。

FQ:知道了commit相当于快照后,那如何得知该文件快照了多少次 都修改了哪些内容呢?

答:使用 git log 或者 git reflog 查看历史的commit快照记录

但是这种查看方式,输出的信息太过多余,我们可以使用 --oneline 选项

#查看历史的git commit快照
[root@git project]# git log
commit fdf30db3870322636d06b79a74ed5feb399213ea      #commit的id编号(唯一的)
Author: lemon <lemon_row@163.com>                    #是谁提交的
Date:   Wed May 20 09:55:33 2020 +0800               #什么时间提交的

    NOW 5 read-in file1.txt --> bbbbb                #提交的信息描述

commit 34856846ee0540482ab21a3df4bf821dd2329961
Author: lemon <lemon_row@163.com>
Date:   Wed May 20 09:51:53 2020 +0800

    NOW 4 read-in file1.txt --> aaaaa

commit 2b1c545d923502f1bfd20c25a3f58ff8519a44f0
Author: lemon <lemon_row@163.com>
Date:   Wed May 20 09:50:12 2020 +0800

    NOW 3 rename file --> file1.txt

commit 0c943fc2c68773efea85a0ed0a26dcfbf973e351
Author: lemon <lemon_row@163.com>
Date:   Wed May 20 09:49:20 2020 +0800

    NOW 2 rename file1 --> file.txt

commit 75b88eeb1dc16a54b6da9419f5d8e872b900df0e
Author: lemon <lemon_row@163.com>
Date:   Wed May 20 09:46:46 2020 +0800

    NOW 1 add --> file1 file2 file3
(END)

##但是这种查看方式,输出的信息太过多余,我们可以使用--oneline选项
[root@git project]# git log --oneline
fdf30db NOW 5 read-in file1.txt --> bbbbb
3485684 NOW 4 read-in file1.txt --> aaaaa
2b1c545 NOW 3 rename file --> file1.txt
0c943fc NOW 2 rename file1 --> file.txt
75b88ee NOW 1 add --> file1 file2 file3

#还有git log -n 的方式,查看最近的n次快照
[root@git project]# git log --oneline -2
c652338 NOW 7 read-in file1 ---> ddddd
f405afa NOW 6 read-in file1 ---> ccccc

git 保存状态后,如何回退

如果使用虚拟机的话,肯定想都不用想,直接还原快照就得了,那么 git 又是如何实现的呢?

1.如果本地工作目录修改文件错误像回退怎么办?【工作目录 与 暂存区的撤销】

#误操作
[root@git project]# > file1.txt

[root@git project]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	修改:      file1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

#丢弃工作区的改动(恢复)
[root@git project]# git checkout file1.txt

[root@git project]# git status
# 位于分支 master
无文件要提交,干净的工作区

[root@git project]# cat file1.txt 
aaaaa
bbbbb

2.工作文件误操作提交至暂存区中该怎么办?

使用 本地仓库 --- 覆盖 --- 暂存区 --- 覆盖 --- 工作仓库
git reset HEAD 文件名

#误操作
[root@git project]# > file1.txt 
[root@git project]# git add .
[root@git project]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	修改:      file1.txt

[root@git project]# git reset HEAD file1.txt     #取消这个暂存区的内容
重置后撤出暂存区的变更:
M	file1.txt

[root@git project]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	修改:      file1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@git project]# git checkout file1.txt

[root@git project]# git status
# 位于分支 master
无文件要提交,干净的工作区

[root@git project]# cat file1.txt 
aaaaa
bbbbb

回滚版本,回滚之前的版本 和 回滚之后的版本

[root@git project]# echo 'ccccc' >> file1.txt 
[root@git project]# git add .
[root@git project]# git commit -m "NOW 6 read-in file1 ---> ccccc"

[root@git project]# echo 'ddddd' >> file1.txt 
[root@git project]# git add .
[root@git project]# git commit -m "NOW 7 read-in file1 ---> ddddd"
[root@git project]# cat file1.txt 
aaaaa
bbbbb
ccccc
ddddd

#比如我就想回退到ccccc的版本(回滚之前的版本)
[root@git project]# git log --oneline
c652338 NOW 7 read-in file1 ---> ddddd
f405afa NOW 6 read-in file1 ---> ccccc            #使用前面第一段commit的id进行回滚操作
fdf30db NOW 5 read-in file1.txt --> bbbbb
3485684 NOW 4 read-in file1.txt --> aaaaa
2b1c545 NOW 3 rename file --> file1.txt
0c943fc NOW 2 rename file1 --> file.txt
75b88ee NOW 1 add --> file1 file2 file3

[root@git project]# git reset --hard f405afa      #回滚
HEAD 现在位于 f405afa NOW 6 read-in file1 ---> ccccc

#查看是否已经回到这个版本
[root@git project]# git rev-parse HEAD
f405afac0930c1feb0ee86cfa8b4c6032afd4b69
[root@git project]# cat file1.txt
aaaaa
bbbbb
ccccc

#但是,有个问题,此时我又想回到ddddd的版本怎么办?(回滚之后的版本)
[root@git project]# git log --oneline    #这次会发现ddddd的版本消失了
f405afa NOW 6 read-in file1 ---> ccccc
fdf30db NOW 5 read-in file1.txt --> bbbbb
3485684 NOW 4 read-in file1.txt --> aaaaa
2b1c545 NOW 3 rename file --> file1.txt
0c943fc NOW 2 rename file1 --> file.txt
75b88ee NOW 1 add --> file1 file2 file3

#答:使用git reflog
[root@git project]# git reflog
f405afa HEAD@{0}: reset: moving to f405afa
c652338 HEAD@{1}: commit: NOW 7 read-in file1 ---> ddddd           #这次就可以找到了
f405afa HEAD@{2}: commit: NOW 6 read-in file1 ---> ccccc
fdf30db HEAD@{3}: commit: NOW 5 read-in file1.txt --> bbbbb
3485684 HEAD@{4}: commit: NOW 4 read-in file1.txt --> aaaaa
2b1c545 HEAD@{5}: commit: NOW 3 rename file --> file1.txt
0c943fc HEAD@{6}: commit: NOW 2 rename file1 --> file.txt
75b88ee HEAD@{7}: commit (initial): NOW 1 add --> file1 file2 file3

[root@git project]# git reset --hard c652338                       #在进行回滚
HEAD 现在位于 c652338 NOW 7 read-in file1 ---> ddddd

[root@lemon project01]# git rev-parse HEAD
c652338f12a5102e9691dce3ecac4f57cf19639e
[root@git project]# cat file1.txt 
aaaaa
bbbbb
ccccc
ddddd

Git 标签的 创建 删除

  • git 标签能起到什么作用?
    • 当git仓库内的数据有改善或功能时,我们经常会打一个类似于软件版本号的tag标签,这样就能通过标签将版本库中的某个版本给记录下来,便于我们后续将特定时期的数据取出来用。
    • 简单来说:标签也是一个版本库的一个快照,他与commit id 是绑定在一起的东西。
  • 为什么要使用git标签?
    • 既然都已经有了commit id了,为什么还要用tag标签?
    • 因为commit的id号不容易使人记忆,所以,使用tag标签就是因为他好记 v1.0.0
    • 绝大部分公司都是基于标签进行对代码版本的管理
  • git 标签的基本使用
#为最新提交的代码创建标签
[root@git project]# git tag -a "v1.0.0" -m "latest"
[root@git project]# git tag             #查看当前分支的所有标签
v1.0.0

[root@git project]# git show --oneline v1.0.0     #查看这个标签是基于哪个commit快照
tag v1.0.0

latest
c652338 NOW 7 read-in file1 ---> ddddd
diff --git a/file1.txt b/file1.txt
index d0bc53a..8dd8367 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,3 +1,4 @@
 aaaaa
 bbbbb
 ccccc
+ddddd


#以指定的commit id 而创建标签
[root@lemon project01]# git log --oneline
c652338 NOW 7 read-in file1 ---> ddddd
f405afa NOW 6 read-in file1 ---> ccccc
fdf30db NOW 5 read-in file1.txt --> bbbbb
3485684 NOW 4 read-in file1.txt --> aaaaa
2b1c545 NOW 3 rename file --> file1.txt
0c943fc NOW 2 rename file1 --> file.txt
75b88ee NOW 1 add --> file1 file2 file3

[root@git project]# git tag -a 'v1.0.1' f405afa -m "NOW 6"
[root@git project]# git tag
v1.0.0
v1.0.1
[root@git project]# git show v1.0.1
tag v1.0.1
Tagger: lemon <lemon_row@163.com>
Date:   Wed May 20 11:16:03 2020 +0800

NOW 6

commit f405afac0930c1feb0ee86cfa8b4c6032afd4b69
Author: lemon <lemon_row@163.com>
Date:   Wed May 20 10:03:44 2020 +0800

    NOW 6 read-in file1 ---> ccccc

diff --git a/file1.txt b/file1.txt
index be4e668..d0bc53a 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,2 +1,3 @@
 aaaaa
 bbbbb
+ccccc

#不小心打错了标签,怎么删除这个标签?
[root@git project]# git tag -d v1.0.1
已删除标签 'v1.0.1'(曾为 608f0e6)

[root@git project]# git tag
v1.0.0

Git 分支

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

创建与合并分支原理

  • 版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即 master 分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

  • 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

  • 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长,当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

  • 你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

  • 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,master指针不变:

  • 假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

  • 所以Git合并分支也很快!就改改指针,工作区内容也不变!

  • 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

常见的分支命令

//创建分支
git branch <name>           #基于当前commit创建test分支。.git/HEAD文件中记录了当前分支名字。

//删除分支
git branch -d test     #删除本地test分支
git branch -D test     #test分支还没有合入当前分支,所以要用-D参数才能删掉。
git push origin --delete test    #删除远程test分支

//查看分支
git branch                       #列出当前分支清单
git branch -v                    #查看各个分支最后一个提交信息
git branch -a                    #查看远程分支和本地分支
git branch --merged              #查看哪些分支被合并
git branch --no-merged           #查看哪些分支未被合并

//融合及切换分支
git merge                        #融合分支
git checkout -b <name>           #创建+切换分支
git checkout                     #切换分支

//拉取分支
git fetch origin                 #同步远程服务器的数据到本地
git checkout -b test origin/test_remote     #将远程分支test_remote拉取下来到本地test分支
git checkout test                #将远程分支test拉取下来到本地test分支
git pull test                    #从远程分支test中checkout下来的本地分支test成为跟踪分支,使用git pull或者git push就会操作到对应的远程分支test

分支的使用演示

创建分支,开发新功能是不能在master分支上开发

[root@git test]# git branch about         #创建about分支
[root@git test]# git branch                  #查看分支

[root@git test]# git checkout about          #切换分支

[root@git test]# git status

[root@git test]# git log         #查看about分支的commit记录

[root@git test]# echo "about us" >> about.html         #在当前分支开发新功能

[root@git test]# git add .
[root@git test]# git commit -m "about"

[root@git test]# git log         #查看about分支的commit记录

[root@git test]# git checkout master          #切换到master分支
[root@git test]# git log                      #查看master分支的commit记录

[root@git test]# git merge about               #在master分支上合并about分支

注意:在公司中可不是这么搞的,因为你不能保证master分支的线路会一直保持在原地,所以一般开发都是先在自己的分支上重新将master分支合并(相当于同步master分支内容),然后在测试有没有问题,没有问题后才会到master分支上将其开发好的分支合并到master上面,然后在删除合并到master的分支

[root@git test]# git log && ls

[root@git test]# git branch test                  #创建test分支
[root@git test]# git checkout test                #切换到test分支进行开发
[root@git test]# echo "test" > test.html
[root@git test]# git add .
[root@git test]# git commit -m "test"

[root@git test]# git checkout master              #切换至master分支
[root@git test]# git branch --merged              #查看已经合并的分支

[root@git test]# git branch --no-merged            #查看未合并的分支

[root@git test]# git branch -D test                #删除test分支

分支冲突示意图

Github远程仓库

GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub

GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、python 等。

对于我们个人的话,GIT服务器并不需要我们搭建,使用github就可以满足我们的需求。官网:https://github.com/

github 登陆

创建远程仓库

  • 说明:

    • code:代码
    • issues:问题
    • pull requests:拉取要求
    • Actions:动作
    • projects:专案
    • Wiki:维基
    • Security:安全
    • lnsights:见解
    • settings:设置
  • 克隆仓库的两种协议:

    • https 协议:如果你这个仓库是私有的,克隆仓库时需要输入用户名 密码
    • ssh协议:需要在github上加入你机器上某个用户的ssh公钥才能使用
  • 常用的git远程仓库命令

    • git remote #查看当前的远程库
    • git remote -v #执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。
    • git remote add [别名] url #添加一个远程仓库
    • git remote rm [别名] #删除远程仓库
    • git push -u origin master #推送本地到远程分支
    • git pull -u origin master #获取最新master代码到本地

使用 github

这里 https 的我就不掩饰了,很简单,这里我使用ssh协议的,而且使用 win10 展示

为用户生成一个ssh的公钥 及 私钥 目录

将其 公钥 拷贝到 github

克隆远程仓库

$ git clone git@github.com:lemonOps/project01.git 

将本地仓库推送至远程仓库

$ git remote add origin git@github.com:lemonOps/project01.git    #添加好推送的仓库地址

$ git  remote  -v              #查看当前的远程仓库

$ echo "# 第一次提交至远程仓库" > README.md

$ git add .

$ git commit -m "NOW 1 add --> README.md"

$ git push -u origin master

回到 github上查看

给此次提交打上标签并再次推送至 github

$ git log --oneline

$ git tag -a "v1.0" 6de1296 -m "标签 1"

$ git tag

$ git show v1.0 --oneline

$ git push -u origin v1.0

git 推送代码的整体过程

创建自己的dev01分支

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git branch dev01

模拟master主分支更新

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ echo "# NOW 2 lemon very good" > lemon.md

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git add .

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git commit -m "NOW 2 add --> lemon.md"
[master 87c2a24] NOW 2 add --> lemon.md
 1 file changed, 1 insertion(+)
 create mode 100644 lemon.md

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git reflog --oneline
87c2a24 (HEAD -> master) HEAD@{0}: commit: NOW 2 add --> lemon.md
94a2b68 (tag: v1.0, origin/master, origin/HEAD, dev01) HEAD@{1}: clone: from git@github.com:devopssss/project01.git

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git tag -a "v2.0" 87c2a24 -m "第二此提交"

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git tag
v1.0
v2.0

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git remote add origin git@github.com:devopssss/project01.git

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git remote -v
origin  git@github.com:devopssss/project01.git (fetch)
origin  git@github.com:devopssss/project01.git (push)

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git push -u origin master

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git push -u origin v2.0

进行dev01分支的开发;(现在这个分支和master上的分支内容是不一致的 !!!)

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git checkout dev01

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ ls
README.md

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ echo "dev01" > dev01.txt

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ ls
dev01.txt  README.md

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ git add .

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ git commit -m "dev01"
[dev01 01996d5] dev01
 1 file changed, 1 insertion(+)
 create mode 100644 dev01.txt

使用git pull 在自己的分支上重新将master分支合并(相当于同步master分支内容),然后在测试有没有问题

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ git pull origin master

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ ls
dev01.txt  lemon.md  README.md

测试没有问题后才会到master分支上将其开发好的分支合并到master上面,然后在删除合并到master的分支

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (dev01)
$ git checkout master

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git merge dev01
Updating 87c2a24..aaed965
Fast-forward
 dev01.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 dev01.txt
 
Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git branch -d dev01
Deleted branch dev01 (was aaed965).

最后在推送至远程仓库

Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git log --oneline
aaed965 (HEAD -> master) Merge branch 'master' of github.com:devopssss/project01 into dev01
01996d5 dev01
87c2a24 (tag: v2.0, origin/master) NOW 2 add --> lemon.md
94a2b68 (tag: v1.0) NOW 1 add --> README.md


Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git tag -a "v3.0" aaed965 -m "标签 3"


Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git push -u origin master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:devopssss/project01.git
   87c2a24..aaed965  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.


Administrator@DESKTOP-HK1R5KR MINGW64 ~/Desktop/project01 (master)
$ git push -u origin v3.0
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 678 bytes | 339.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To github.com:devopssss/project01.git
 * [new tag]         v3.0 -> v3.0

至此,git 的原理以及使用就到此结束。