git详细讲解

目录

一.git详细介绍 

1、git起源与简介 

2、集中式与分布区别

3、集中式与分布式区别

4、git的安装

5、git的安装与版本库的创建

6、把文件添加到版本库

7、git版本回退、文件修改、撤销与删除

8、工作区和暂存区

9、git管理是修改而非文件

10、git如何撤销修改

11.git删除文件

二.git远程仓库的添加与克隆

1、如何添加远程库

2、注册https://gitee.com账号

3、在本地生成ssh密钥对

4、在gitee.com上创建新的仓库,注意不要初始化仓库

5、本地仓库和远程仓库进行同步

6、从远程库克隆


一.git详细介绍

1、git起源与简介

Linus在1991年创建了开源的Linux,Linux的代码是如何管理的呢?Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!

Git是目前世界上最先进的分布式版本控制系统,那什么是版本控制系统?

  • 能够记录文档的改动历史

  • 能够回滚到任意一个修改时间点

  • 能够协作编辑文件

2、集中式与分布式的区别

集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候, 用的都是自己的电脑,所以要先从中央服务器取得最新的版本, 然后开始干活,干完活了,再把自己的工作推送给中央服务器。 中央服务器就好比是一个图书馆,你要改一本书, 必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

3、集中式与分布式区别 

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A, 这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多, 因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧, 随便从其他人那里复制一个就可以了。 而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。 分布式版本控制系统通常也有一台充当“中央服务器”的电脑, 但这个服务器的作用仅仅是用来方便“交换”大家的修改, 没有它大家也一样干活,只是交换修改不方便而已。

4、git的安装

最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。    我用的是Centos7.5版本,首先,可以试着输入Git,看看系统有没有安装Git:

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

安装完成后,还需要最后一步设置,在命令行输入:

[root@server ~]# git config --global user.name "chao"
[root@server ~]# git config --global user.email "3386785198@qq.com"
[root@server ~]# git config --list

注意git config命令的--global参数,用了这个参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

5、git的安装与版本库的创建

      版本库又叫仓库,英文名repository ,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以 还原 

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

[root@server ~]# mkdir -p /data/mygit
[root@server ~]# cd /data/mygit

通过git init 命令把这个目录变成Git可以管理的仓库:

[root@server mygit]# git init
初始化空的 Git 版本库于 /data/mygit/.git/
[root@server mygit]# ls -a
.  ..  .git

注意:初始化之后当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

6、把文件添加到版本库

请注意,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

[root@server mygit]# vim readme.txt
git is a version

注意:上述文件一定要放到mygit目录下(子目录也行),因为这是一个Git仓库。

下面是将文件添加到仓库和提交到仓库

[root@server mygit]# git add readme.txt
[root@server mygit]# git commit -m "add files readme.txt"
[master(根提交) 4793fe7] add files readme.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme.txt

还可以一次提交多次文件

[root@server mygit]# cp /etc/hosts .
[root@server mygit]# cp /etc/resolv.conf .
[root@server mygit]# git add hosts resolv.conf
[root@server mygit]# git commit -m "add two files"
[master f6a2ae4] add two files
 2 files changed, 5 insertions(+)
 create mode 100644 hosts
 create mode 100644 resolv.conf

7、git版本回退、文件修改、撤销与删除

修改readme.txt文件内容如下

[root@server mygit]# echo "git is a version ok" > readme.txt
[root@server mygit]# cat readme.txt
git is a version ok

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

[root@server mygit]# git diff readme.txt
diff --git a/readme.txt b/readme.txt           
index 05e0843..fd78016 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-git is a version
+git is a version  ok

[root@server mygit]# git add readme.txt

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

[root@server mygit]#git commit -m "add ok"
[master 7ebead4] add ok
1 file changed, 1 insertion(+), 1 deletion(-)
[root@hd1 mygit]#
[root@hd1 mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区

----------------------------------------------
#git 回退 首先修改readme.txt文件 

[root@server mygit]# cat readme.txt
git is a version  ok
git is very good
[root@server mygit]# git add readme.txt
[root@server mygit]# git commit -m "add a line"


#查看修改的日志
[root@server mygit]# git log

commit c46361af969cf7cac5b60f7217d1f629b616c328
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 14:25:44 2021 +0800

 
    add a line


commit 7ebead447739c2d93d59bb39df0c24777f83141a
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 14:21:51 2021 +0800


    add ok


commit 8f1ea6afbfe4b634bd8df9f65333ddf3dbf201e3
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 12:02:33 2021 +0800


    add two files


commit da2ae5b05ac02d56e9039defde163b0d8d6a5e0e
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 11:55:37 2021 +0800


    add files readme.txt

那么如何将readme.txt 回退到上一个版本呢,首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

[root@hd1 mygit]# git reset --hard HEAD^
HEAD 现在位于 7ebead4 add ok
[root@hd1 mygit]# cat readme.txt
git is a version  ok


[root@hd1 mygit]# git log
commit 7ebead447739c2d93d59bb39df0c24777f83141a
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 14:21:51 2021 +0800


    add ok


commit 8f1ea6afbfe4b634bd8df9f65333ddf3dbf201e3
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 12:02:33 2021 +0800


    add two files


commit da2ae5b05ac02d56e9039defde163b0d8d6a5e0e
Author: duoduo <wmbenet@126.com>
Date:   Sat Aug 7 11:55:37 2021 +0800


    add files readme.txt

以上可以看到我们回退到上一次的内容中了  ,这里有一个问题我想恢复到,恢复操作之前的状态怎么办?

下面是见证奇迹的时刻,c46361af969cf是部分commit的编号

[root@server mygit]# git reset --hard c46361af969cf
HEAD 现在位于 c46361a add a line
[root@server mygit]# cat readme.txt
git is a version  ok
git is very good

Git的版本回退速度非常快,因为Git在内部有一个指针,如下图所示:

  

 关于回退,还有个命令

[root@server mygit]# git reflog
c46361a HEAD@{0}: reset: moving to c46361af969cf
7ebead4 HEAD@{1}: reset: moving to HEAD^
c46361a HEAD@{2}: commit: add a line
7ebead4 HEAD@{3}: commit: add ok
8f1ea6a HEAD@{4}: commit: add two files
da2ae5b HEAD@{5}: commit (initial): add files readme.txt
[root@server mygit]#

8、工作区和暂存区

工作区(Working Directory)就是你在电脑里能看到的目录,比如我的mygit文件夹就是一个工作区。

工作区有个隐藏的目录 .git ,这个不算工作区,而是git的版本库。git的版本库里存了很多东西,其中最重要的就是称为stage (或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

 前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:

第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。

可以简单理解为,需要提交文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

9、git管理是修改非文件

什么是修改?比如你新增加了一行,这就是修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又增加了一些,也是一个修改,而创建一个新文件,也是一个修改。

10、git如何撤销修改

我们写代码犯错是难免的,但是git允许你犯错,因为git有撤销修改的功能,git checkout --file 可以丢弃工作区的修改:

例1:只是在工作区进行了修改,并未进行add到暂存区

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

例2:在工作区进行了修改,并且add到了暂存区

[root@server mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@server mygit]# cat readme.txt
git 7788
[root@server mygit]# echo "hao xiang ku " >readme.txt
[root@server mygit]# git add readme.txt
[root@server mygit]#
[root@server mygit]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#    修改:      readme.txt
#
[root@server mygit]# git reset HEAD readme.txt
重置后撤出暂存区的变更:
M    readme.txt
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#    修改:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# cat readme.txt
hao xiang ku
[root@server mygit]# git checkout -- readme.txt
[root@server mygit]# cat readme.txt
git 7788

 注意:git checkout  --  后面有空格,有空格,有空格,让这个文件回到最近一次git commit或git add时的状态。

git checkout -- file  命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。 

举例: 总结: 

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。 

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。 

11、git删除文件

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

1)删除后,通过git恢复文件

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

2 )彻底删除,需要三个步骤

[root@server mygit]# rm -rf readme.txt
[root@server mygit]#
[root@server mygit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add/rm <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#    删除:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@server mygit]# git rm readme.txt
rm 'readme.txt'
[root@server mygit]# git status
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#    删除:      readme.txt
#
[root@server mygit]# git commit -m "delete readme.txt"
[master fefbe0e] delete readme.txt
1 file changed, 1 deletion(-)
delete mode 100644 readme.txt
[root@server mygit]# git status
# 位于分支 master
无文件要提交,干净的工作区

二 git远程仓库的添加与克隆
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
 我们可以自己搭建一台运行Git的服务器,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
 要快速使用git,可以通过一个叫GitHub的神奇网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要设置公钥认证机制,举例如下:
GitHub允许添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
 最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。
1)如何添加远程库
假定,现在我们在本地创建了一个Git仓库后,又想在Gitee创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。私有仓库也是免费的 。

2)注册https://gitee.com账号

3)在本地生成ssh公钥私钥对

[root@server mygit]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:6hwC1WNisvjI4MQMfweNH82B8a79J6kxbkSq00WNri8 root@server
The key's randomart image is:
+---[RSA 2048]----+
|      .o.        |
|     +.+ .       |
|. . * * +o       |
|+o = = ++ .      |
|o++ . o=S        |
|=o o ..++        |
|.o. .o+++  .     |
|    o+Eo.+o .    |
|     .o++..o     |
+----[SHA256]-----+

[root@server mygit]# cd /root/.ssh
[root@server .ssh]# ll
总用量 8
-rw-------. 1 root root 1679 6月   5 18:42 id_rsa
-rw-r--r--. 1 root root  393 6月   5 18:42 id_rsa.pub

[root@server .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdyhTmMNhOd6SkZAB+Kt/EldBizJ+Ks6E7syuQ23Eg/QHtLYBW/0P3NXI+40QxX9SLsPTA3CaM4VimaQLhtl0oyljC7HkczlqbtQMGyXxUpyUZgymZMTiS07pzrOMwVJ5W/oKsUA+UbOWYHvG4bfQhhs1kdMI1LAHYMYc7IBVrwE7WKjYKQUzr7ERHJGXg35Wvpezmz9iaqqiTcTdYsaSxtCJtFNBVB+RhhjTUlGB97EtJD5eaTX5wXfbdq491rqD8hfBxSOoiyR8fJti6WERU/uvOKO1Koep9ncI7mj+Fkif3T1uybj7VAkh2aeam0TjSE52vfv2i15weiyiuxcTL root@server
[root@server .ssh]#

 将上面的公钥内容复制到gitee上面 

创建完毕仓库之后,gitee上有git命令的提示,我们可以参考一下这些命令

5)本地仓库和远程仓库进行同步

本地仓库和远程仓库进行关联

[root@server mygit]# git remote add origin git@gitee.com:zhang7433892/mygit.git

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的

接下来我们将本地的仓库文件push上传到远程的服务器

[root@server mygit]# git push -u origin master
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (20/20), 1.85 KiB | 0 bytes/s, done.
Total 20 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.0]
To git@gitee.com:wmbenet/mygit.git
* [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。


查看本地文件
[root@server mygit]# ls
resolv.conf

刷新页面,发现文件已经上传

我们再上传一个文件

[root@server mygit]# cp /root/anaconda-ks.cfg .
[root@server mygit]# git add anaconda-ks.cfg
[root@server mygit]# git commit -m "add ks.cfg"

[root@server mygit]# git push origin master
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1.31 KiB | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.3]
To git@gitee.com:zhang7433892/mygit.git
   3871dbd..d5931d1  master -> master

上面最后一个命令,因为是第二次执行,所以 -u参数就可以去掉了。

远程仓库也同步成功了

6)从远程库克隆 

前面我们讲了先有本地库,后有远程库的时候,如何进行远程关联,现在,假设我们从零开发,最好的方式就是从远程克隆

假设我们有一个项目,一般是在gitee建立一个库,每个人都从远程库克隆一份到本地 

首先我们建立一个远程仓库

将远程仓库clone到本地

[root@server mygit]# cd ..
[root@server data]# git clone git@gitee.com:zhang7433892/gamelife.git
正克隆到 'gamelife'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (4/4), done.

[root@server data]# ls
gamelife  mygit

[root@server data]# cd gamelife/
[root@server gamelife]# ls
README.en.md  README.md

 修改本地文件,并上传到远程服务器

[root@server gamelife]# echo "mylife is not a game" >> README.md
[root@server gamelife]# git add README.md
[root@server gamelife]# git commit -m "add a line for readme"
[master 5821f71] add a line for readme
 1 file changed, 1 insertion(+)
[root@server gamelife]# git push  origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.3]
To git@gitee.com:zhang7433892/gamelife.git
   ec52338..5821f71  master -> master
请自行查看远程的仓库文件是否发生了改变 
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议,即可以用 https://github.com/ixdbagao/gitcode1.git这样的地址。但通过ssh支持的原生git协议速度最快。 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,而在某些只开放http端口的公司内部可能无法使用ssh协议,此时只能用https。
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值