Git学习

Git基础操作

1.安装Git

本节主讲Linux上的Git安装

1.1 查看本机是否安装Git

命令:git

[root@admin ~]# git
usage: git [--version] [--help] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [args]

最常用的 git 命令有:
   add        添加文件内容至索引
   bisect     通过二分查找定位引入 bug 的变更
   branch     列出、创建或删除分支
   checkout   检出一个分支或路径到工作区
   clone      克隆一个版本库到一个新目录
   commit     记录变更到版本库
   diff       显示提交之间、提交和工作区之间等的差异
   fetch      从另外一个版本库下载对象和引用
   grep       输出和模式匹配的行
   init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库
   log        显示提交日志
   merge      合并两个或更多开发历史
   mv         移动或重命名一个文件、目录或符号链接
   pull       获取并合并另外的版本库或一个本地分支
   push       更新远程引用和相关的对象
   rebase     本地提交转移至更新后的上游分支中
   reset      重置当前HEAD到指定状态
   rm         从工作区和索引中删除文件
   show       显示各种类型的对象
   status     显示工作区状态
   tag        创建、列出、删除或校验一个GPG签名的 tag 对象

命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见
'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。

出现以上语句则证明Linux系统GIt已经安装完毕

1.2 安装Git

命令:yum install git

安装完成后还需要最后一步设置,设置使用者的名字和E-mail
写法:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

使用了 git config表示这台Linux机器所有的Git库都会使用该配置

2. Git初始操作

2.1 创建版本库

命令:git init

建立版本库的顺序:

  1. 先创建一个目录(文件夹):
mkdir repository
  1. 进到该目录里使用git init
    出现以下语句则证明版本库建立完毕
    多了一个.git目录,这个目录时Git用来管理和跟踪版本库的
 [root@admin repository]# git init
初始化空的 Git 版本库于 /GitDepository/repository/.git/

2.2 把文件添加到版本库

命令:

  1. git add
  2. git commit -m

范例:
流程:
1.我们先创建一个readme.txt文件,必须要放在repository目录下(其子目录也行),一定要放在Git仓库中
在里面随便写入东西
Git is a version control system.
Git is free software.

[root@admin repository]# vi readme.txt

2.用命令git add告诉Git,把文件添加到仓库也就是stage暂存区(下面会说)

[root@admin repository]# git add readme.txt

使用git status查看Git当前状态

[root@admin repository]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#	新文件:    readme.txt
#

3.用命令git commit,将文件提交到仓库,记录版本
-m:后面接说明文字

[root@admin repository]# git commit -m "first version"
[master(根提交) 287645f] first version
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

使用git log查看当前节点之前的版本

[root@admin repository]# git log
commit 287645f971bc8115fa2b2a3c3ba328c3c3b3d834
Author: BunnyDuudu <562139661@qq.com>
Date:   Wed Jul 28 09:09:43 2021 +0800

    first version

3. 文件管理

命令:git status 可以让我们实时掌控库当前的状态

我们往readme.txt当中添加一条新的语句Git is a distributed version control system.
使用git status

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

上面语句告诉我们,我们已经把readme.txt添加到了库当中,并显示了修改了的文件,但是没有进行提交

命令:
如何查看工作区与暂存区,暂存区 与库,工作区与库的不同(三个命令,最好画图说明)

git diff 文件名 (工作区与暂存区的差异)

git diff HEAD 文件名 (查看工作区和库的差异)

git diff --cached 文件名 (暂存区与库的差异)

3.1 文件版本的回退

命令:
git log命令显示从最近到最远的提交日期
最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file

输出信息太多,可以添加--pretty=oneline参数
命令:git log --pretty=oneline

[root@admin repository]# git log --pretty=oneline
553415edfb703fbbc9dd5e07fd4daec5cef00415 Second version
287645f971bc8115fa2b2a3c3ba328c3c3b3d834 first version

553415edfb703fbbc9dd5e07fd4daec5cef00415为版本号

我们现在要将文件从当前版本append GPL,退回上一个版本 add distributed
在Git中,HEAD表示当前版本,HEAD^ 上一个版本,HEAD^^上上一个版本
命令:
git reset --hard

git reset --hard HEAD^后面不能接文件名

[root@admin repository]# git reset --hard HEAD^ readme.txt
fatal: 不能带路径进行硬性重置。
[root@admin repository]# git reset --hard HEAD^
HEAD 现在位于 287645f first version

这时候再查看git log,会发现“Second version”消失了

[root@admin repository]# git log
commit 287645f971bc8115fa2b2a3c3ba328c3c3b3d834
Author: BunnyDuudu <562139661@qq.com>
Date:   Wed Jul 28 09:09:43 2021 +0800

    first version

若退回到某个版本以后,后悔了,我们就可以使用git reflog查看我们用过的每一次命令

[root@admin repository]# git reflog
287645f HEAD@{0}: reset: moving to HEAD^
553415e HEAD@{1}: commit: Second version
287645f HEAD@{2}: commit (initial): first version

可以查看我们使用Git的每一次操作

再使用git reset --hard 版本号ID(不用完全输完,截取一点就可以)

[root@admin repository]# git reset --hard 55341

3.2 工作区,暂存区,分支master

工作区(Working Directory):
Linux系统中电脑上你能看到的目录,就比如先前创建的额repository

版本库(Repository):
版本库中有暂存区(stage)和分支master,还有一个指向分支的HEAD

Git学习

从工作区中使用git add则把工作区中的文件添加到暂存区(stage)中
再使用 git commit则把暂存区中的文件提交到master分支上

查询工作区与暂存区(stage)的关系,工作区与库的关系,暂存区与库的关系
命令:
git diff:工作区与暂存区关系
git diff HEAD:工作区与库关系
git diff --cached:暂存区与库的关系

3.3 撤销修改

  • 情况一:此时文件在工作区中
    将readme.txt修改之后返回,想撤回刚才的修改
[root@admin repository]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	修改:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

命令:
git checkout -- filename 撤销工作区中刚才的修改
撤销前:

[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
GIt tracks changes of files.

撤销后:

[root@admin repository]# git checkout -- readme.txt
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
  • 情况二:此时文件在暂存区中,我们要先把文件从暂存区中撤回,然后在工作区中再进行撤回
[root@admin repository]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	修改:      readme.txt
#

先使用 git reset HEAD filename从stage暂存区中撤回

[root@admin repository]# git reset HEAD readme.txt
重置后撤出暂存区的变更:
M	readme.txt

然后再使用 git checout -- filename

[root@admin repository]# git checkout -- readme.txt
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.

3.4 删除文件

在Linux系统中通常直接使用rm删除文件
rm readme.txt

删除之后,Git知道你删除了文件,工作区和版本库就不一致了
使用git status会告诉你什么文件发生了更改

git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

此时有两种情况

  • 情况一:
    确实要删除版本库中的文件:
    使用git rm filename删掉,并且git commit
$ git rm readme.txt
rm 'readme.txt'

$ git commit -m "remove readme.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
  • 情况二:
    误删除文件
    git checkout -- test.txt
    一键还原

4. 分支控制

4.1 创建分支

命令:
git branch name

创建分支并切换:
git checkout -b name
加上 -b表示创建并切换
等于:
创建分支
git branch name
切换分支
git checkout name

4.2 合并分支

命令:
git merge name

将name分支与当前分支合并

查看分支合并情况:
git log --graph --pretty=oneline --abbrev-commit

4.3 删除分支

命令:
git branch -d name

强制删除一个未进行合并的分支:
git branch -D name

4.4 Bug分支

命令:
git stash:把当前工作区暂存起来
git stash list:查看保存的工作场景
git stash apply stash@{0}:恢复保存的stash
git stash pop:恢复并删除保存的stash场景

范例:创建一个分支,并在分支上修改readme.txt之后使用fast merge与master分支合并

[root@admin repository]# git checkout -b dev
切换到一个新分支 'dev'
[root@admin repository]# git branch
* dev
  master
[root@admin repository]# vi readme.txt 
[root@admin repository]# git add readme.txt
[root@admin repository]# git commit  readme.txt
终止提交因为提交说明为空。
[root@admin repository]# git commit -m "Third test" readme.txt
[dev 03d6b2a] Third test
 1 file changed, 1 insertion(+)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
[root@admin repository]# git checkout master 
切换到分支 'master'
[root@admin repository]# cat readme.txt 
Git is a version control system.
Git is a distributed version control system.
Git is free software.
[root@admin repository]# git merge dev
更新 553415e..03d6b2a
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
[root@admin repository]# git branch -d dev
已删除分支 dev(曾为 03d6b2a)。

范例2:若两个分支都对同一个文件进行了修改,且使用了git commit,分支无法快速合并,那怎么修改?

此时readme.txt文件中为这样

Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
<<<<<<< HEAD
Branch third test.
=======
Branch second test.
>>>>>>> dev
~       

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将不同的内容删除更改,之后在进行git add,git commit就可以完成合并了

范例3:修复Bug
若我们在dev分支上进行操做,已经在dev的工作区上工作了很久,突然要去修改master分支上的bug,该怎么做?

[root@admin repository]# vi readme.txt 
[root@admin repository]# git stash
Saved working directory and index state WIP on dev: bd1c2da conflict fix
HEAD 现在位于 bd1c2da conflict fix

使用git stash保存当前工作区工作状态
切换到需要修改的分支master,创造一个新分支issue-101来辅助修改bug
修改完bug,使用git add,git commit
修改完毕后将两个分支合并,并且删除新分支issue-101

[root@admin repository]# git checkout master
[root@admin repository]# git checkout -b issue-101
切换到一个新分支 'issue-101'
[root@admin repository]# vi readme.txt 
[root@admin repository]# git add readme.txt
[root@admin repository]# git commit -m "fix bug 101"
[issue-101 e74c85b] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 4 个提交。
  (使用 "git push" 来发布您的本地提交)
[root@admin repository]# git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
 readme.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# git branch -d issue-101
已删除分支 issue-101(曾为 e74c85b)。

查看刚才的操作:

[root@admin repository]# git log --pretty=oneline
3a605834a8d719630c534fe1231d676c050e0d6e merged bug fix 101
e74c85b3a0bb50327062c946fb4f4c7c260850ff fix bug 101
bd1c2da9efe53c1187580de8263c26b413f68af9 conflict fix
98a1bca1a0edec0ada07a4d79eec420c9d9947f3 fifth test
ff8cd74f519fc74ef12e3a5ae318e46c9ffe1a81 Fourth test
03d6b2af248d690f1885a5dd374e29d7f57717c6 Third test
553415edfb703fbbc9dd5e07fd4daec5cef00415 Second version
287645f971bc8115fa2b2a3c3ba328c3c3b3d834 first version

删除后bug修复完毕,切换到刚才工作的dev分支,因为刚才把master的bug修改后版本更新了,导致了dev和master版本不同,dev身上的那个bug还没有删除,此时我们可以把master的操作复制到dev上

使用语句:git cherry-pick操作的ID号

[root@admin repository]# git cherry-pick e74c85b3a
[dev 88582ad] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# cat readme.txt 
Git is a version control system.
Git is a distributed version control system.
Git is a free software.
Branch test.
Branch second and third test.

使得readme.txt的数据与master的数据同步

之后便可以使用到我们刚才使用的保存工作区命令
查看刚才保存的工作区:git stash list

[root@admin repository]# git stash list
stash@{0}: WIP on dev: bd1c2da conflict fix

有两种还原方式:
还原不删除保存的数据:git stash apply 可以接保存数据的IDstash@{0}
还原后删除保存的数据:git stash pop 可以接保存数据的IDstash@{0}

[root@admin repository]# git stash pop stash@{0}
自动合并 readme.txt
# 位于分支 dev
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	修改:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (566f2351e65f2b2289295e60b6ea5ee312a68e90)
[root@admin repository]# cat readme.txt 
Git is a version control system.
Git is a distributed version control system.
Git is a free software.
Branch test.
Branch second and third test.
Stash test

完成语句之后,dev分支和master分支里的bug修改完毕,且没有耽误dev的工作

上一篇:Spring Boot中mapper注解的注意事项


下一篇:k8s部署gitlab报错Failed to create repository