介绍:分布式版本管理系统 =》常见的版本控制系统: svn(集中式), git(分布式)
1、安装git版本可以参见官网的安装方式
在linux服务器上安装git
--安装相应的依赖环境
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
--删除旧版本的git, yum会默认安装旧版本的git
yum remove git
git 的linux环境上安装的镜像地址: https://mirrors.edge.kernel.org/pub/software/scm/git/
--下载镜像,这边以2.36.1版本为例
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.36.1.tar.gz
--解压镜像
cd git-2.36.1.tar.gz
tar -zxvf git-2.36.1.tar.gz
--安装git
make configure
./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv
make all doc
make install install-doc install-html
echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
source /etc/bashrc
2、git在使用前需要做最小配置
# git 查看当前的git配置
git config # 可以选择查看哪个上下文件的配置
git config -l
# 在使用git的时候,需要做git用户名与邮箱的配置
git config user.name "your_name"; git config user.email "your_email@domain.com"
3、git创建仓库
a、从远程克隆仓库(本地无代码):如果线上已有代码,只需要克隆线上的代码下来开发,那么可以采用这种方式
//先cd到指定的目录下
git clone https://gitee.com/xxxx.git
b、除了克隆仓库(前提本地无代码),也可以直接拉取代码
//先cd到指定的目录下
git init //仓库初始化
git pull https://gitee.com/xxxx.git //拉取代码
git remote add origin https://gitee.com/xxxx.git
git push -u origin master
c、如果线上是空仓库,需要把线下的代码填充到线上
//先cd到指定的目录下
git init
git add . //把所有的内容添加到暂存区
git commit -m "first commit" //把暂存区的内容添加到工作区
git remote add origin https://gitee.com/xxxx.git
git push -u origin master
查看远程的仓库分支 git remote -v
4、git 的常用基本操作
git 的结构分成左图的情况,三个分区:工作区,暂存区,版本库
//查看git当前的状态
git status
//把文件从工作区提交到暂存区
git add 文件名... // 表示把指定的文件存放到暂存区
git add . //表示把当前所有工作区的文件全部添加到暂存区
git add -u //他仅监控已经被add的文件(即tracked file),他会将被修改或删除的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git restore --staged 【文件名】 //表示把指定的文件名的从暂存区放回到工作区
git restore --staged . //表示把所有的暂存区文件放回到工作区
git rm --cached 【文件名】 // 表示从暂存区删除指定的文件夹,如果是新增的文件,那么会放回到工作区, 如果是已提交的,那么会在暂存区生成一个删除的记录供提交
git rm --cached -r . // 表示删除当前在暂存区的所有文件
//进行文件重命名
git mv 需要更改的文件名 新的文件名 //这个执行后就自动add到暂存区,可以直接commit
//把文件从暂存区提交
git commit -m "变更的备注或理由方便后面查看"
//把git add .与git commit -m 合并后
git commit -am "这个是合并后的效果"
//把文件推送到版本库中
git push
//查看提交的信息
git log
删除文件的方式
git rm <filename> //表示删除了指定的文件,并且把删除提交到了暂存区
rm <filename> // 删除了指定的文件,但是没有把删除提交到暂存区
git reset HEAD <filename> // 表示把指定的文件从暂存区恢复到工作区操作, 如果没有声明指定文件,那么则是全部文件从暂存区恢复到工作区的操作, 这里的HEAD是指向当前的分支
git checkout -- <filename> // 表示撤消对指定文件的修改
git checkout -- . // 表示撤消对所有文件的修改
git checkout <commit_id> // 表示切换到指定的提交的分支上
5、git查看历史版本
//查看历史版本
git log
//简洁的查看历史版本
git log --oneline
//log 以图形化的格式显示
git log --graph
//如果要查看最近的2条记录可以使用
git log -n2
git log -n2 --oneline //简洁的显示
//查看所有分支的提交
git log --all
//查看所有分支的提交并以图表的形式展示
git log --all --graph
//查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git reflog
//根据git日志查找对应的提交内容
git log --grep="fix"
6、分支操作
git checkout -b <branchname> [remote] [branch] // 表示创建新分支,remote表示远程的源, branch表示该分支需要建立在远程的指定的分支上
git checout - // 表示切换到master分支
git checkout <branchname> // 表示切换当前分支到指定的分支上,前提是该分支存在
git branch -d <branchname> // 删除分支,但是如果该分支上有未处理的数据,那么会删除失败
git branch -D <branchname> // 强制删除分支,并且也会删除上面未提交的数据
git merge <branchname> // 表示把指定的分支合并到当前分支上
// 通常来讲git merge 分支的时候,默认的模式是fast-forward模式,比如master合并aaa分支后,相当于把master的指针指向了aaa的提交,如果采用的是--no-ff模式如 git merge aaa --no-ff
这时会在log那边重新生成一条合并记录,即使是删除分支后,那么这个记录还是存在如下图
git branch [-a] // 查看分支
7、git回退版本
// 回退到上一版本
git reset --hard HEAD^ // 一个^表示前面一个版本, ^^表示前面两个版本,以此类推
git reset --hard HEAD~1 // 数字表示前面的版本,1表示前面一个版本,以此类推
// 回退到指定的版本
git reset --hard commit_id // commit可以根据git log进行查看,可以往前回退,往后回退,如果需要往前回退,可以用git reflog查看操作日志
8、git变基
7、检看之前的版本
//查看之前的版本 git log --oneline //切到指定的版本查看,这时不会影响当前的项目状态 git checkout <commit> //查看完后切换到当前分支 git checkout master //但是注意如果使用以下命令就会更改当前的项目状态 git checkout <commit><file> 比如 git checkout 1d746c3 index.html //这时会切换到主分支,并且当前状态已更改
8、回滚错误的修改
//恢复git指定修改的文件 git checkout <file> //恢复所有修改的文件 git checkout . //把暂存区的内容取消到未暂存区 git reset <file> //把所有暂存区的内容取消到未暂存区 git reset //把提交区的撤消, 用revert进行撤消,但是撤消后会有撤消记录,需要提交,内容不会返回工作区 git revert HEAD //用reset进行撤消,不会产生提交记录,并且内容不会返回工作区 git reset --hard <commit> //把未commit状态的内容返回到工作区 git reset --soft HEAD~
9、git合并提交
# 编辑 hello.py 和 main.py git add hello.py git commit # 意识到你忘记添加 main.py 的更改 git add main.py git commit --amend --no-edit
10、rebase的使用
git checkout -b fix origin/master //编辑代码有两次提交 git rebase -i HEAD~2 //合并提交 --- 2表示合并两个 git rebase master---->解决冲突--->git rebase --continue git checkout master git merge fix git push
注意:这样的好处是在于多次提交合并容易产生多次冲突,rebase -i后进行统一,然后解决一次即可