Git版本控制与协作
Git 协作流程
- workspace:工作区(代码区)
- staging area:暂存区/缓存区。
- local repository:本地仓库,也就是
.git目录
,所有关于此项目的数据都存放在这里。 - remote repository:远程仓库,也就是
http://xxxx.com/app/api.git
,通常使用origin
作为别名标识远程仓库。
master 分支(正式服)
master
永远处于稳定状态,这个分支代码可以随时用来部署。不允许
在该分支直接提交代码,只能通过develop分支
合并过来。该分支一般设置成分支保护
状态,只允许管理员操作。
develop 分支(测试服)
开发分支,包含了项目最新的功能和代码,同样不允许
直接提交到该分支中,只能通过feature/xxx
分支合并过来。一般develop分支需要部署到测试服务器中,给产品和测试人员测试新功能。同样一般设置成分支保护
状态,由代码审核人员操作。
注意:因为多个人可能同时合并到develop,可能会出现代码冲突
。在合并前,先要拉取最新的develop分支
的代码后,在将develop合并到feature/xxx分支,然后再将feature/xxx分支push推送到线上该分支中,并在远程申请合并到develop分支。管理员审核代码无问题后,同意合并[见下图]。
feature 分支(功能开发分支)
新功能开发,或者bug修改,请从develop
分支开出一个feature
分支,分支名约定为feature/xxx
,开发完成后合并回develop
分支并且删除这个feature
分支,相应的操作如下:
# 将 工作空间 切换到开发分支 develop
git checkout develop
# 拉取origin的develop分支到 工作空间
git pull origin develop
# 从develop上切出一条自己的feature/xxx分支
git checkout -b feature/xxx
# 写代码,提交,写代码,提交。。。
git add .
git commit -a -m "功能修改备注1"
git checkout develop # 切换到develop分支
git pull origin develop # 拉取最新代码
git checkout feature/xxx # 切换到feature/xxx分支
git merge develop # 将develop合并到feature/xxx分支,并解决冲突
git push origin feature/xxx # 将feature/xxx分支推送到线上的对应分支
# 在网页中申请合并到develop分支,为什么会在线上申请呢?因为网页上很方便审核代码,鼠标点点点就可以看到修改的代码了。
# 分支合并完后,删除该分支
$ git branch -d feature/xxx
Git常用命令
创建仓库命令
# 初始化仓库,也就是创建.git目录
git init
# 拷贝一份远程仓库,也就是下载一个项目。
git clone <url> [文件夹]
提交与修改
# 添加文件到暂存区
git add [dir/file]
# 提交暂存区到本地仓库
git commit -m [message]
git commit [file1] [file2] ... -m [message]
git commit -a # 可以不执行add直接提交
# 查看仓库当前的状态,显示有变更的文件
git status
# 比较文件的不同,即暂存区和工作区的差异
git diff [file]
# 显示出branch1和branch2中差异的部分
git diff branch1 branch2 --stat
git diff branch1 branch2 # 详情
# 回退版本
git reset --mixed [版本] 默认模式,影响区域为,HEAD(commit):是,缓存区(add):是,工作区(代码):否
git reset --soft [版本] 影响区域为,HEAD:是,缓存区:否,工作区:否
git reset --hard [版本] 影响区域为,HEAD:是,缓存区:是,工作区:是
git reset --hard origin/master # 将本地的状态回退到和远程的一样
git reset –-hard HEAD~3 # 回退上上上一个版本
git reset 052e # 回退到指定版本
git reset HEAD~1 hello.php # 回退 hello.php 文件的版本到上一个版本
远程操作
# 远程仓库操作
git remote
git remote add [别名] [url]
# 从远程获取代码库
git fetch
git fetch [alias] # 获取远程所有的分支
git merge [alias]/[branch] # 获取远程某个分支
# 下载远程代码并合并
git pull
git pull origin master
git pull origin master:brantest # 将远程origin的master分支拉取过来,与本地的brantest分支合并
# 上传远程代码并合并
git push
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master
分支管理
# 创建分支
git branch (branchname)
# 切换分支
git checkout (branchname)
# 列出分支
git branch
# 删除分支
git branch -d (branchname)
# 分支合并
git merge (branchname)
其他命令
# 查看历史提交记录
git log
# 配置与记住账号密码
git config --global credential.helper store
# 中文文件名或者路径被转义成\xx\xx\xx之类的解决方法
# 要注意的是,这样设置后,你的git bash终端也要设置成中文和utf-8编码。才能正确显示中文
git config --global core.quotepath false
Git私有项目 access denied
出现这个错误说明系统凭据中已经保存了此域的账号,在
控制面板=>用户账户=>凭据管理器=>windows凭据
中删除该域后,重新执行git push会弹出输入账号密码框
Git项目实战流程图
其他业务场景
将远程仓库的master分支的代码拉取到已经存在文件的文件夹中
业务描述:线上服务器未使用git,现在需求要使线上服务器直接使用git更新现有代码。
# 步骤如下:
# 使用对比工具等,手动同步git的master到线上服务器。
# 登录到线上服务器,安装git软件,这里就略过。
cd /data/wwwdata/testweb
git init # 初始化仓库
git remote add origin https://github.com/xxx/xxxx.git # 添加远程仓库
git fetch origin master # 获取远程仓库的master分支,这你只拉取了指定分支
# 如果以下命令不加--allow-unrelated-histories参数,会提示失败
# refusing to merge unrelated histories
# 两个分支是两个不同的版本,具有不同的提交历史
# git pull origin master --allow-unrelated-histories
git reset --hard origin/master # 将本地的状态回退到和远程的一样
# 解决冲突,一般这里没冲突,因为第一步已经将代码手动同步了
git代理
在使用github时实际操作时挂V代理后git依然无法走代理
经常出现超时
,这点一定要注意。如果要使用代理,需使用如下方法实现:
# 临时代理(注意 git -c 要在 clone/pull 前面)
git -c http.proxy="http://127.0.0.1:10809" clone https://github.com/xxx/yyy.git
git -c http.proxy="http://127.0.0.1:10809" pull
# 全局代理
# git config --global http.proxy http://proxyUsername:proxyPassword@proxy.server.com:port
# git config --global https.proxy http://proxyUsername:proxyPassword@proxy.server.com:port
# git config --global 协议.proxy 协议://ip地址:端口号
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
git config --global http.proxy 'socks5://127.0.0.1:7891'
git config --global https.proxy 'socks5://127.0.0.1:7891'
# 取消全局代理
git config --global --unset http.proxy
git config --global --unset https.proxy
# 设置仅针对某个网站的代理:比如GitHub
#只对github.com
git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global http.https://github.com.proxy socks5://127.0.0.1:7891
#取消代理
git config --global --unset http.https://github.com.proxy
git诊断脚本
如果使用脚本, 或者在WEBHOOK等工具中, 无法执行git pull命令, 可以使用git诊断命令, 将所有信息打印到日志中来调试.
#!/bin/bash
# 环境变量和配置文件位置的差异。虽然你已经在 /root/.git-credentials 中存储了凭证,但 Webhook 脚本可能没有正确读取这个配置文件。就需要账号密码才能执行git pull
#export HOME=/root
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 设置工作目录
WORK_DIR="/data/webdata/szspia.org"
echo "----------------------------"
echo "[$(date "+%Y-%m-%d %H:%M:%S")] 开始执行Git更新脚本"
echo "工作目录: $WORK_DIR"
echo "当前HOME: $HOME" # 验证HOME设置
# 输出环境信息
echo "当前用户: $(whoami)"
echo "环境变量:"
env | sort | grep -E 'PATH|HOME|USER'
echo
# 检查目录是否存在
if [ ! -d "$WORK_DIR" ]; then
echo "错误: 目录 $WORK_DIR 不存在"
exit 1
fi
# 进入工作目录
cd "$WORK_DIR" || { echo "错误: 无法进入目录 $WORK_DIR"; exit 1; }
# 检查目录权限
echo "目录权限:"
ls -ld "$WORK_DIR"
ls -ld "$WORK_DIR/.git"
echo
# 显示Git配置
echo "Git配置:"
git config --list
echo
# 检查当前分支
CURRENT_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null)
if [ -z "$CURRENT_BRANCH" ]; then
echo "错误: 无法确定当前分支"
git status
exit 1
fi
echo "当前分支: $CURRENT_BRANCH"
# 检查是否有未提交的修改
echo "检查工作树状态:"
git status --short
echo
# 执行拉取并捕获详细输出
echo "开始执行 git pull origin $CURRENT_BRANCH"
echo "命令输出:"
if ! git pull origin "$CURRENT_BRANCH" 2>&1; then # 核心代码
echo "错误: git pull 失败"
exit 1
fi
echo "[$(date "+%Y-%m-%d %H:%M:%S")] Git更新完成"
echo "----------------------------"
最后更新于 2025-05-29 10:05:09 并被添加「git」标签,已有 1104 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭