- A+
git安装与使用
一:Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
二:SVN与Git的最主要的区别?
Git 是一种分布式版本控制系统,而SVN是一种集中式版本控制系统。在Git中,每个开发者都有一个完整的本地代码仓库,可以在本地进行版本控制和更改记录,然后与其他开发者共享更新。而在SVN中,所有的代码和历史记录都保存在中央仓库中,开发者需要与中央仓库进行交互才能进行版本控制和更改记录。
三:git安装与使用
安装
1.关闭防火墙
2.配置yum源
yum install git -y
修改环境变量,定制git的环境
git config控制git的行为,来定义环境变量
git config --global xxxx.xxx
- system 针对任意登录该linux系统的用户都生效,git的配置信息,写入到/etc/gitconfig
- global 全局,只针对当前登录的用户生效,git配置写入~/.gitconfig
- local 本地,只针对某一个文件夹生效
用户git信息配置
git 分布式版本控制 每个人在自己的本地,都可以对代码版本进行管理
提交v1版本,---提交人姓名 ---提交人邮箱 ---提交的时间
提交v2版本,---提交人姓名 ---提交人邮箱 ---提交的时间
…
[xu@localhost ~]$ git config --global user.name "xu" [xu@localhost ~]$ git config --global user.email "xxx@163.com" [xu@localhost ~]$ git config --global color.ui true [xu@localhost ~]$ cat ~/.gitconfig [user] name = xu email = xxx@163.com [color] ui = true [xu@localhost ~]$ git config --global --list user.name=xu user.email=xu2661148284@163.com color.ui=true
git的四个区域
git命令就是用于将文件改动切换到不同的空间来记录
工作区>暂存区>本地git仓库>远程代码仓库 github gitlab
- Workspace 工作区 (linux上面普通文件夹)
- Index / Stage /Cached 暂存区
- Repository 本地仓库
- Remote 远程仓库 (各个本地仓库的源码提交到远程仓库合并)
git管理代码有3个场景
1.本地已经有一个代码,需要用git管理
进入写好代码的目录 使用git init 对git初始化,生成.git目录
2.本地没有代码,要新建一个git版本仓库
mkdir /my_code/
cd /my_code/ && git init
3.本地没有代码,也没有git版本仓库,去github代码托管平台下载一个git版本代码库
git clone https://github.com/xxx/xxx_code
git clone 下载一个已经被git管理的代码仓库
场景1:
[root@localhost learn_git]# echo "hello linux" > hi.sh [root@localhost learn_git]# ls -a . .. hi.sh [root@localhost learn_git]# git init . 初始化空的 Git 版本库于 /learn_git/.git/ [root@localhost learn_git]# ls -a . .. .git hi.sh
场景2:
[root@localhost /]# git init learn_git2 初始化空的 Git 版本库于 /learn_git2/.git/
场景3:
[root@localhost learn_git3]# git clone https://gitee.com/pear-admin/pear-admin-flask.git 正克隆到 'pear-admin-flask'... remote: Enumerating objects: 6642, done. remote: Counting objects: 100% (1938/1938), done. remote: Compressing objects: 100% (1481/1481), done. remote: Total 6642 (delta 1063), reused 767 (delta 391), pack-reused 4704 接收对象中: 100% (6642/6642), 16.08 MiB | 2.83 MiB/s, done. 处理 delta 中: 100% (3197/3197), done. [root@localhost learn_git3]# ls pear-admin-flask [root@localhost learn_git3]# cd pear-admin-flask/ [root@localhost pear-admin-flask]# ls -a . applications dockercompose.yaml Dockerfile docs .gitignore migrate.bat plugins requirements.txt run.sh templates .. app.py dockerdata .dockerignore .git LICENSE migrate.sh README.md run.bat static `可以看到有.git` `当文件没有发生改变时候` [root@localhost pear-admin-flask]# git status # 位于分支 master 无文件要提交,干净的工作区 `创建一个文件 再看一下git状态` [root@localhost pear-admin-flask]# touch test.txt [root@localhost pear-admin-flask]# git status # 位于分支 master # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # test.txt 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
git生命周期
[root@localhost git_code]# mkdir /git_code 1.生产工作区 [root@localhost git_code]# git init hello_git [root@localhost git_code]# cd hello_git/ 2.查看git工作区中的本地仓库 [root@localhost hello_git]# ls -a . .. .git 3.查看工作区的信息 [root@localhost hello_git]# git status # 位于分支 master # # 初始提交 # 无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪) `touch test.txt创建一个文件 再来git status` [root@localhost hello_git]# git status # 位于分支 master # # 初始提交 # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # test.txt 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) 4.提交到缓存区 `git add . 可以对所改变的的全部文件提交到暂存区,也可以单独指定文件 git add test.txt` [root@localhost hello_git]# git status # 位于分支 master # # 初始提交 # # 要提交的变更: # (使用 "git rm --cached <file>..." 撤出暂存区) # # 新文件: test.txt `如果像删除暂存区的内容可以使用 git rm --cached filename 不再演示` 5.提交到本地仓库 [root@localhost hello_git]# git commit -m "xu first commit" [master(根提交) 34a9852] xu first commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.txt [root@localhost hello_git]# git status # 位于分支 master 无文件要提交,干净的工作区
git使用补充
6.当在工作区需要改文件名时 需要使用git mv 命令 这样操作会被git所记录,直接使用mv则不会被记录 [root@localhost hello_git]# mv test.txt test2.txt [root@localhost hello_git]# git status # 位于分支 master # 尚未暂存以备提交的变更: # (使用 "git add/rm <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 删除: test.txt # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # test2.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") `可以用 git checkout --<file> ...将放弃此改动` `手动删除test2.txt` [root@localhost hello_git]# rm -rf test2.txt [root@localhost hello_git]# ls test.txt `git checkout` [root@localhost hello_git]# git checkout test.txt [root@localhost hello_git]# git status # 位于分支 master 无文件要提交,干净的工作区 [root@localhost hello_git]# ls test.txt 7.正常使用git mv更改文件名 [root@localhost hello_git]# git mv test.txt test2.txt [root@localhost hello_git]# ls test2.txt [root@localhost hello_git]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 重命名: test.txt -> test2.txt # `提交` [root@localhost hello_git]# git commit -m "把test.txt文件名改成test2.txt"[master d808cb5] 把test.txt文件名改成test2.txt 1 file changed, 0 insertions(+), 0 deletions(-) rename test.txt => test2.txt (100%) [root@localhost hello_git]# git status # 位于分支 master 无文件要提交,干净的工作区 8.从本地仓库中,删除对某个文件的跟踪,此时状态回到“未跟踪”工作区 git rm --cached [root@localhost hello_git]# git rm --cached test2.txt rm 'test2.txt' [root@localhost hello_git]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 删除: test2.txt # # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # test2.txt 9.此时对上述的删除动作,可以有三个选择 9.1直接删除文件 rm -rf test2.txt 9.2撤销刚才的git rm动作,继续回到存区 git reset HEAD test2.txt 9.3 git add test2.txt
git查看版本信息
1.查看git仓库的提交版本信息 [root@localhost hello_git]# git log commit d808cb53c970c9fc64b2455da5e6dd5c49de8670 Author: x <2661148284@qq.com> Date: Thu Jul 20 01:53:13 2023 +0800 把test.txt文件名改成test2.e commit 34a985235c4898d7e94ee4fdcd4bf0978153ae6f Author: x <2661148284@qq.com> Date: Thu Jul 20 01:21:13 2023 +0800 xu first commit 2.显示简略版 [root@localhost hello_git]# git log --oneline d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 3.显示最新的一条提交记录 [root@localhost hello_git]# git log -1 commit d808cb53c970c9fc64b2455da5e6dd5c49de8670 Author: x <2661148284@qq.com> Date: Thu Jul 20 01:53:13 2023 +0800 把test.txt文件名改成test2.txt
git版本回退
git reset --hard选项可以进行版本重置,回退 git版本的管理,是通过指针管理的,那这个指针,名字叫做HEAD HEAD表示当前版本 HEAD^表示上一个版本 HEAD^^表示上上个版本 git reset --hard 版本id号 [root@localhost hello_git]# git log --oneline d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit [root@localhost hello_git]# git reset --hard HEAD^ HEAD 现在位于 34a9852 xu first commit [root@localhost hello_git]# ls test.txt 还可以使用git reset --hard 34a9852 指定版本号跟上述效果一样 `git log 对丢失回到此版本之后的版本` [root@localhost hello_git]# git log --oneline 34a9852 xu first commit
git查案所有版本变动日志
查看git所记录的你每一次版本提交与回退的日志 git reflog [root@localhost hello_git]# git reflog 34a9852 HEAD@{0}: reset: moving to HEAD^ d808cb5 HEAD@{1}: commit: 把test.txt文件名改成test2.txt 34a9852 HEAD@{2}: commit (initial): xu first commit [root@localhost hello_git]# git reset --hard d808cb5 HEAD 现在位于 d808cb5 把test.txt文件名改成test2.txt [root@localhost hello_git]# git log --oneline d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit
git stash临时空间
git stash 就是把暂存区还未提交的内容,临时存放到一个区域,便于日后再取回来使用 [root@localhost hello_git]# touch stash_test.txt [root@localhost hello_git]# git status # 位于分支 master # 未跟踪的文件: # (使用 "git add <file>..." 以包含要提交的内容) # # stash_test.txt 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) [root@localhost hello_git]# git add stash_test.txt [root@localhost hello_git]# git status # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 新文件: stash_test.txt # 1.git stash的使用 以上是通常的创建文件并存放暂存区的流程 但是假如这时候突然要你去做别的事情,比如再去开发另一个新功能,我们可以不删除这个文件,可以使用git stash放到临时区 [root@localhost hello_git]# git stash save "save stash.git.txt ing..." Saved working directory and index state On master: save stash.git.txt ing... HEAD 现在位于 d808cb5 把test.txt文件名改成test2.txt [root@localhost hello_git]# git status # 位于分支 master 无文件要提交,干净的工作区 2.git stash list查看临时保存中的文件 [root@localhost hello_git]# git stash list stash@{0}: On master: save stash.git.txt ing... 3.git stash pop 恢复最新的stash进度到工作区 / git stash pop stash_id 恢复指定的stash进度 [root@localhost hello_git]# git stash pop stash@{0} # 位于分支 master # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 新文件: stash_test.txt # [root@localhost hello_git]# git commit -m "提交了stash_test.txt文件" [master d16d294] 提交了stash_test.txt文件 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 stash_test.txt [root@localhost hello_git]# git status # 位于分支 master 无文件要提交,干净的工作区
git分支学习
1.查看当前 git branch [root@localhost hello_git]# git branch * master 2.创建一个user2分支 git branch user2 [root@localhost hello_git]# git branch user2 [root@localhost hello_git]# git branch * master user2 3.切换分支 [root@localhost hello_git]# git checkout user2 切换到分支 'user2' [root@localhost hello_git]# git branch master * user2 4.创建一个文件、跟踪并提交 [root@localhost hello_git]# echo "我是user2">user2.txt [root@localhost hello_git]# git add user2.txt [root@localhost hello_git]# git status # 位于分支 user2 # 要提交的变更: # (使用 "git reset HEAD <file>..." 撤出暂存区) # # 新文件: user2.txt # 检查日志 [root@localhost hello_git]# git log --oneline 800b648 user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 5.切换为master 再次检查日志 [root@localhost hello_git]# git log --oneline d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 会发现只有三条记录 6.可以选择删除这个分支的记录,也可以选择合并这个分支的提交记录合并到master 6.1删除改分支,改分支提交版本的信息也会随之删除 使用以下命令即可,不再演示 git branch -D user2 6.2合并user2分支到master主分支 [root@localhost hello_git]# git branch * master user2 [root@localhost hello_git]# git merge user2 更新 d16d294..800b648 Fast-forward user2.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 user2.txt [root@localhost hello_git]# git log --oneline 800b648 user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 7.当分支的提交记录合并后,该分支就可以删除了,随时用分支,随时创建即可 没有合并-D 合并以后删除用-d [root@localhost hello_git]# git branch -d user2 已删除分支 user2(曾为 800b648)。
git分支合并冲突如何解决
1.创建且切换一个新的分支 git checkout -b user3 2.在user3分支下,创建文件,且提交新的版本记录 echo "如何解决git分支合并冲突的问题" > test3.txt git add test3.txt git commit -m "user3 commit test3.txt" 3.回到master分支,创建同样的文件,其提交新的版本记录 [root@localhost hello_git]# git log --oneline 93d87b0 master commit test3.txt 800b648 user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit [root@localhost hello_git]# git checkout user3 切换到分支 'user3' [root@localhost hello_git]# git log --oneline 5cde4c5 user3 commit test3.txt 800b648 user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 4.此时在master分支上,合并user3分支,但是两分支都有test3.txt文件,并且里面都有内容,合并就会产生冲突,到底以哪一分支为准呢? 切换到master分支并合并user3 git checkout master git merge user3 5.此时cat test3.txt [root@localhost hello_git]# cat test3.txt <<<<<<< HEAD master创建test3.txt ======= 如何解决git分支合并冲突的问题 >>>>>>> user3 6.可以自由选择修改其中内容 [root@localhost hello_git]# vim test3.txt master创建test3.txt 如何解决git分支合并冲突的问题 7.添加并提交 git add . git commit -m "最终master人为合并了test3.txt内容"
git标签学习
git tag 给每一个git版本,加上一个标签 就是一个便于记忆的标签,可以是字符,可以是数字 1.可以直接输入,对最新的版本记录加上一个标签 [root@localhost hello_git]# git tag -a "v1.0" -m "test3.txt 1.0版本" 2.查看tag标签 [root@localhost hello_git]# git tag v1.0 v1.0.1 [root@localhost hello_git]# git log --oneline --decorate f26efa2 (HEAD, tag: v1.0, master) 最终master人为合并了test3.txt内容 93d87b0 master commit test3.txt 5cde4c5 (user3) user3 commit test3.txt 800b648 user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit [root@localhost hello_git]# git log --oneline --decorate --graph * f26efa2 (HEAD, tag: v1.0, master) 最终master人为合并了test3.txt内容 | | * 5cde4c5 (user3) user3 commit test3.txt * | 93d87b0 master commit test3.txt |/ * 800b648 user2提交 user2.txt文件 * d16d294 提交了stash_test.txt文件 * d808cb5 把test.txt文件名改成test2.txt * 34a9852 xu first commit 3.也可以指定commit id加上tag标签 [root@localhost hello_git]# git tag -a "v1.0.1" 800b648 -m "这是user2提交user2.txt文件的tag" [root@localhost hello_git]# git log --oneline --decorate f26efa2 (HEAD, tag: v1.0, master) 最终master人为合并了test3.txt内容 93d87b0 master commit test3.txt 5cde4c5 (user3) user3 commit test3.txt 800b648 (tag: v1.0.1) user2提交 user2.txt文件 d16d294 提交了stash_test.txt文件 d808cb5 把test.txt文件名改成test2.txt 34a9852 xu first commit 4.查看标签里面的具体信息,以及关联的版本记录的具体信息 git show v1.0 5.删除tag git tag -d v1.0.1
文章内容主要参考:b站linux超哥 https://www.bilibili.com/video/BV19K4y1H77x?p=1&vd_source=0318a6d26fb028b832726d62a0e9e2cb