Loading

分布式版本控制系统Git的使用最全最细;

1.什么是Git

后续内容会更新在个人站点: https.malusspectabilis.top

Git是一个分布式的版本控制软件,Git在每个用户都有一个完整的服务器,然后有一个中央服务器,用户可以将代码提交到本地,没有网络也可以提交到本地,然后在有网络的时候提交到中央服务器,这样就方便了开发者,而相比SVS和SVN都是集中式的版本控制系统,工作的时候需要先从中央服务器获取作新的代码,改完后需要提交,如果是一个很大的文件则需要足够快的网络才能完成提交。而使用分布式的版本控制系统,每个用户都是一个完整的版本库,即使没有中央服务器也可以提交代码或者回滚,最终再把改好的代码提交至中央服务器进行合并即可。

  • 软件,类似于qq、office等安装到电脑才能使用的工具。
  • 版本控制,类似于毕业论文,视频剪辑等需要反复修改和保留原历史数据;
  • 分布式
  1. 文件夹拷贝
  2. 本地版本控制
  3. 集中式版本控制
  4. 分布式版本控制

2.为什么要做版本控制?

版本控制就是管理更新的历史记录,它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更新源代码的过程,回滚到特定阶段,恢复误删除的文件等。
集中型与分散型

2.1集中型

1.以subversion为代表的集中型,将仓库集中存放在服务器之中,所以只存在一个仓库,这就是为什么这种版本管理系统被称为集中型。
2.集中型将所有数据集中存放在服务器当中,有便于管理的有点,但是一旦开发者所处的环境不能连接服务器,就无法获取最新的源代码,开发也就无法进行,服务器宕机时也是同样的道理,而且万一服务器故障导致数据消失,恐怕开发者就再也见不到最新的源代码了。
image

2.2分散型

1.分散型拥有多个仓库,相对而言稍显复杂,不过,由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发。
2.图中只显示了一般的使用流程,实际上,所有仓库之间都可以进行push和pull,即使不通过git,开发A也可以向开发B的仓库进行push或pull。
image

3.安装Git

安装Git软件有很多方式:

3.1Windows系统

https://git-scm.com/download/win

3.2Linux系统

https://git-scm.com/download/linux

3.3MacOS系统

https://git-scm.com/download/mac

4.Git的使用

4.1git init初始化仓库

要想使用Git进行版本管理,必须先初始化仓库。Git是使用git init命令进行初始化的;
1.进入要管理的文件夹
2.执行初始化命令

sh-3.2# mkdir apps
sh-3.2# cd apps/
# 这个时候这个目录初始化完成,可以进行工作;
sh-3.2# git init
Initialized empty Git repository in /private/etc/apps/.git/

如果初始化成功,执行了git init命令的目录下就会生成.git目录,这个.git目录存放着管理当前目录内容所需的仓库数据。
在git中,我们将这个目录的内容称为"附属于该仓库的工作树"。文件的编辑等操作在工作树中进行,然后记录到仓库,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。

sh-3.2# ls -l
total 0
drwxr-xr-x  9 root  wheel  288  8 26 17:48 .git

4.2git status查看仓库的状态

git status命令用于显示Git仓库的状态。
工作树和仓库在被操作的过程中,状态会不断发生变化,在git操作过程中常使用git status命令查看当前状态,

sh-3.2# cat haitang.txt 
haitang

# 新增的文件和修改过的人间都是红色的,这里显示新增了一个文件的状态是未追踪状态,使用git add来对其进行管理
sh-3.2# git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	haitang.txt

nothing added to commit but untracked files present (use "git add" to track)

4.3git add向暂存区中添加文件

如果只是使用git仓库的工作树创建了文件,那么该文件并不会被记入git仓库的版本管理对象当中,因此使用git status命令查看的时候它会显示在untracked file当中。
要想让文件成为git仓库的管理对象,就需要使用git add命令将其加入暂存区(Stage或者Index)中。暂存区是提交之前的一个临时区域。

sh-3.2# git add haitang.txt 
# 这个时候这个文件由红色变成了绿色。
sh-3.2# git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   haitang.txt

4.4配置个人信息与代码高亮

说明是谁在使用和配置代码高亮

sh-3.2# git config --global user.email "haitang@qq.com"
sh-3.2# git config --global user.name "haitang"
sh-3.2# git config --global color.ui auto
sh-3.2# vim ~/.gitconfig 
[color]
   ui = auto

4.5git commit保存仓库的历史记录;

git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中,通过这些记录,我们就可以在工作树中复原文件。

使用commit提交。"里面为描述信息"
sh-3.2# git commit -m "海棠one"
[master (root-commit) 61dbe71] 海棠one
 1 file changed, 1 insertion(+)
 create mode 100644 haitang.txt
 
当前工作树处于最新状态,结果显示没有更改。
sh-3.2# git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

4.6git log查看提交日志

git log命令可以查看以往仓库中提交的日志,包括可以查看什么人在什么时候进行了提交或合并。以及操作前后有怎样的差别。

sh-3.2# git log
commit 61dbe71f56fc1176d6f158fef61572b3515db841 (HEAD -> master)
Author: haitang <haitang@qq.com>
Date:   Fri Aug 26 17:58:50 2022 +0800

    海棠one

4.6.1只显示提交信息的第一行

sh-3.2# git log --pretty=short
commit 9c303e7ddce7fbe83506f8f4847fe1df56e8b57a (HEAD -> master, origin/master, origin/HEAD)
Author: haitang <haitang@qq.com>

    haitang three

commit ea353ffe4c1b2b75942cd57421f97c74df894342
Author: haitang <haitang@qq.com>

    dev 第一次提交

commit 65a13999930ce95cd59fc09e1423ab20dcc402c6
Author: haitang <haitang@qq.com>

    haitang two

commit 61dbe71f56fc1176d6f158fef61572b3515db841
Author: haitang <haitang@qq.com>

    海棠one

4.6.2只显示指定目录、文件的日志

sh-3.2# git log 61dbe71f56fc1176d6f158fef61572b3515db841
commit 61dbe71f56fc1176d6f158fef61572b3515db841
Author: haitang <haitang@qq.com>
Date:   Fri Aug 26 17:58:50 2022 +0800

    海棠one

4.7git reset回滚到历史版本

添加一行执行add执行回滚操作。

sh-3.2# echo "海棠two" >> haitang.txt

对这个文件进行追踪
sh-3.2# git add .

再次提交至本地版本库
sh-3.2# git commit -m  "haitang two"
[master 65a1399] haitang two
 1 file changed, 1 insertion(+)

查看日志
sh-3.2# git log
commit 65a13999930ce95cd59fc09e1423ab20dcc402c6 (HEAD -> master)
Author: haitang <haitang@qq.com>
Date:   Fri Aug 26 18:03:28 2022 +0800

    haitang two

commit 61dbe71f56fc1176d6f158fef61572b3515db841
Author: haitang <haitang@qq.com>
Date:   Fri Aug 26 17:58:50 2022 +0800

    海棠one

进行回滚, 回滚方式为 git reset --hard 版本号 这个版本号不用全部写完,7位即可
sh-3.2# git reset --hard 61dbe71
HEAD is now at 61dbe71 海棠one

验证是回滚完成
sh-3.2# cat haitang.txt 
haitang

4.8升级

可以通过reglog查看历史全部的记录

sh-3.2# git reflog
61dbe71 (HEAD -> master) HEAD@{0}: reset: moving to 61dbe71
65a1399 HEAD@{1}: commit: haitang two
61dbe71 (HEAD -> master) HEAD@{2}: commit (initial): 海棠one

要想回到haitangtwo执行git rest --hard 版本号即可;
sh-3.2# git reset --hard 65a1399
HEAD is now at 65a1399 haitang two

sh-3.2# cat haitang.txt 
haitang
海棠two

4.9克隆项目到本地

sh-3.2# git clone git@gitee.com:good-news/apps.git
Cloning into 'apps'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (12/12), done.
sh-3.2# 

4.10git remote add添加远程仓库

列出所有当前配置的远程设备

sh-3.2# git remote -v
origin	git@gitee.com:good-news/apps.git (fetch)
origin	git@gitee.com:good-news/apps.git (push)

# 显示这个仓库的详细信息
sh-3.2# git remote show origin
* remote origin
  Fetch URL: git@gitee.com:good-news/apps.git
  Push  URL: git@gitee.com:good-news/apps.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

# 添加一个远程仓库到本地
sh-3.2# git remote add origin git@gitee.com:good-news/iqiyi.git

4.11 以图表的形式查看分支

√=sh-3.2# git log --graph
* commit 9c303e7ddce7fbe83506f8f4847fe1df56e8b57a (HEAD -> master, origin/master, origin/HEAD)
| Author: haitang <haitang@qq.com>
| Date:   Fri Aug 26 18:44:16 2022 +0800
| 
|     haitang three
| 
* commit ea353ffe4c1b2b75942cd57421f97c74df894342
| Author: haitang <haitang@qq.com>
| Date:   Fri Aug 26 18:26:18 2022 +0800
| 
|     dev 第一次提交
| 
* commit 65a13999930ce95cd59fc09e1423ab20dcc402c6
| Author: haitang <haitang@qq.com>
| Date:   Fri Aug 26 18:03:28 2022 +0800
| 
|     haitang two
| 
* commit 61dbe71f56fc1176d6f158fef61572b3515db841
  Author: haitang <haitang@qq.com>
  Date:   Fri Aug 26 17:58:50 2022 +0800
  
      海棠one

5.Git分支命令

5.1git branch显示分支

git branch命令可以将分支名列表显示,同时也可以确认当前所在分支。
可以看到master分支左侧 有"*"表示这是当前所在的分支,也就是说,正在master分支下进行开发,结果中没有显示其他分支名,表示本地仓库只存在一个master一个分支。

sh-3.2# git branch 
* master

5.2git checkout创建分支

git branch xx分支名

sh-3.2# git branch dev
可以看到创建的dev分支
sh-3.2# git branch 
  dev
* master

git checkout -b创建分支

sh-3.2# git checkout -b dev
Switched to a new branch 'dev'

可以看到的是创建并切换到了dev分支。git branch xx分支名效果等同。
sh-3.2# git branch
* dev
  master

5.3切换分支

显示已经切换为dev分支

sh-3.2# git checkout dev
Switched to branch 'dev'

可通过branch来查看在哪个分支,可以看见dev分支前面有一个*
sh-3.2# git branch 
* dev
  master

5.4代码合并

在dev分支上创建文件并提交
sh-3.2# touch dev.txt && echo "hello git" > dev.txt
sh-3.2# git add .
sh-3.2# git commit -m "dev 第一次提交"
[dev ea353ff] dev 第一次提交
 1 file changed, 1 insertion(+)
 create mode 100644 dev.txt
 
切换分支
sh-3.2# git checkout master
Switched to branch 'master'

在master分支上合并dev分支上的代码;
sh-3.2# git merge dev
Updating 65a1399..ea353ff
Fast-forward
 dev.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 dev.txt
 
没有合并之前,在master分支上是看不见dev分支上的代码;
 sh-3.2# cat dev.txt 
hello git

5.5删除分支

git branch -d 分支名

sh-3.2# git branch -d dev
Deleted branch dev (was ea353ff).

删除了可以看见就剩下一个分支
sh-3.2# git branch
* master

5.6git commit --amend修改提交信息

要修改上一条的提交信息,可以使用git commit --amend明亮。执行命令编辑器就会启动。

sh-3.2# git commit --amend
[dev 3dd1290] hha2020.9.1
 Date: Thu Sep 1 20:36:31 2022 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

6.将代码托管至远程服务器

github: https://github.com/
gitlab: 需在服务器上部署;
gitee:https://gitee.com/
选择gitee来测试

6.1创建一个仓库

image

6.2会生成一个仓库信息

image

添加仓库,注意我们配置的是SSH类型
sh-3.2# git remote add origin git@gitee.com:good-news/apps.git

6.3本地push代码至远程仓库

我们为什么能上传代码到远程仓库呢?因为我们把公钥放在了gitee,我现在把公钥拿掉,验证是否能push

sh-3.2# git push origin master
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (9/9), 699 bytes | 699.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:good-news/apps.git
 * [new branch]      master -> master

6.4无密钥验证是否能push代码

6.4.1 编辑第三次提交
sh-3.2# echo "haitang three"  >>haitang.txt
6.4.2 追踪文件
sh-3.2# git add .
上传至本地版本库
sh-3.2# git commit -m "haitang three"
[master 9c303e7] haitang three
 1 file changed, 1 insertion(+)
 
6.4.3 这里看到是不能上传的,因为把公钥拿掉了。
sh-3.2# git push origin master
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.

6.5配置SSH上下传代码;

拿到本地的公钥上传至gitee个人账户下
sh-3.2# cat /var/root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZRnFbJGoALs8wMC+EJS7Yewdre8XDaheQNW6U0gmf30mZvzIspqbr5uIVnIwQaT5usYgy2EGjJ2xLRrxfwE2I8UKDyeothIM6zeQxW9Ah+tXeIgWSbX83esMRx/PxysGp4IIykW8+C5Lt3/aUWD7ABHYU2Di4aSj/71+76z877/wrgPYaWvAarU+ZRBzV7oYyXeLLy7lLuxZkFyfyArjzL7pDslOTj+fGcfAUyeOdUjyWhL+7CtvaY/fyXU/hkw9k770XNKQh4QYjZztS/FhJnwOi8OcS2j7kLJDAiaJYKKpCamAec7/f2e16f+HWCz41Wc4DFfJvlyo1/x6ADLnMmPoFoZrKLYOOxlKlCu9/SAomMOCf0qxyl

image

6.6测试再次上传代码

这次上传是没有问题的

sh-3.2# git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 292 bytes | 292.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:good-news/apps.git
   ea353ff..9c303e7  master -> master
posted @ 2022-08-26 18:58  梨花海棠  阅读(922)  评论(1编辑  收藏  举报