分布式版本控制系统Git的使用最全最细;
1.什么是Git
后续内容会更新在个人站点: https.malusspectabilis.top
Git是一个分布式的版本控制软件,Git在每个用户都有一个完整的服务器,然后有一个中央服务器,用户可以将代码提交到本地,没有网络也可以提交到本地,然后在有网络的时候提交到中央服务器,这样就方便了开发者,而相比SVS和SVN都是集中式的版本控制系统,工作的时候需要先从中央服务器获取作新的代码,改完后需要提交,如果是一个很大的文件则需要足够快的网络才能完成提交。而使用分布式的版本控制系统,每个用户都是一个完整的版本库,即使没有中央服务器也可以提交代码或者回滚,最终再把改好的代码提交至中央服务器进行合并即可。
- 软件,类似于qq、office等安装到电脑才能使用的工具。
- 版本控制,类似于毕业论文,视频剪辑等需要反复修改和保留原历史数据;
- 分布式
- 文件夹拷贝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
2.为什么要做版本控制?
版本控制就是管理更新的历史记录,它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更新源代码的过程,回滚到特定阶段,恢复误删除的文件等。
集中型与分散型
2.1集中型
1.以subversion为代表的集中型,将仓库集中存放在服务器之中,所以只存在一个仓库,这就是为什么这种版本管理系统被称为集中型。
2.集中型将所有数据集中存放在服务器当中,有便于管理的有点,但是一旦开发者所处的环境不能连接服务器,就无法获取最新的源代码,开发也就无法进行,服务器宕机时也是同样的道理,而且万一服务器故障导致数据消失,恐怕开发者就再也见不到最新的源代码了。
2.2分散型
1.分散型拥有多个仓库,相对而言稍显复杂,不过,由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发。
2.图中只显示了一般的使用流程,实际上,所有仓库之间都可以进行push和pull,即使不通过git,开发A也可以向开发B的仓库进行push或pull。
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创建一个仓库
6.2会生成一个仓库信息
添加仓库,注意我们配置的是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
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