Git版本控制与协作

Git 协作流程

git-command.jpg

  • 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项目实战流程图

git协作.png
1.png
2.png
3.png

其他业务场景

将远程仓库的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

相关文章

此处评论已关闭