zoukankan      html  css  js  c++  java
  • GIT简易操作手册与分支管理策略

    主要基于自己日常开发中常用项的总结,以及实践过的分支管理策略,附上运行中的shell小工具。

    GIT

    1.基本操作[日常工作中常用操作]
    2.分支策略[工作中GIT分支管理规范]
    3.管理脚本[常规操作提炼]
    4.参考资料及教程[网上优秀文档资料]
    

    基本操作

    常用命令/常规操作
    大部分场景下只需要熟悉下面的命令即可
    
    • 配置用户名,Email地址
    git config --global user.name "biby"
    git config --global user.email "bibyzhang@163.com"
    
    • 创建版本库,初始化GIT仓库并提交远程仓库
    mkdir biby
    cd biby
    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 ,第二步按工作区操作
    // 工作区
    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带来方便的同时,如果不加注意,很可能会留下一个枝节蔓生、四处开放的版本库,到处都是分支,完全看不出主干发展的脉络。(摘自阮一峰博客)
    
    • 可能发展成为难以管理的分支
      (摘自阮一峰博客)

    ![](file:///var/folders/dz/8qljh5rx0d7fqz9l8mfq0n440000gn/T/WizNote/8dd87d50-e6c3-4f86-b1b4-9fdb710ae782/index_files/56539828.png)

    • 我们现有分支图表

    遵循分支策略的好处是,使得版本库的演进保持简洁,主干清晰,各个分支各司其职、井井有条

    • 可选分之策略(分支管理实践)
    1.gitflow
     git-flow 围绕的核心概念是版本发布(release)
    2.GitHub flow
     当需要进行任何修改时,总是从 master 分支创建新分支
     完成之后通过 pull request 和相关的代码审查来合并回 master 分支
     GitHub flow 要求项目有完善的自动化测试、持续集成和部署等相关的基础设施
    3.单主干
     特点是所有团队成员都在单个主干分支上进行开发
     开发人员不需要频繁在不同的分支之间切换
     因为主干分支是所有开发人员公用的,一个开发人员引入的 bug 可能对其他很多人造成影响
    

    git-flow 是目前流传最广的 Git 分支管理实践,也比较适合我们现有的开发模式。
    git-flow 流程中包含 5 类分支,分别是 master、develop、新功能分支(feature)、发布分支(release)和 hotfix。
    (git-flow模式)(图片来源网络)

    其中
    常设分支为:
    主分支 Master(用于正式发布)
    代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布
    开发分支 Develop(用于日常开发)
    主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop
    这个分支可以用来生成代码的最新开发版本。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)
    临时性分支为:

    功能(feature)分支
    功能(feature)分支 第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop
    功能分支的名字,采用feature-*的形式命名,我们采用 feature-<常用昵称>-* 形式
    开发完成后,将功能分支合并到develop分支
    
    创建一个功能分支:
    git checkout -b feature-biby-activity develop
    
    开发完成后,将功能分支合并到develop分支:
    git checkout develop
    git merge --no-ff feature-biby-activity
    
    删除feature分支:
    git branch -d feature-biby-activity
    
    预发布(release)分支
    预发布(release)分支 预发布版本是测试使用,预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试
    预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支
    功能分支的名字,采用release-*的形式命名,我们采用 release-<常用昵称>-* 形式
    
    创建一个预发布分支:
    git checkout -b release-biby-activity develop
    
    确认没有问题后,合并到master分支:
    git checkout master
    git merge --no-ff release-biby-activity
    
    # 对合并生成的新节点,做一个标签
    git tag -a activity
    
    再合并到develop分支:
    git checkout develop
    git merge --no-ff release-biby-activity
    
    最后,删除预发布分支:
    git branch -d release-biby-activity
    
    修补bug(fixbug)分支
    修补bug分支是从Master分支上面分出来的
    修补结束以后,再合并进Master和Develop分支
    它的命名,可以采用fixbug-biby-activity的形式
    创建一个修补bug分支:
    git checkout -b fixbug-biby-activity master
    
    修补结束后,合并到master分支:
      git checkout master
      git merge --no-ff fixbug-biby-activity
      git tag -a activity—bug
    
    再合并到develop分支:
    git checkout develop
    git merge --no-ff fixbug-biby-activity
    
    最后,删除"修补bug分支":
    git branch -d fixbug-biby-activity
    

    一些管理脚本

    创建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/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/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/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/git_operate.log
            fi
    
            echo "删除分支完成..."
        fi
    done
    

    参考资料

    1.阮一峰_GIT分支管理策略
    2.廖雪峰GIT教程
    3.腾讯云GIT之南

  • 相关阅读:
    虚拟ip配置
    file命令
    df 和du 命令统计磁盘空间不准确
    硬件防火墙品牌排名
    042_翻转单词顺序
    hdu 5057 Argestes and Sequence
    Python+Django+SAE系列教程11-----request/pose/get/表单
    管道(Pipe)/createPipe
    Java的递归算法
    墨菲定律、二八法则、马太效应、手表定理、“不值得”定律、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原理、钱的问题、奥卡姆剃刀等13条是左右人生的金科玉律
  • 原文地址:https://www.cnblogs.com/biby/p/12830842.html
Copyright © 2011-2022 走看看