git命令总结管理

今天新建项目的时候,发现rdc除原有的分支模式以外还增加了master分支开发模式git flow模式,这是一件非常令人欣喜的事情——毕竟git flow是一个流传已久的,大家都普遍接受的开发模式。
于是我就把应用删掉了,改用git flow模式,目前体验很完美。
鉴于很多人可能还不太了解git flow,本文就对此分享一些微小的经验。
http://insights.thoughtworkers.org/gitflow-consider-harmful/

你会用git吗?

我相信在座的大多数人都会自信的回答:“会”。
而实际上,大家可能从来没有考虑过自己的用法是否真的科学,真的健壮,尤其是项目越来越大,人数越来越多,周期越来越长的时候。

其中,典型的有以下几个问题:

  1. 当我开发某个功能到一半的时候,PM突然给我安排了一个新的紧急任务,我该怎么开始这个任务,而不影响现在的?
  2. 当我代码写好了的时候,如何发布?
  3. 当我发布后,代码出问题了,如何快速修复?
  4. 以上的情况,还要求修复后,还要包含之后开发的所有代码?

大部分开发人员使用git的时候,基本只使用两个甚至一个分支,所以下面的这些理念,显然是打开了一扇新世界的大门了。

方案

显然,不光代码有代码规范,代码的管理和协同同样需要一个清晰的流程和规范,由此,行业内的通用解决方案是Git Flow

git-flow

怎么样,眼花缭乱吧,不过我可以给你个建议:把头左转90度,别着急骂....这是office picture,并非我画的。

在上面这幅图上,最上面的一行,代表分支,它们分别是

名称 解释
master 这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改
Develop 这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
Feature 这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release
Release 当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
Hotfix 当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release.

实现细则

master分支

在master分枝上工作,我们需要遵循一个基本原则,所有在master分支上的commit应该tag.

git-flow

feature分支

feature分支做完后,必须合并回develop分支, 合并完分支后一般会删点这个feature分支,但是我们也可以保留

git-flow

开始一个新的功能的开发

git checkout -b some-feature develop
# Optionally, push branch to origin:
git push -u origin some-feature    

# 做一些改动    
git status
git add some-file
git commit    

开发完成

git pull origin develop
git checkout develop
git merge --no-ff some-feature
git push origin develop

git branch -d some-feature

# If you pushed branch to origin:
git push origin --delete some-feature    

release分支

分支名 release/*
release分支基于develop分支创建,打完release分支后,我们可以在这个release分支上测试,修改bug等。同时,其它开发人员可以基于开发新的feature,一旦打了release分支之后不要从develop分支上合并新的改动到Release分支
发布release分支时,合并releasemasterdevelop, 同时在master分支上打个tag记住release版本号,然后可以删除release分支了(当然,你可以选择不删除)。

git-flow

开始release

git checkout -b release-0.1.0 develop

# Optional: Bump version number, commit
# Prepare release, commit

完成release

git checkout master
git merge --no-ff release-0.1.0
git push

git checkout develop
git merge --no-ff release-0.1.0
git push

git branch -d release-0.1.0

# If you pushed branch to origin:
git push origin --delete release-0.1.0   

git tag -a v0.1.0 master
git push --tags

hotfix

分支名 hotfix/*
hotfix分支基于master分支创建,开发完后需要合并回masterdevelop分支,同时在master上打一个tag

git-flow

开始hotfix

git checkout -b hotfix-0.1.1 master    

完成hotfix

git checkout master
git merge --no-ff hotfix-0.1.1
git push

git checkout develop
git merge --no-ff hotfix-0.1.1
git push

git branch -d hotfix-0.1.1

git tag -a v0.1.1 master
git push --tags

工具

如果你能坚持看到这里,我真的为你感到欣喜,这说明你是用心学习的,并且是不畏艰险的,毕竟上面那么长的一大串的代码,可能已经使你感到畏惧。
而显然的是,作为通用的一个解决方案,不可能这么繁琐,那么,唯一的可能是——有!工!具!

平台 命令
OS X brew install git-flow
Linux apt-get install git-flow
Windows wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh bash
IDEA Git Flow Integration

其中还有一大部分是gui的,比较简单,本文就不再赘述了。下面着重介绍下命令行下的使用

  • 初始化: git flow init
  • 开始新Feature: git flow feature start MYFEATURE
  • Publish一个Feature(也就是push到远程): git flow feature publish MYFEATURE
  • 获取Publish的Feature: git flow feature pull origin MYFEATURE
  • 完成一个Feature: git flow feature finish MYFEATURE
  • 开始一个Release: git flow release start RELEASE [BASE]
  • Publish一个Release: git flow release publish RELEASE
  • 发布Release: git flow release finish RELEASE
    别忘了git push --tags
  • 开始一个Hotfix: git flow hotfix start VERSION [BASENAME]
  • 发布一个Hotfix git flow hotfix finish VERSION

仔细观察,这些命令都是有规矩的,它们大概可以如下图表示

git-flow

###################################################################
基础语法
git init 把工作区变为一个git可以管理的仓库
(1)git add 跟踪要修改的文件(把文件add到了缓存区)
(2)git commit 提交文件到版本库(把缓存区的文件提交到了当前分支)
(3)git status 查看修改过的文件的状态(已跟踪,未跟踪,已提交,未提交)
(4)git log 查看提交的log(最上边儿是最近一次提交的)
显示了:commit_id,auther,commit_date,修改的内容
(5)git reset —head HEAD^ 撤回上一个版本
(6)cat 查看当前文件内容
(7)git reset --hard 3628164 后悔撤回了的那个版本的话执行这个回退到那个版本 3628164是那个版本的版本号(commit_id)
(8)git reflog 查看命令历史
(9)暂存区和工作区的区别
工作区:我们正常工作的目录项目根目录下(.git目录就在工作区,它不是工作区而是git的版本库)
暂存区:存在版本库.git里,通常称为stage,在git init时会为我们创建第一个分支master,以及指向master的指针HEAE
⚠:如果修改的文件没有被add倒暂存区,commit的时候将不会被提交到当前分支(因为git跟踪并管理的是修改而不是文件本身)
(10)git checkout — file (撤回没有add到暂存区的已经修改的文件)
(11)git reset HEAD file (撤回已经add到暂存区但是还没有commit的文件,撤回到了工作区,如果还想还原的话执行checkout命令)
(12)删除文件的时候一定要注意 :(删除的是已经commit 到分支的文件)
⚠:切记不要执行rm file命令,如果实在执行了,可以通过checkout 撤回工作区的修改应为删除工作区的文件也是对工作区文件的修改所以可以通过checkout撤回修改
⚠:删除的时候执行git rm file这时候暂存区文件也给删除了,执行commit提交就行了
⚠:如果是删除没有commit到分支的文件看情况执行rm file或者git rm file
(13)远程仓库
git remote add origin https://github.com/easonlovejiven/learngit.git 关联一个远程仓库
关联之后推送最新的code
git push origin 本地工作分支 (把当前分支推送到远程)
⚠:第一推送时远程是空的所以要加-u参数(git push -u origin 本地工作分支)
(14)分支管理
创建合并分支:
git checkout -b dev 创建并切换到dev分支,相当于:git branch dev ,git checkout dev
git branch 列出本地所有分支
git checkout 分支名 切换分支
git merge 分支名 合并分支
git branch -d 分支名 合并之后就可以删除新建的开发分支了
⚠:新建的分支默认和本地master分支一样的内容
解决分支冲突:
both modified :文件的这个状态证明有冲突了
当merge出现冲突时git无法自动合并,必须手动的修改冲突的文件(merge后修改)修改成要merge的那个分支,修改完后删除要merge的那个分支,然后add,commit提交
git log —graph 查看分支合并图
(15)bug分支
如果要修复bug时,需要建立专门的bug分支来修复,然后合并,最后删除
git stash:存储当前(dev)分支的工作现场(去处理其它分支的事情)
git stash pop:其它分支处理完了,切换到dev分支,恢复之前未完成的工作内容
(16)远程仓库
远程仓库的默认名称是origin
git remote :查看远程分支的名称
git branch origin 本地分支
git pull :更新远程分支最新的修改到本地
(17)标签管理
撤回上次提交
git reset HEAD^
如果删除了一个已经push的本地的分支想要恢复的话,运行git br -a看下远程分支纪录然后运行git co remotes/origin/T183-2 恢复分支
高级语法
使远程库强制覆盖本地代码(git pull时出现冲突 放弃本地修改)
git fetch --all 只是下载代码到本地,不进行合并操作
git reset --hard origin/master 把HEAD指向最新下载的版本
本地版本强制覆盖远程版本
git push --force origin
git index.lock锁定文件
rm -f ./.git/index.lock
在你进行某些比较费时的git操作时自动生成,操作结束后自动删除,相当于一个锁定文件,目的在于防止对一个目录同时进行多个操作。有时强制关闭进行中的git操作,这个文件没有被自动删除,之后你就无法进行其他操作,必须手动删除

git Please move or remove them before you can merge
这是因为本地有修改,与云端别人提交的修改冲突,又没有merge。如果确定使用云端的代码,最方便的解决方法是删除本地修改

git clean -d -fx ""
d -----删除未被添加到git的路径中的文件
f -----强制运行
x -----删除忽略文件已经对git来说不识别的文件
常用语法
git pull 等价于 git fetch + git merge
git fetch不会执行自动merge

git pull 和 git pull origin master 和 git pull origin 区别
在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支
远程分支是与当前分支合并

git pull origin master
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

git pull origin
如果当前分支只有一个追踪分支,连远程主机名都可以省略

git pull

你可能感兴趣的:(git命令总结管理)