声明:由于本人对于Git的学习还处于摸索阶段,对有些概念的理解或许只是我断章取义,有曲解误导的地方还请见谅指正!

一、分支

1.1分支的概念。

对于的分支的理解,我们可以用模块化这个词来解释;在日常工作中,一个项目的开发模式往往是模块化,团队协作式的开发。这样我们项目的进度可以称得上多核并发式的开发了。这种模块化的开发要求我们尽可能的高内聚低耦合以免造成一只胳膊没了整个人都废了的局面。因此在所有的版本控制器对代码进行管理的时候都引入了分支这个概念。那么分支是什么呢?

分支是相对于主干来说的,或者是相对于主分支来说的,它是用来将特性开发绝缘开来的。我们在创建仓库的时候,系统会默认创建master分支,也就是我们默认的主干分支。当我们开发一个项目的时候,在框架搭建完成后,需要开发一个一个模块的功能的时候,我们往往会创建一个一个的分支来进行分别开发,没跟人都在自己的一亩三分地里劳作,相互没有影响,当某一项功能或者模块开发完成通过测试的时候在整合到主框架上,这样做的好处是,可以避免单个模块的开发工作的缺陷造成整个框架系统无法编译通过,无法正常运转。如果你是一个Android开发人员,我们可以用主线程(UI)线程和子线程来理解,比较类似的是当我们创建一个Activity的时候,系统会默认创建一个主线程,也就是我们的UI线程,如果我们在需要访问网络获取数据的时候(耗时操作),我们一般的做法就是我们会重新开启一个子线程进行远程数据的获取与解析,当我们完成数据读取操作后在对UI线程进行更新,以免耗时操作造成UI线程的阻塞(ANR)。

1.2创建分支与分支合并

我们每次执行提交的时候,git都会把它们串成一条时间线,这条时间线就是一个分支。经过前一阶段的学习,我们知道,在我们的仓库中只有一个主分支,也就是只有一条时间线,随着我们每一次的提交,master分支的时间想也就越长。当我们需要开发一个新的功能的时候,我们可以新建一个分支的时候(dev)来进行该功能模块的开发工作,Git就会同时新建了一个指针(dev),把HEAD指向dev分支,表示当前分支在dev上。那么对工作区的修改和提交就是在dev分支上了,我们每一次提交后,dev指针就会往前移动一次,不会影响到master分支。当我们在dev分支上的开发工作完成以后,通过测试验证后,再把dev分支与master进行合并。那么如何合并呢?我们可以让master分支指向dev分支(dev分支又指向当前分支下的最后一次提交)的当前提交,也就是把这个dev分支作为master主干分支的一次修改来进行提交,这样就完成了合并。合并完成后我们甚至可以删除被合并的dev分支。

下面我们来进行实际的命令操作:

1.2.1 创建分支

  1. $ git branch dev

!注意:执行上述命令,没有任何提示!

1.2.2切换分支

  1. $ git checkout dev
  2. Switched to branch 'dev'

!注意:

1.2.3创建并切换分支命令

使用git checkout命令加上-b参数表示创建并切换分支,相当于上述两条命令;

  1. $ git checkout -b dev

1.2.4查看当前分支

  1. $ git branch
  2. * dev
  3.   master

绿色部分为当前分所在的分支。

  1. STAR@STAR-PC ~/learngit (dev)
  2. $ git add test.txt
  3. STAR@STAR-PC ~/learngit (dev)
  4. $ git commit -m "create new branch"
  5. [dev cee7bfc] create new branch
  6.  1 file changed, 2 insertions(+), 1 deletion(-)
  7. STAR@STAR-PC ~/learngit (dev)
    $ git commit -m "create new branch"
    [dev cee7bfc] create new branch
     1 file changed, 2 insertions(+), 1 deletion(-)

上述代码在dev分之下提交修改。

  1. STAR@STAR-PC ~/learngit (dev)
  2. $ git checkout master
  3. Switched to branch 'master'
  4. Your branch is ahead of 'origin/master' by 1 commit.
  5.   (use "git push" to publish your local commits)

上述命令是我们在dev分之下条修改后进行的分支切换操作,此时我们查看工作区,则在dev分支下的修改并不存在。此时若想在master看到我们在dev分支下的修改,则需要合并分支。

  1. $ git merge dev
  2. Updating 94bf25d..cee7bfc
  3. Fast-forward
  4.  test.txt | 3 ++-
  5.  1 file changed, 2 insertions(+), 1 deletion(-)

上述命令的执行完成了整合,此时查看工作区的文件发现,主分支下的文件已经能够看到之前在dev分支下的修改了。

注意!上述命令执行后打印的提示信息中的“Fast-forward”,告诉我们此次合并为“快进模式”也就是直接让master指针指向dev的当前提交。

1.2.5删除分支

由于之前的内容我们提到过,在分支合并后我们可以删除已经合并的分支,因此我们来删除dev分支,并查看所有分支。

  1. STAR@STAR-PC ~/learngit (master)
  2. $  git branch -d dev
  3. Deleted branch dev (was cee7bfc).
  4.  
  5. STAR@STAR-PC ~/learngit (master)
  6. $ git branch
  7. * master

提示信息告诉我们dev分支已删除,剩余分支为master,绿色表示当前分支为master

1.3解决分支合并冲突

你看到这个题目的时候或许心里会有疑惑?上述的操作不是很顺利吗?怎么会有冲突呢?

我们回头看看上述分支合并的操作就会发现,我们在合并分支的时候,新建分支dev有改动,而master分支没有提交任何修改,但是如果我们在合并分支的时候,master和dev分支均提交了修改呢?这样一来合并分支会还会一帆风顺吗?我们带着这个问题来进行接下来的操作。

我们首先创建一个分支dev,然后分别在两个分支上提交修改。

  1. STAR@STAR-PC ~/learngit (master)
  2. $ git checkout -b dev2
  3. Switched to a new branch 'dev2'
  4.  
  5. STAR@STAR-PC ~/learngit (dev2)
  6. $ git add test.txt
  7.  
  8. STAR@STAR-PC ~/learngit (dev2)
  9. $ git commit -m "create a new brance dev2"
  10. [dev2 046661c] create a new brance dev2
  11.  1 file changed, 2 insertions(+), 1 deletion(-)
  12.  
  13. STAR@STAR-PC ~/learngit (dev2)
  14. $ git switch master
  15. git: 'switch' is not a git command. See 'git --help'.
  16.  
  17. STAR@STAR-PC ~/learngit (dev2)
  18. $ git checkout master
  19. Switched to branch 'master'
  20. Your branch is ahead of 'origin/master' by 2 commits.
  21.   (use "git push" to publish your local commits)
  22.  
  23. STAR@STAR-PC ~/learngit (master)
  24. $ git add test.txt
  25.  
  26. STAR@STAR-PC ~/learngit (master)
  27. $ git commit -m "add a new line for master"
  28. [master 835e78c] add a new line for master
  29.  1 file changed, 2 insertions(+), 1 deletion(-)

合并分支:

  1. $ git merge dev2
  2. Auto-merging test.txt
  3. CONFLICT (content): Merge conflict in test.txt
  4. Automatic merge failed; fix conflicts and then commit the result.

根据上述提示信息我们发现,test.txt文件发生冲突,合并失败。我们可以根据git status来查看冲突文件。

  1. $ git status
  2. On branch master
  3. Your branch is ahead of 'origin/master' by 3 commits.
  4.   (use "git push" to publish your local commits)
  5.  
  6. You have unmerged paths.
  7.   (fix conflicts and run "git commit")
  8.  
  9. Unmerged paths:
  10.   (use "git add <file>..." to mark resolution)
  11.  
  12.         both modified:   test.txt
  13.  
  14. no changes added to commit (use "git add" and/or "git commit -a")

或许我们也可以直接查看test.txt的内容:

  1. <<<<<<< HEAD
  2. add a new line for master。
  3. =======
  4. create a new branch dev2.
  5. >>>>>>> dev2

git用<<<<<<,======,>>>>>>标记出不同分支的内容,我们可以对文件进行修改如下;

  1. add a new line for master
  2. create a new branch dev2.

并在master进行提交:

  1. STAR@STAR-PC ~/learngit (master|MERGING)
  2. $ git add test.txt
  3.  
  4. STAR@STAR-PC ~/learngit (master|MERGING)
  5. $ git commit -m "fixed"
  6. [master 51e165e] fixed

提示信息告诉我们问题已经解决。接着我们就可以删除dev2分支了。

  1. $ git branch -d dev2
  2. Deleted branch dev2 (was 046661c).

!注意:我们之前的分至合并操作都是快速模式下执行的,但是在这种模式下删除分支后,会丢失分支信息。因此我们在合并分支的时候也可以采用no-ff方式,如下,有兴趣的朋友可以自己进行测试。

  1. $ git nerge --no-ff -m "merge with no-ff" dev

1.4分支的隐藏与恢复

如果我们在项目的开发过程中,需要暂时搁置当前分支的开发并在其他分之下进行操作,我们可以使用git stash对当前分支进行隐藏。

  1. $ git checkout -b dev3
  2. Switched to a new branch 'dev3'
  3.  
  4. STAR@STAR-PC ~/learngit (dev3)
  5. $ git add test.txt
  6.  
  7. STAR@STAR-PC ~/learngit (dev3)
  8. $ git commit -m "use stash"
  9. [dev3 d358fab] use stash
  10.  1 file changed, 2 insertions(+), 1 deletion(-)

查看状态,并执行git stash命令

  1. $ git status
  2. On branch dev3
  3. Changes not staged for commit:
  4.   (use "git add <file>..." to update what will be committed)
  5.   (use "git checkout -- <file>..." to discard changes in working directory)
  6.  
  7.         modified:   test.txt
  8.  
  9. no changes added to commit (use "git add" and/or "git commit -a")
  10.  
  11. STAR@STAR-PC ~/learngit (dev3)
  12. $ git stash
  13. Saved working directory and index state WIP on dev3: d358fab use stash
  14. HEAD is now at d358fab use stash

切换回主分支进行提交修改操作。

  1. $ git status
  2. On branch master
  3. Your branch is ahead of 'origin/master' by 6 commits.
  4.   (use "git push" to publish your local commits)
  5.  
  6. Changes not staged for commit:
  7.   (use "git add <file>..." to update what will be committed)
  8.   (use "git checkout -- <file>..." to discard changes in working directory)
  9.  
  10.         modified:   test.txt
  11.  
  12. no changes added to commit (use "git add" and/or "git commit -a")
  13.  
  14. STAR@STAR-PC ~/learngit (master)
  15. $ git add test.txt
  16.  
  17. STAR@STAR-PC ~/learngit (master)
  18. $ git commit -m "hello"
  19. [master 404a601] hello
  20.  1 file changed, 2 insertions(+), 1 deletion(-)

切换会dev3分支

  1. STAR@STAR-PC ~/learngit (master)
  2. $ git checkout dev3
  3. Switched to branch 'dev3'

切换回分支之后,此时我们需要恢复现场。

首先查看隐藏的现场。

  1. STAR@STAR-PC ~/learngit (dev3)
  2. $ git stash list
  3. stash@{0}: WIP on dev3: d358fab use stash

恢复现场的方式有两种一种是使用git stash apply [stash@{0}],但是恢复后stash内容并不会删除,我们需要手动执行git stash drop 来删除。

第二种执行git stash pop,恢复的同时删除stash的内容。

  1. $ git stash pop
  2. On branch dev3
  3. Changes not staged for commit:
  4.   (use "git add <file>..." to update what will be committed)
  5.   (use "git checkout -- <file>..." to discard changes in working directory)
  6.  
  7.         modified:   test.txt
  8.  
  9. no changes added to commit (use "git add" and/or "git commit -a")
  10. Dropped refs/stash@{0} (6696a348f1e160fa3f234dff50eaad0d59e4d264)

dev3分支下完成修改后,执行合并分支的操作。

!注意:如果我们开发完成一个分支,准备切换到主分支进行合并的时候,却发现该分支下的修改已经不需要了,这个时候我们如果要删除该分支我们需要执行git branch -D [分支名]

1.5推送本地分支到远程分支

一般来说我们都会在本地分支上进行修改和提交,然后与主干分支进行合并,再删除无用分支,因此我们向远程分支进行推送的时候只需要推送主干分支即可。

  1. $ git push -u origin master
  2. Username for 'https://github.com': huangyabin001
  3. Password for 'https://huangyabin001@github.com':
  4. Counting objects: 31, done.
  5. Delta compression using up to 4 threads.
  6. Compressing objects: 100% (19/19), done.
  7. Writing objects: 100% (29/29), 2.23 KiB | 0 bytes/s, done.
  8. Total 29 (delta 9), reused 0 (delta 0)
  9. To https://github.com/huangyabin001/learngit.git
  10.    1cf2aaa..7b69267  master -> master
  11. Branch master set up to track remote branch master from origin.

注意如果输入git push origin master则会出现一下问题:



$ git push origin master

fatal: unable to access 'https://github.com/huangyabin001/learngit.git/': Empty

reply from server

二、自定义Git

2.1客户端配置

2.1.1 core.editor

Git默认会调用你的环境变量editor定义的值作为文本编辑器,如果没有定义的话,会调用vi来创建和编辑,我们可以使用core.editor改变默认编辑器。

$ git config --global core.editor emacs

2.1.2 help.autocorrect

该配置只在Git1.6.1及以上版本有效,如果你错打了一条命令,会显示:

$git com tig:'com' is not a git-command.See 'git --help'. Did you mean this?commit

2.2Git的着色

Git能够为输出到你终端的内容着色,以便你可以凭直观的界面进行快速的分析。

Git会按照你的需要自动为大部分的输出加上颜色

$git config --global color.ui true

深入学习:Windows下Git入门教程(下)的更多相关文章

  1. 深入学习:Windows下Git入门教程(上)

    一,安装Git: 1.1Linux上安装命令: sudo apt-get install git 1.2在Windows上安装Git: 使用Windows版的msysgit,官方下载地址:http:/ ...

  2. git 入门教程

    git 入门教程之协同开发 前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协 ...

  3. Windows系统Git配置教程(Git配置git config)

    Windows系统Git配置教程(Git配置git config)   在很多Git配置教程中,多是安装完毕后就告诉大家要配置用户名和邮箱,但是这个配置是保存在哪里呢,配置后面的参数有什么不同呢,下面 ...

  4. 廖雪峰Git入门教程

    廖雪峰Git入门教程  2018-05-24 23:05:11     0     0     0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...

  5. Windows系统Git安装教程(详解Git安装过程)

    Windows系统Git安装教程(详解Git安装过程)   今天更换电脑系统,需要重新安装Git,正好做个记录,希望对第一次使用的博友能有所帮助! 获取Git安装程序   到Git官网下载,网站地址: ...

  6. 深入学习:Windows下Git新手教程(上)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangyabin001/article/details/35557231 一,安装Git: 1.1 ...

  7. phaser学习总结之phaser入门教程

    前言 最近公司做项目的时候正好使用到phaser,在这里做一下自己整理出来的一些心得,方便大家参考,phaser这一个游戏引擎通常是做2d游戏的,入门也非常简单,只需你会一点的javascript,但 ...

  8. git 入门教程之备忘录[译]

    备忘录[译] 创建 | Create 克隆一个已存在的仓库 | Clone an existing repository git clone git@github.com:snowdreams1006 ...

  9. git 入门教程之个性化 git

    前情概要 初识 git 时,我们就已经接触过 git 的基本配置,使用 git config 命令配置用户名和邮箱: # 配置当前项目(`local`)的用户名(`snowdreams1006`) g ...

随机推荐

  1. 通配符+countif()解决大于15位数的计数问题

    excel的最大精度是15位,如果一个单元格中存储的数字超过15位,那么函数在计算的时候将会出现问题,它们会将15位之后的数字变成0. 在这种情况下,需要在函数中加入通配符,例如,统计A列中,A1出现 ...

  2. 《javascript高级程序设计》 第25章 新兴的API

    25.1 requestAnimationFrame() 25.1.1 早期动画循环 25.1.2 循环间隔的问题 25.1.3 mozRequestAnimation-Frame.webkitReq ...

  3. ubuntu安装bower失败的解决方法

    1.安装nodejs 2.安装npm 3.安装bower 最开始使用 npm install bower -g / sudo npm install bower -g 安装bower后 命令行输入bo ...

  4. hdu-----(1151)Air Raid(最小覆盖路径)

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  5. UITabBarController加载之后不显示sub view controller

    原代码: fileprivate func createSubiewControllers() { let newsVC = NewsViewController() let newsItem = U ...

  6. 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引

    时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这 ...

  7. Windows Store App 用户库文件操作

    (1)获取用户库位置 如果想要通过应用程序在用户库中创建文件,首先需要获得用户库中指定的位置,例如图片库.文档库等.这里值得注意的是,在获取用户库的位置之前,必须在Windows应用商店项目的清单文件 ...

  8. cisco LAN

    由于实验需要,需要搞个内部局域网(以前我们实验室是直接从学校拖了根线过来,然后直接用switch连).因此得先配个router,做个小局域网.由于从没接触过路由器,所以先去网上找了些资料,接着就打开c ...

  9. MongoDB相关资料

    MongoDB的介绍及安装参考http://www.cnblogs.com/lipan/archive/2011/03/08/1966463.html 安装过程: 第一步:下载安装包:官方下载地址←单 ...

  10. Oozie简介

    在Hadoop中执行的任务有时候需要把多个Map/Reduce作业连接到一起,这样才能够达到目的.[1]在Hadoop生态圈中,有一种相对比较新的组件叫做Oozie[2],它让我们可以把多个Map/R ...