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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容