git操作及分支策略
GIT
1.基本操作[日常工作中常用操作] 2.分支策略[工作中GIT分支管理规范] 3.管理脚本[常规操作提炼] 4.参考资料及教程[网上优秀文档资料]
基本操作
常用命令/常规操作
大部分场景下只需要熟悉下面的命令即可
- 配置用户名,Email地址
git config --global user.name "biby" git config --global user.email "[email protected]"
- 创建版本库,初始化GIT仓库并提交远程仓库
mkdir biby_tapin cd biby_tapin git init git remote add origin {远程仓库地址} git remote -v //核实远程仓库URL
- 日常编码配合操作
// clone 远程分支 git clone // 添加到仓库[添加到暂存区] git add -m 提交说明 // 提交到仓库[把暂存区的所有内容提交到当前分支] git commit // 拉取 git pull // 推送 git push // 工作区状态 git status // 切换分支 git checkout // 查看所有本地分支 git branch // 查看素有远程分支 git branch -a // 查看工作区和版本库里面最新版本的区别 git diff <file>
进阶操作
熟悉这部分操作可以更好的使用GIT
- 删除分支
删除本地/远程分支
// 删除本地分支 git branch -d feature_biby_xxx git branch -D feature_biby_xxx //强制删除,当分支有修改未提交到主分支时需要使用强制删除参数才能删除 // 删除远程分支 git push origin :feature_biby_xxx
- 创建分支
git checkout -b develop origin/master //git checkout命令加上-b参数表示创建并切换 相当于以下两条命令 git branch develop git checkout develop
- 撤销修改
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,第二步按工作区操作
// 工作区 git checkout -- <file>可以丢弃工作区的修改 // 暂存区 //用命令git reset HEAD <file> 或者 git reset -- 可以把暂存区的修改撤销掉 重新放回工作区 git reset HEAD <file> git reset -- file
- 日志
显示从最近到最远的提交日志
已经提交了不合适的修改到版本库时,想要撤销本次提交[版本回退]
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,再往上的版本用格式:HEAD~100,表示往上100个版本
git log git log --pretty=oneline//格式化 comimt id && commit 提交说明 git reset --hard HEAD^ git reset --hard <commit id> //指定回退到某个版本 git reflog //记录每一次命令
- 冲突解决
推荐使用PhpStorm/WebStorm等IDE自带工具 Resolve Conflicts - stash
工作进行到一半无法提交需要修改其他紧急问题时使用
git stash //把当前工作现场“储藏”起来 git stash list //存储列表 git stash apply //恢复存储 git stash drop //删除存储 git stash pop //恢复同时删除存储 git stash apply stash@{0} //指定恢复stash
- 文件比较
// 两个版本间所有变更的文件列表 git diff --name-status HEAD~2 HEAD~3 // 两个分支之间修改的文件 git diff feature_biby_01 feature_biby_02 --stat
扩展操作
- 列出所有远程分支及最后commit时间并按时间排序
for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r
分支策略
享受GIT带来方便的同时,如果不加注意,很可能会留下一个枝节蔓生、四处开放的版本库,到处都是分支,完全看不出主干发展的脉络。(摘自阮一峰博客)
- 可能发展成为难以管理的分支
(摘自阮一峰博客)
- 我们现有分支图表
遵循分支策略的好处是,使得版本库的演进保持简洁,主干清晰,各个分支各司其职、井井有条
- 可选分之策略
1.gitflow 的流程
一些管理脚本
创建release分支并合并分支
可优化:分支切换失败 合并失败等异常处理
#!/bin/bash echo "请选择发布分支" read release_name release=$(git branch | grep $release_name) if [ -n "$release" ]; then echo "发布分支存在..." else git checkout -b $release_name origin/master echo "发布分支创建完成..." fi echo "请选择合并分支" read branch_name branch=$(git branch | grep $branch_name) if [ -n "$branch" ]; then echo "合并分支存在,更新分支..." git pull origin $branch_name else echo "合并分支不存在,拉取远程分支..." git fetch origin $branch_name git checkout $branch_name git pull origin $branch_name git checkout $release_name fi echo "合并分支..." git merge $branch_name echo "合并分支完成..."
清除分支
#!/bin/bash echo "请选择删除分支" read branch_name del_branch_name=$(git branch | grep -w $branch_name) if [ -z "$branch_name" ]; then echo "本地分支不存在" else git branch -d $branch_name > /home/biby/www/haiji/git_operate.log fi del_origin_branch_name=$(git branch -a | grep -w $branch_name) if [ -z "$del_origin_branch_name" ]; then echo "远程分支不存在" else git push origin :$branch_name > /home/biby/www/haiji/gitt_operate.log fi echo "删除分支完成..."
清除指定时间长度未提交/修改过分支
#!/bin/bash for branch in `git for-each-ref --sort=committerdate --format='%(HEAD) %(refname:short)-%(committerdate:raw)'`; do branch_name=$(echo $branch | cut -d "-" -f 1); branch_last_commit_time=$(echo $branch | cut -d "-" -f 2); str="+08" result=$(echo $branch_last_commit_time | grep "${str}") if [ "$result" != "" ]; then continue fi #当前时间戳 timestamp=$(date +%s) branch_last_commit_time=$(echo $branch_last_commit_time | sed 's/ //g') timestamp=$(echo $timestamp | sed 's/ //g') let branch_last_commimt_time_to_second=$timestamp-$branch_last_commit_time #半年大约是 15552000 秒 #五个月大约是 12960000 秒 #三个月大约是 7776000 秒 clear_time=7776000 if [ "$branch_last_commimt_time_to_second" -gt "$clear_time" ]; then branch_name=${branch_name##*/} #从变量branch_name的开头,删除最长匹配*/的子串 echo $branch_name; del_branch_name=$(git branch -a | grep -w $branch_name) if [ -z "$del_branch_name" ]; then echo "本地分支不存在" else git branch -d $branch_name > /home/biby/www/haiji/git_operate.log fi del_origin_branch_name=$(git branch -a | grep -w $branch_name) if [ -z "$del_origin_branch_name" ]; then echo "远程分支不存在" else git push origin :$branch_name > /home/biby/www/haiji/git_operate.log fi echo "删除分支完成..." fi done
参考资料
相关推荐
baolen 2020-08-15
炼金术士lee 2020-08-15
huangchunxia 2020-08-07
lljhi0 2020-07-21
huangchunxia 2020-07-08
zhangxing 2020-07-05
ArkShen 2020-07-05
nebulali 2020-07-05
formula 2020-11-12
huhongfei 2020-11-05
乾坤一碼農 2020-10-27
liumengyanysu 2020-10-22
E哥的aws认证攻略 2020-10-15
tianyafengxin 2020-10-08
guying 2020-10-05
好脑筋不如烂笔头 2020-09-17