git使用
本文通过以下四个部分讲解git的使用
Git配置 Git使用场景 Git分支管理方法 常用git命令
在讲解之前,先看下这张图
git流程Remote远程仓库 Repository本地仓库 Index/Stage暂存区 Workspace工作区
一般使用git有远程仓库的情况下,都要先从远程仓库clone到本地仓库。然后切换(checkout)到需要做开发的分支,进行开发工作,开发工作都是在工作区进行的。开发时如果需要提交,需要先把修改添加到暂存区(add),如果需要提交暂存区的修改到历史区,使用commit命令提交。最后使用push推送到远程仓库。别人如果需要拉取你提交的代码,使用pull拉取到自己的工作区。
一 、git配置
这个name和email只是一个标识,公司项目开发中尽量配自己的名字全拼和公司邮箱,方便git log查看
#显示当前的git配置
git config –list
#设置提交代码时的用户信息
git config [--global] user.name “YourName”
git config [--global] user.email “Your Email Address”
如果不加—global是配置当前项目,当前项目的配置会覆盖全局的
如果用户信息配置有误,可使用上面命令重新设置覆盖之前的信息。
如果操作无效,尝试下下面的命令
git config [--global] –replace-all user.name “Your Name”
git config [--global] –replace-all user.email “Your Email Address”
二、分支管理
参考连接地址https://kb.cnblogs.com/page/132209/
git分支管理1) 主分支Master
首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
2) 开发分支Develop
从开发分支(develop)应该总能够获得最新开发进展的代码。
3) 临时性分支
前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于获取最新开发进展。其实,常设分支只需要这两条就够了,不需要其他了。
但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:
*功能(feature)分支
*预发布(release)分支
*修补bug(fixbug)分支
这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。
第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
功能分支的名字,可以采用feature-*的形式命名。有新需求的时候新建功能分支
“Feature branches”起源于“develop”分支
“Feature branches”最终也归于“develop”分支
第二种是预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。
预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。
“Release branch”,起源于develop分支,最终归于“develop”或“master”分支
“Release branch”产生新提交的最好时机是“develop”分支已经基本到达预期的状态,至少希望新功能已经完全从“Feature branches”合并到“develop”分支了
经过若干bug修复后,“Release branches”上的代码已经达到可发布状态,此时,需要完成三个动作:第一是将“Release branches”合并到“master”分支,第二是一定要为master上的这个新提交打TAG(记录里程碑),第三是要将“Release branches”合并回“develop”分支
最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。
修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
三、Git使用场景
git场景操作,分以下几个场景介绍
新建分支做开发
远程已有该分支,我本地[[没有]],需要做后续开发
远程已有该分支,我本地[[有]],需要做后续开发
开发中。需要修改紧急bug
冲突处理
上线
看场景之前,先看下下面两个命令的效果
git pull --rebase http://blog.csdn.net/hudashi/article/details/7664631/
git merge –no-ff branch-name http://blog.csdn.net/hudashi/article/details/7664382
1) 新建分支做开发
#首先确保本地没有被修改的文件 git status
#切换分支 从哪个分支新建分支,切换到哪 git checkout branch-name
#拉取远程分支并合并 如遇冲突参考冲突解决 git pull --rebase
#新建并切换到开发分支 git checkout –b new-branch-name
#本地开发
#添加到暂存区 将所有新增/修改/删除的文件提交到暂存区 git add –A或者git add .
#将暂存区的文件提交到历史区 git commit –m ‘commit code for …’
#推送本地开发分支并与远程库建立关联 git push –u origin new-branch-name
2) 远程已有该分支,我本地[[没有]],需要做后续开发
#首先确保本地没有被修改的文件 git status
#切换分支 从哪个分支新建分支,切换到哪 git checkout branch-name
#拉取远程分支并合并,如遇冲突,参考冲突处理 git pull --rebase
#查看所有远程分支 git branch –r
#新建并切换到本地分支,跟远程分支建立关联关系。 #本地分支名(local-branch-name)尽量跟远程分支名(remote-branch-name)保持一致 git checkout -b local-branch-name --track origin/remote-branch-name
#本地开发
#添加到暂存区 将所有新增/修改/删除的文件提交到暂存区 git add –A或者git add .
#将暂存区的文件提交到历史区 git commit –m ‘commit code for …’
#拉取远程分支并合并,如遇冲突,参考冲突处理 git pull --rebase
#否则执行下面命令 注意有可能服务器会Reject你的代码提交,如果是被Reject的话,先执行git pull --rebase git push
3)远程已有该分支,我本地[[有]],需要做后续开发
#首先确保本地没有被修改的文件 git status
#切换到该开发分支 git checkout branch-name
#注意有可能有冲突,如遇冲突,参考冲突处理 git pull --rebase
#本地开发
#添加到暂存区 将所有新增/修改/删除的文件提交到暂存区 git add –A或者git add .
#将暂存区的文件提交到历史区 git commit –m ‘commit code for …’
#拉取远程分支并合并,如遇冲突,参考冲突处理 git pull --rebase
#否则执行下面命令 注意有可能服务器会Reject你的代码提交,如果是被Reject的话,先执行git pull --rebase git push
4)开发中。需要修改紧急bug
#储藏本地修改 git stash
#切换到master分支 git checkout master
#拉取远程分支并合并,如遇冲突,参考冲突处理 git pull --rebase
#新建bug处理解决分支并切换到该分支 git checkout –b fixbug-*
#修改bug
#添加到暂存区 将所有新增/修改/删除的文件提交到暂存区 git add –A或者git add .
#将暂存区的文件提交到历史区 git commit –m ‘commit code for …’
#推送本地开发分支并与远程库建立关联 git push –u origin fixbug-*
#返回原分支继续开发
git checkout branch-name
git stash pop(恢复的同时删除stash内容)
5) 冲突处理:
#如果在合并代码时遇到冲突,请仔细阅读该命令的输出:输出会有类似conflict的字样,对每一个标注conflict的文件,仔细阅读其内容,然后把不需要的代码删除掉,保留最终的代码。如果不确定要保留哪块代码,可以在群里问。在冲突文件中搜索<<<<确保冲突的代码是否全部解决完。
冲突(1) 使用git merge --no-ff branch-name引起的冲突
当前更改是你修改的内容,传入的更改是别人的修改
如果不知道怎么解决冲突,可以使用git merge --abort终止合并。否则执行下面完成冲突解决
#确保所有的冲突文件都已经被统一之后,使用下面的代码再次提交: git add -A && git commit -m 'merge code'
#然后再次拉取远程分支跟本地分支做合并,如遇冲突,参考冲突处理。 git pull --rebase
#否则执行下面命令 注意有可能服务器会Reject你的代码提交,如果是被Reject的话,先执行git pull --rebase git push
(2) 使用git pull –rebase引起的冲突
当前更改是别人的修改,传入的更改是你修改的内容
如果不知道怎么解决冲突,可以使用git rebase --abort终止合并。否则执行下面完成冲突解决
#确保所有的冲突文件都已经被统一之后,使用下面的代码修改文件添加到暂存区: git add –A
#然后使用下面命令继续执行(千万不要使用git rebase --skip) git rebase --continue
#然后再次拉取远程分支跟本地分支做合并,如遇冲突,参考冲突处理。 git pull --rebase
#否则执行下面命令 注意有可能服务器会Reject你的代码提交,如果是被Reject的话,先执行git pull --rebase git push
注:有时候执行merge时会出现下面的弹框,输入merge的描述信息
merge文案弹框6)上线
git checkout master
git pull --rebase
#在master分支上合并准备上线的分支 如遇冲突,参考冲突解决 git merge –no-ff branch-name
#在master分支上打标 git tag -a tag-name -m 'tag描述'
git push origin tag-name
git checkout develop
git pull --rebase
#在develop开发分支上合并准备上线的分支 如遇冲突,参考冲突解决git merge –no-ff branch-name
#删除本地和远程bug分支或者release分支
git branch –D branch-name
git push origin :branch-name
四、常用git命令如下
1) git stash#储藏
#查看现有的储藏 git stash list
#应用最近的储藏 git stash apply
#应用指定名字的储藏 git stash apply [stash-name]
#移除最近的储藏 git stash drop
#移除指定名字的储藏 git stash drop [stash-name]
#应用并移除储藏 git stash pop
2)分支
#列出所有本地分支 $ git branch
#列出所有远程分支 $ git branch -r
#列出所有本地分支和远程分支 $ git branch -a
#新建一个分支,但依然停留在当前分支 $ git branch [branch-name]
#新建一个分支,并切换到该分支 $ git checkout -b [branch-name]
#新建一个分支,与指定的远程分支建立追踪关系 $ git branch --track [branch] [remote-branch]
#切换到指定分支,并更新工作区 $ git checkout [branch-name]
#建立追踪关系,在现有分支与指定的远程分支之间 $ git branch --set-upstream [branch] [remote-branch]
#合并指定分支到当前分支(默认是快进合并,使用—no-ff是正常合并,建议使用正常合并) $ git merge --no-ff [branch]
#删除本地分支 $ git branch -d [branch-name]
#强制删除本地分支 $ git branch -D [branch-name]
#删除远程分支 $ git push origin :[remote-branch] 或 git push origin –delete [remore-branch]
3) 撤销
#撤销工作区指定文件的修改 $ git checkout [file]
#撤销工作区所有文件的修改 $ git checkout .
#重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 $ git reset [file] 或 git reset HEAD [file]
#重置暂存区与工作区,与上一次commit保持一致 $ git reset –hard
#回退到之前的版本 一个^表示一个版本,可以多个 或 n表示数字向上回退几个版本 git reset HEAD^ 或 git reset HEAD~n
(1)soft参数:git reset --soft HEAD~1将版本库软回退1个版本,软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区
(2)默认的mixed参数:git reset HEAD~1,将版本库的头指针全部重置到指定版本,切回重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段
(3)hard参数:git reset --hard HEAD~1,将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,重置暂存区,工作区代码也会退到这个版本
4)标签
#列出所有标签 $ git tag
#列出符合模式的标签 $ git tag -l ‘v0.1.*’
#创建轻量标签 $ git tag [tag-name]
#创建附注标签 $ git tag -a [tag-name] -m “tag-describe”
#查看标签 $ git show [tag-name]
#删除标签 git tag -d [tag-name]
#给指定的commit id打标 $ git tag [tag-name] [commit-id]
通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:
#将指定标签提交到git服务器 $ git push origin [tag-name]
#将本地所有标签一次性提交到git服务器 $ git push origin –tags
5)git remote
#查看remote地址,远程分支,还有本地分支与之相对应关系等信息 git remote show origin
#删除远程仓库已经不存在,但是本地git branch -r可以看到的远程分支 git remote prune origin
参考文章
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
https://kb.cnblogs.com/page/132209/
http://blog.csdn.net/hudashi/article/details/7664631/
http://blog.csdn.net/hudashi/article/details/7664382