Git学习笔记

155 阅读11分钟

一、Git简介

1.1.Git是什么

Git是一个用C语言开发的开源分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

1.2.集中式与分布式版本控制系统

集中式版本控制系统:有一个中心服务器所有的文件保存在中央服务器上,要修改内容必须要从中央服务器上拉取文件修改完早推送到服务器上;如果中央服务器如果中央服务器的文件丢失所有都读取不到这个文件。

central-repo

分布式版本控制系统:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

distributed-repo

1.3.Git安装

yum方式安装

yum install -y gti

卸载git

yum remove git

源码编译安装

1.下载源码

源码地址:mirrors.edge.kernel.org/pub/softwar…

yum install -y wget

wget -O /tmp/git-2.21.0.tar.gz https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.21.0.tar.gz

2.解压编译

#安装编译依赖
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

#解压
tar -zxf /tmp/git-2.21.0.tar.gz -C /tmp/

cd /tmp/git-2.21.0

# 检验相关依赖,设置安装路径
./configure --prefix=/usr/local/git

# 编译安装
make && make install

3.配置全局环境变量

# 删除已有的 git
yum remove git

# 配置环境变量
vim /etc/profile

# GIT_HOME
GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin

# 刷新
source /etc/profile

二、本地版本库

2.1.创建版本库

创建账户

由于Git是一个分布式的版本控制系统,所以当利用它进行分工协作时,必须区分不同的机器。这一点可以通过配置机器的名字和邮箱完成。Git初始使用时,也会提示进行配置。

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

在实际的使用过程中,可以将“Your Name”、“email@example”替换为自己实际的名字和邮箱。

版本库又名仓库,英文名repository,就是一个文件夹,这个文件夹内的文件都可以被git管理起来,每个文件的修改删除Git都能跟踪,在任何时候都可以被还原。

创建版本库

mkdir /home/repository
cd /home/repositry

初始化仓库

git init

初始化完成后当前目录下会有一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不要随便修改目录的内文件,没有看见是因为点开头的文件或文件夹都是隐藏文件。

将文件添加到版本库

编写一个名为readme.txt的文件

Git is a version control system.
Git is free software.

一定要把Hello.sh放在repository文件夹下,因为这是git的仓库,然后执行下面的命令

git add readme.txt
git commit -m "wrote a readme file"

git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

解析commit的输出结果

在执行完git commit会得到下面的结果

[root@Centos repository]# git commit -m "wrote a readme"
[master (root-commit) ffbd581] test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 123.sh

test是 -m的参数

1 file changed, 0 insertions(+), 0 deletions(-) 是提示改动信息;

ffbd581这个字符串则是本次提交的Id,commit Id唯一对应一次提交。

问题:

1.输入git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。

Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。

2.输入git add readme.txt,得到错误fatal: pathspec 'readme.txt' did not match any files。

添加某个文件时,该文件必须在暂存区的目录下,可以用mv、copy命令拷贝文件到暂存区

2.2.查看仓库状态

修改文件readme.txt文件为以下内容

Git is a distributed version control system.
Git is free software.

git status可以查看仓库的状态

git diff文件的修改内容

[root@CentOS repository]# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..53d4271 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed  version control system.
 Git is free software.

可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。

2.3.查看提交日志

当我们需要回退到某个版本时,可以通过git log 命令查看文件提交历史来查看提交的信息

[root@CentOS repository]# git log -1
commit 82a3a95429d4979aee99691eb4fd880a35f59ef0
Author: root <123@qq.com>
Date:   Mon Feb 15 17:37:51 2021 +0800

    insert distributed

commit 82a3a95429d4979aee99691eb4fd880a35f59ef0 中的后面这一串字符就是完整的commit id;

“Author”就是这次提交的作者,它就是我们在git config中配置的user.name;

最后输出的“insert distributed”,是我们在提交时添加的信息;

git log -p 即可显示每次提交之间的变化,git log -1 查看最近一次的更新;

commit的ID是SHA1计算出来的一个数值,是十六进制,目的是为了防止ID重复造成的冲突。

2.4.回退版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上个版本时HEAD^,上上个版本时HEAD^^,往上100个版本简写成HEAD~100

回退到没有distributed单词的最初版本

git reset --hard HEAD^

回退到没有distributed的版本后,如果想再次回到有distributed的版本的解决办法

如果没有关闭电脑向前翻,找到目标版本的commit ID,不用全输只要输入前几位就可以了

git reset --hard  82a3a9542

如果找不到怎么办

执行 git reflog记录每次执行的命令,这样可以查看到需要版本的commit ID,就可以回退了

[root@CentOS repository]# git reflog
a51529a HEAD@{0}: reset: moving to HEAD^
069f6b5 HEAD@{1}: reset: moving to HEAD^
82a3a95 HEAD@{2}: commit: insert distributed

2.5.撤销与删除

撤销工作区的文件修改

如果工作区的某个文件被改乱了,但还没有提交,可以用git checkout命令找回本次修改之前的文件。

git checkout -- [filename]

它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。

注意,工作区的文件变化一旦被撤销,就无法找回了。

从暂存区撤销文件

如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。

git rm --cached [filename]

上面的命令不影响已经提交的内容。

删除

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

git rm 文件名

三、远程仓库

3.1.克隆远程版本库

克隆操作需要用到的命令是git clone

git clone 远程版本库地址 

通过这样的操作,就能将远程版本库复制到本地了,而且会默认克隆到sample文件夹下,对应于远程版本库地址中指定的sample。

可以根据需要,指定克隆到其他目录下

git clone 远程版本库地址  指定目录

实例

克隆GitHub上busybox项目到/root/busybox目录下

git clone https://github.com/billie66/TLCL.git /root/busybox

3.2.添加远程版本库

添加远程版本库需要用到的命令是git remote add

git remote add 远程仓库名 远程仓库地址

实例

添加远程版本库命名为git

git remote add git /tmp/educoder.git

3.3.推送本地内容到远程仓库

推送本地内容时,会将所有未推送至远程仓库的内容,都提到远程仓库。它用到的命令是git push

git push [选项] 远程仓库名 本地分支名 远程分支名

选项:

-u:建立起本地master分支和远程master分支之间的对应关系,下一次如果再推送master分支,就可以忽略远程分支名了。

#初次推送
git push -u origin master master

#再次推送
git push origin master master

四、分支管理

4.1.创建和切换本地分支

创建本地分支

创建本地分支用到的命令是git branch

git branch 分支名,创建一个新的分支:

git branch new_master

切换本地分支

使用git checkout命令来切换本地分支

git checkout 分支名,切换到new_master

git checkout new_master

创建并切换到创建的新分支

使用git checkout -b来创建并切换到创建的新分支

git checkout -b 分支名字

git checkout -b hello_master

4.2.删除本地分支

删除本地分支,需要用到git branch命令,且需要-D参数

git branch -D 需要删除的分支的名字

删除hello_master分支

git branch -D hello_master

4.3.拉取远程分支到本地

拉取远程仓库的内容到本地,需要使用git pull命令

git pull 仓库名 远程分支名:本地分支名 [选项]

选项:

-f:当远程分支与本地分支冲突的时候可以选择解决冲突和强制拉取,-f就是强制拉取远程分支覆盖本地分支

将远程仓库origin的master分支的内容拉取到本地master分支

git pull origin master:master

4.4.删除远程分支

删除远程分支有两种方法:

1.推送一个空分支到远程分支实现删除;

git push 远程主机名 :远程分支 冒号前面没有指定本地分支名,所以是空分支;

删除远程develop分支,其中origin为远程主机名。

git push origin :develop

2.使用delete参数删除远程分支;

通过delete参数删除远程分支,命令格式为:git push 远程主机名 --delete 远程分支名;

删除远程develop分支,其中origin为远程主机名。

git push origin --delete develop

4.5.本地分支合并

分支合并需要使用git merge命令,具体的命令格式为:git merge 需要合并的分支。

例如当前处于master分支,要将develop分支合并到master分支,命令如下

git merge develop

分支合并也分为正常合并和快进式合并

快进式合并

默认情况下,Git执行”快进式合并”,即fast-farward merge,会直接将被合并的分支指向需要合并的分支。如下图:

在这里插入图片描述

正常合并

快进和并的优点是能简化版本库的历史记录并使其保持线性发展.缺点是我们不能根据已经合并过的历史记录来看版本库的这一发展.git提供了–no-ff的选项,以强制其产生一次提新的提交。

git merge --no-ff develop

在这里插入图片描述

五、标签管理

5.1.创建标签

切换到对应的分支,使用git tag <标签名>打标签。

git branch new_master
git checkout new_master
git tag v1.0

标签默认是打在最新的commit上,如果要给历史提交的commit打标签需要commit id。

1.查看commit ID

[root@CentOS repository]# git log
commit 41f59c3782adec55666742c2714c1ab36bebd082
Author: root <123@qq.com>
Date:   Thu Feb 18 15:30:34 2021 +0800

    HelloWorld

2.打标签

git tag v2.0  41f59c3

标签总是和某个commit挂钩,如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

创建有说明内容的标签

git tag -a v2.0 -m"HelloWorld"  41f59c37

5.2.查看标签

查看标签

[root@CentOS repository]# git tag
v1.0
v2.0

查看标签对应的说明内容

git show v2.0

5.3.操作标签

删除标签

git tag -d 标签名

推送标签到远程仓库

git push 远程仓库名  标签名

一次性推送全部标签

git push 仓库名  --tags

删除远程标签

如果标签已经推送到远程,要删除远程标签,需要先从本地删除标签:

git tag -d 标签名

然后远程删除,原理就是推送一个空白的标签名覆盖需要删除的标签。

git push origin :远程标签名