git操做及分支策略

GIT

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

基本操做

经常使用命令/常规操做
大部分场景下只须要熟悉下面的命令便可
  • 配置用户名,Email地址
git config --global user.name "biby"
git config --global user.email "zhangbibin@tapinpet.com"
  • 建立版本库,初始化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带来方便的同时,若是不加注意,极可能会留下一个枝节蔓生、四处开放的版本库,处处都是分支,彻底看不出主干发展的脉络。(摘自阮一峰博客)
  • 可能发展成为难以管理的分支

(摘自阮一峰博客)html

  • 咱们现有分支图表

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

  • 可选分之策略

1.gitflow 的流程api

一些管理脚本

建立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

参考资料

1.阮一峰_GIT分支管理策略
2.廖雪峰GIT教程bash

相关文章
相关标签/搜索