GIT
下载安装
linux
使用下方命令进行安装
yum -y install git
使用git -v
查看安装信息
windows
下载安装包跟随指引安装:https://gitforwindows.org/
使用git -v
查看安装信息
基本概念
git分为三个区域
- 工作区
项目目录,在这里进行代码增删改操作。
工作区的文件分为已跟踪和未跟踪,添加到暂存区的文件是被git所跟踪管理的。
- 暂存区
也是临时存储区域,可以将工作区的文件添加到这里,之后使用命令提交到仓库中。
- 仓库
这里包含了项目的历史版本记录,当代码出现问题,可以从这里恢复。仓库分为本地仓库和远程仓库,仓库中可以有若干个分支,每个分支之间互不干扰,可以让多个人员在一个仓库中工作。
常用操作
在使用前先配置用户名和邮箱,以后每次提交都会携带这些信息。
git config --g user.name "Your Name"
git config --g user.email "your.email@example.com"
创建仓库
本地仓库
创建或进入已有的项目目录,执行初始化命令。
git init
当目录中出现.git
文件夹时,说明创建成功。
也可以使用git init -/directory
来指定仓库的创建位置。
如果已有仓库,可以 从仓库中克隆。
git clone <repo> <directory>
服务器远程仓库
新建一个用户用来管理仓库。
useradd git -g git
进入想要创建仓库的目录。
cd /仓库
初始化仓库,-bare
表示不创建工作区,主要用于作为远程仓库来接收和存储。
git init -bare
更改仓库所属用户。
chown -R git /仓库
在要使用的项目中添加远程仓库。
git remote add origin 用户@服务器地址:/仓库
GitHub
提交到本地仓库
# 选定文件,添加到暂存区,.表示当前工作区所有文件
git add .
# 将暂存区的内容提交到本地仓库中,-m 表示本次提交携带提交信息
git commit -m ""
操作远程仓库
添加远程仓库
其中远程仓库名是自己指定的,方便我们分辨和操作仓库。
git remote add 远程仓库名 仓库地址
查看远程仓库
git reote -v
设置默认的远程仓库和分支
git push -u 远程仓库名 分支
git branch --set-upstream-to=仓库名/分支 分支
下次再执行
git pull
和git push
时,就可以省略仓库名和分支。
获取代码
git fetch 远程仓库名
可以配合git merge
命令合并到你当前的分支。
获取代码并合并
这个命令相当于上面两个命令的合并。
git pull 远程仓库名 分支
推送代码到仓库
如果本地分支和远程分支一样,可省略:及后面的。
git push <远程主机名> <本地分支名>:<远程分支名>
操作分支
创建分支
git branch 分支名
切换分支
git checkout 分支名
下面的命令是创建并切换的合并操作。
git checkout -b 分支名
删除分支
git checkout -d 分支名
查看分支
git branch
这个命令会列出所有的分支,并在当前分支前方表上*
号。
合并分支
git merge 分支名
解决合并冲突
当我们的两个分支有文件内容出现冲突时,自动合并就会失败,需要我们手动处理冲突的地方。
现有两个分支有文件发生冲突:
分支A进行了一次修改
分支B进行了一次修改
在分支合并时就会出现冲突,git会在冲突的文件中标出冲突的位置,手动修改一下,选择保留那个或者都保留。
<<<<<<< HEAD
分支A进行了一次修改
=======
分支B进行了一次修改
>>>>>>> B
暂存工作区
当目前的分支开发还不想提交,而又需要处理其他分支的代码时,可以把当前工作区和暂存区暂时保存到一个栈中,之后切换到其他分支时,也不会印象保存起来的工作区,当处理完其他分支时,切换换来
暂存当前的工作区和暂存区,save
选项可以添加备注,方便后续恢复
git stash
恢复最近的一次暂存
git stash apply
但是这种方式不会删除stash中的信息,需要我们手动删除
git stash drop
恢复并删除stash中的信息
git stash pop
当存储的工作区较多时,查看列表
git stash list
根据序号配合drop命令删除信息
git stash drop stash@{n}
版本管理
每次使用git commit
命令,就会形成一个历史记录,如果当前版本的代码出现问题,可以回滚代码到上个完好的记录。
查看历史记录
使用git log
命令查看详细的提交历史记录,其中包含hash值、提交作者、提交日期以及提交备注。
而git log --oneline
显示的记录较为简洁,只有一行,内容分别是短hash值和提交备注。
git log -n num
可自定义展示的最新几条记录。
回滚代码
git reset
命令可以切换当前的代码版本,有三种模式。
--soft
HEAD改变,工作区和暂存区不变。--mixed
默认的选项,HEAD、暂存区重置,工作区不变。hard
HEAD、暂存区和工作区都重置。
后面跟上历史记录的哈希值就可以回滚到对应的版本。
但是这种方法回滚之后,会丢失历史记录,原历史记录:
# 查看历史记录
$ git log --oneline
e3445b4 (HEAD -> master) 合并分支
3893d23 (B) B分支提交
ae2d7ef (A) A分支提交
49da844 源文件提交
#回滚到A分支提交
git reset --hard ae2d7ef
#再次查看,在A分支提交后的历史记录不见了。
$ git log --oneline
ae2d7ef (HEAD -> master, A) A分支提交
49da844 源文件提交
这个命令是移动HEAD指针位置,而git log
只能查看HEAD指针前的记录,如果不想回退或误操作相还原回去怎么办,这时可以使用git reflog
查看本地仓库HEAD指针的移动历史,里面自然有全部的历史记录。
而git revert
命令也可以实现回滚版本,不过它不是回到历史版本,而是创建一个相反操作的提交达到回滚的效果。既然是提交,难免会出现冲突,如果出现冲突,也需要自己手动处理冲突,之后把处理后的文件添加到暂存区,然后执行git revert --continue
即可完成撤销提交。
hook
是Git内置的一种机制,允许在特定事件发生时执行自定义脚本。Git Hook可以在客户端和服务器端配置,经常用于自动化任务、增强开发流程以及确保代码质量。
常用钩子(hook)
所属端 | hook | 触发时机 | 作用 |
---|---|---|---|
客户端 | pre-commit | 在提交完成之前 | 代码格式化、自动化测试、检查代码 |
commit-msg | 在携带提交信息的提交完成之前 | 检查提交信息格式和内容 | |
post-commit | 在提交完成之后 | 自动部署测试 | |
pre-push | 在提交推送到远程仓库之前 | 检查推送的内容是否符合规定 | |
pre-rebase | 在变基之前 | 阻止或检查 | |
服务端 | pre-receive | 在接收到推送之前 | 在服务器端进行检查 |
update | 在接收到推送准备更新,例如分支时触发 | 权限控制、分支保护 | |
post-receive | 在接收推送完成之后 | 自动部署 |
如何使用
在仓库的.git/hooks
目录下,创建对应名称的文件,写上要执行的代码就行了。
如果脚本没有执行权限还需要加上执行权限。
chmod +x post-receive
hooks目录下本身也有一些示例脚本。。
示例:服务端自动部署
当服务端接收到推送之后,自动部署项目。
创建好部署文件夹并初始化git,且操作的用户要有部署路径的操作权限。
#!/bin/bash
# 设置工作目录
WORK_DIR="/部署路径"
REPO_DIR="/仓库路径"
# 进入部署目录
cd $WORK_DIR || exit 1
# 拉取最新代码并重置工作目录
git fetch $REPO_DIR master
git reset --hard FETCH_HEAD
# 后续可添加其他部署操作,例如安装依赖、重启服务等
# 完成部署
exit 0
多人使用的hook
通常.git
文件夹并不会提交推送的,如果想要团队使用相同的hook,可以创建文件夹存放脚本并设置为默认脚本目录。
git config core.hooksPath .githooks