git安装、常用命令、使用教程
git安装、常用命令、使用教程
一、Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
二、SVN与Git的最主要的区别?
Git 是一种分布式版本控制系统,而SVN是一种集中式版本控制系统。在Git中,每个开发者都有一个完整的本地代码仓库,可以在本地进行版本控制和更改记录,然后与其他开发者共享更新。而在SVN中,所有的代码和历史记录都保存在中央仓库中,开发者需要与中央仓库进行交互才能进行版本控制和更改记录。
三、git常用命令
1.新建代码库
# 在当前目录新建一个Git代码库
git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史
git clone [url]
2.配置
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
3.增删文件
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
4.提交代码
# 提交暂存区到仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
5.分支
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 合并指定分支到当前分支
git merge [branch]
# 删除分支
git branch -d [branch-name]
6.标签
# 列出所有tag
git tag
# 新建一个tag在当前commit
git tag [tag]
# 删除本地tag
git tag -d [tag]
# 查看tag信息
git show [tag]
# 提交指定tag
git push [remote] [tag]
7.查看
# 显示有变更的文件
git status
# 显示当前分支的版本历史
git log
# 每个提交历史一行显示
git log --oneline
# 搜索提交历史,根据关键词
git log -S [keyword]
# 显示过去5次提交
git log -5 --pretty --oneline
# 显示某次提交的元数据和内容变化
$ git show [commit]
8.远程同步
# 下载远程仓库的所有变动
git fetch [remote]
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show [remote]
# 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
# 推送所有分支到远程仓库
git push [remote] --all
9.撤销
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
# 暂时将未提交的变化移除,稍后再移入
git stash
git stash pop
10.其他
# 生成一个可供发布的压缩包
git archive
四、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超哥:3小时学会Git教程_入门到精通_基础到高级_哔哩哔哩_bilibili
csdn liangyi_csdn:[Git常用命令及方法大全_git命令_liangyi_csdn的博客-CSDN博客](https://blog.csdn.net/Android_liangyi/article/details/120860802?ops_request_misc={"request_id"%3A"168987151216800225539786"%2C"scm"%3A"20140713.130102334.."}&request_id=168987151216800225539786&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogtop_positive~default-1-120860802-null-null.268v1koosearch&utm_term=git 常用命令&spm=1018.2226.3001.4450)