Skip to content

GIT

下载安装

linux

使用下方命令进行安装

yum -y install git

使用git -v查看安装信息

windows

下载安装包跟随指引安装:https://gitforwindows.org/

使用git -v查看安装信息

基本概念

git分为三个区域

  • 工作区

​ 项目目录,在这里进行代码增删改操作。

​ 工作区的文件分为已跟踪和未跟踪,添加到暂存区的文件是被git所跟踪管理的。

  • 暂存区

​ 也是临时存储区域,可以将工作区的文件添加到这里,之后使用命令提交到仓库中。

  • 仓库

​ 这里包含了项目的历史版本记录,当代码出现问题,可以从这里恢复。仓库分为本地仓库和远程仓库,仓库中可以有若干个分支,每个分支之间互不干扰,可以让多个人员在一个仓库中工作。

常用操作

在使用前先配置用户名和邮箱,以后每次提交都会携带这些信息。

bash
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

提交到本地仓库

bash
# 选定文件,添加到暂存区,.表示当前工作区所有文件
git add .
# 将暂存区的内容提交到本地仓库中,-m 表示本次提交携带提交信息
git commit -m ""

操作远程仓库

添加远程仓库

其中远程仓库名是自己指定的,方便我们分辨和操作仓库。

git remote add 远程仓库名 仓库地址

查看远程仓库

git reote -v

设置默认的远程仓库和分支
  • git push -u 远程仓库名 分支

  • git branch --set-upstream-to=仓库名/分支 分支

    下次再执行git pullgit 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会在冲突的文件中标出冲突的位置,手动修改一下,选择保留那个或者都保留。

text
<<<<<<< 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命令可以切换当前的代码版本,有三种模式。

  1. --soft HEAD改变,工作区和暂存区不变。
  2. --mixed默认的选项,HEAD、暂存区重置,工作区不变。
  3. hard HEAD、暂存区和工作区都重置。

后面跟上历史记录的哈希值就可以回滚到对应的版本。

但是这种方法回滚之后,会丢失历史记录,原历史记录:

bash
# 查看历史记录
$ 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,且操作的用户要有部署路径的操作权限。

bash
#!/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