Git的介绍和使用

一、Git的介绍

        1.Git简介

        官网:Git

        git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

        Git 官方中文手册 Git - Book        

        2.Git历史

        自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。

        2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本

二、安装Git

        1.设置安装环境

        准备两台服务器

        git          192.168.36.218

        gitnode  192.168.36.219

        关闭防火墙和Selinux

[root@git ~]# systemctl stop firewalld && systemctl disable firewalld
[root@git ~]# setenforce 0

        2.yum安装

[root@git ~]# yum -y install git

        3.编译安装

        编译安装可以安装较新版本的git,Git下载地址: https://github.com/git/git/releases

# 安装依赖关系
[root@git ~]# yum install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker
# 编译安装 
[root@git ~]# tar -zxf git-2.0.0.tar.gz
[root@git ~]# cd git-2.0.0
[root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过
[root@git ~]# make  
[root@git ~]# make install 

        4.配置Git

[root@git ~]#  git config --global user.name "mawenbao"  #配置git使用用户
[root@git ~]# git config --global user.email "2756375538@qq.com"  #配置git使用邮箱
[root@git ~]# git config --global color.ui true   #语法高亮
[root@git ~]# git config --list   #查看全局配置
user.name=mawenbao
user.email=2756375538@qq.com
color.ui=true
[root@git ~]# cat .gitconfig   #查看配置文件
[user]
        name = mawenbao
        email = 2756375538@qq.com
[color]
        ui = true

        5. 创建裸库

[root@git ~]# useradd git
[root@git ~]# passwd git
更改用户 git 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@git ~]# mkdir /git-root/
[root@git ~]#  cd /git-root/
[root@git git-root]#  git init --bare shell.git
初始化空的 Git 版本库于 /git-root/shell.git/
[root@git git-root]#  chown -R git:git shell.git
[root@git git-root]# ll
总用量 0
drwxr-xr-x 7 git git 119 11月 18 09:56 shell.git

        6.创建本地库

         克隆创建本地库:

[root@gitnode ~]# systemctl stop firewalld && setenforce 0
[root@gitnode ~]# yum -y install git
[root@gitnode shell]# git config --global user.name "mahong"
[root@gitnode shell]# git config --global user.email "88485566@qq.com"
[root@gitnode shell]# git config --global color.ui true
[root@gitnode shell]# git config --list
user.name=mahong
user.email=88485566@qq.com
color.ui=true
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@192.168.36.218:/git-root/shell.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
[root@gitnode ~]# git clone git@192.168.36.218:/git-root/shell.git
正克隆到 'shell'...
The authenticity of host '192.168.36.218 (192.168.36.218)' can't be established.
ECDSA key fingerprint is SHA256:MuD145eBCKsH+7WqdL1FQTe0N92q04sXzP8PfeSDtVA.
ECDSA key fingerprint is MD5:ae:97:63:dc:63:67:28:ca:b7:9f:31:e0:9c:62:3f:69.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.36.218' (ECDSA) to the list of known hosts.
git@192.168.36.218's password: 
warning: 您似乎克隆了一个空版本库。

        7.创建文件

[root@gitnode shell]# echo "mawenbao you are so beautiful" > test.sh  #创建文件
[root@gitnode shell]# git add test.sh     #添加到暂存区域
[root@gitnode shell]# git commit -m "first commit"   #提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看
[master(根提交) 50adeb5] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.sh
[root@gitnode shell]# git push origin master  #将本地库添加到裸库
git@192.168.36.218's password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.36.218:/git-root/shell.git
 * [new branch]      master -> master

            8.查看裸库与本地库文件是否一致    

 三、Git命令常规操作

        1.常用命令说明


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

        常用操作示意图

        文件的状态变化周期

        2.命令操作示例

        2.1创建文件
[root@gitnode shell]# git reflog
02bf1c6 HEAD@{0}: commit (initial): first commit
[root@gitnode shell]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@gitnode shell]# touch README
[root@gitnode shell]# git status
# 位于分支 master
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#       README
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
        2.2添加追踪文件
[root@gitnode shell]#  git add ./*
[root@gitnode shell]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#       新文件:    README
#
        2.3添加新文件

        git add  * 添加到暂存区域
        git commit  提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看

        语法:git add  *
                git commit

                git commit -a  -m "注释信息" #-a 表示直接提交       

        2.4删除git内的文件

        命令说明:

        没有添加到暂存区的数据直接rm删除即可。

        已经添加到暂存区数据:

        git rm --cached database #→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

        git rm -f database #→将文件数据从git暂存区和工作目录一起删除

        2.5重命名暂存区数据

        没有添加到暂存区的数据直接mv/rename改名即可。

        已经添加到暂存区数据:git mv README NOTICE

        2.6查看历史记录

        git log #→查看提交历史记录

        git log -2 #→查看最近几条记录

        git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异

        git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息

        git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息

        git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录

        git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。

        2.7还原历史数据 

        Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

        git reset --hard hash

        git reset --hard HEAD^ #→还原历史提交版本上一次

        git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统会自动匹配)

        2.8还原未来数据

        什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。

        git reflog #→查看未来历史更新点

        2.9标签使用

        前面回滚使用的是一串字符串,又长又难记。

        git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。

        git tag #→查看当前所有的标签

        git show v1.0 #→查看当前1.0版本的详细信息

        git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字

        git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0

        2.10对比数据

        git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改后,再把它提交到仓库就放⼼多了。

        git diff README
        git diff --name-only HEAD HEAD^
        git diff --name-only head_id head_id2

四、分支结构 

        在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。

        那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

        1.分支切换

         1.1.切换分支
[root@gitnode shell]# git branch slave  #添加分支
[root@gitnode shell]# git branch 
* master
  slave
[root@gitnode shell]# git checkout slave  #切换分支
A       README
切换到分支 'slave'
[root@gitnode shell]# git branch 
  master
* slave
        1.2.在slave 分支进行修改
[root@gitnode shell]# cat README 
newrain
[root@gitnode shell]#  echo '1901' >> README 
[root@gitnode shell]# git add .
[root@gitnode shell]# git commit -m '1901'
[slave 58f9ad5] 1901
 1 file changed, 2 insertions(+)
[root@gitnode shell]# git status
# 位于分支 slave
无文件要提交,干净的工作区
        1.3.回到master分支
[root@gitnode shell]# git checkout master
切换到分支 'master'
[root@gitnode shell]# cat README 
cat: README: 没有那个文件或目录
[root@gitnode shell]# git log  -1
commit 02bf1c6f0cfa342578a9213638501597d0f280a6
Author: mahong <889977@qq.com>
Date:   Sat Nov 18 11:17:41 2023 +0800

    first commit
        1.4.合并代码
[root@gitnode shell]# git merge slave
更新 02bf1c6..58f9ad5
Fast-forward
 README | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 README
[root@gitnode shell]# git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
#   (使用 "git push" 来发布您的本地提交)
#
无文件要提交,干净的工作区
[root@gitnode shell]# cat README 
newrain
1901

        2.合并失败解决

        模拟冲突,在文件的同一行做不同修改

        2.1在master 分支进行修改

        

[root@gitnode shell]# cat README 
newrain
1901
[root@gitnode shell]# cat README 
newrain
1901
[root@gitnode shell]#  echo '1901-git' > README
[root@gitnode shell]# git commit -m 'newrain 1901-git'
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
#   (使用 "git push" 来发布您的本地提交)
#
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       修改:      README
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
        2.2切换到slave分支
[root@gitnode shell]# git checkout slave
M       README
切换到分支 'slave'
[root@gitnode shell]# cat README 
1901-git
[root@gitnode shell]# echo 'newrain' >> README 
[root@gitnode shell]# git commit -m '1901-git-check'
# 位于分支 slave
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#       修改:      README
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
        2.3回到master分区,进行合并,出现冲突
[root@gitnode shell]# git checkout master 
M       README
切换到分支 'master'
您的分支领先 'origin/master' 共 2 个提交。
  (使用 "git push" 来发布您的本地提交)
[root@gitnode shell]# git merge linux
fatal: linux - 不能被合并
        2.4解决冲突
[root@gitnode shell]# cat README 
1901-git
newrain
meger test ti
meger test master
[master 6946823] merge-ti-test
 1 file changed, 3 insertions(+), 1 deletion(-)

        3.删除分支

        因为之前已经合并了slave分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。

        查看所有包含未合并工作的分支,可以运行 git branch --no-merged**:

                git branch --no-merged
                  testing

        这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:

        git branch -d testing
        error: The branch 'testing' is not fully merged.
        If you are sure you want to delete it, run 'git branch -D testing'. 

        如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值