版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/huangyabin001/article/details/35840591

声明:因为本人对于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 创建分支

$ git branch dev

!注意:运行上述命令。没有不论什么提示!

1.2.2切换分支

$ git checkout dev
Switched to branch 'dev'

!注意:

1.2.3创建并切换分支命令

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


$ git checkout -b dev

1.2.4查看当前分支

$ git branch
* dev
  master

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

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

STAR@STAR-PC ~/learngit (dev)
$ git commit -m "create new branch"
[dev cee7bfc] create new branch
 1 file changed, 2 insertions(+), 1 deletion(-)
上述代码在dev分之下提交改动。

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

上述命令是我们在dev分之下条改动后进行的分支切换操作,此时我们查看工作区,则在dev分支下的改动并不存在。

此时若想在master看到我们在dev分支下的改动,则须要合并分支。

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

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

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

1.2.5删除分支

因为之前的内容我们提到过,在分支合并后我们能够删除已经合并的分支,因此我们来删除dev分支,并查看全部分支。

STAR@STAR-PC ~/learngit (master)
$  git branch -d dev
Deleted branch dev (was cee7bfc). STAR@STAR-PC ~/learngit (master)
$ git branch
* master

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

1.3解决分支合并冲突

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

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

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

STAR@STAR-PC ~/learngit (master)
$ git checkout -b dev2
Switched to a new branch 'dev2' STAR@STAR-PC ~/learngit (dev2)
$ git add test.txt STAR@STAR-PC ~/learngit (dev2)
$ git commit -m "create a new brance dev2"
[dev2 046661c] create a new brance dev2
 1 file changed, 2 insertions(+), 1 deletion(-) STAR@STAR-PC ~/learngit (dev2)
$ git switch master
git: 'switch' is not a git command. See 'git --help'. STAR@STAR-PC ~/learngit (dev2)
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits) STAR@STAR-PC ~/learngit (master)
$ git add test.txt STAR@STAR-PC ~/learngit (master)
$ git commit -m "add a new line for master"
[master 835e78c] add a new line for master
 1 file changed, 2 insertions(+), 1 deletion(-)

合并分支:

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

依据上述提示信息我们发现,test.txt文件发生冲突。合并失败。

我们能够依据git status来查看冲突文件。

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

也许我们也能够直接查看test.txt的内容:

<<<<<<< HEAD
add a new line for master。
=======
create a new branch dev2.
>>>>>>> dev2

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


add a new line for master。

create a new branch dev2.

并在master进行提交:

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

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

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

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

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

1.4分支的隐藏与恢复

假设我们在项目的开发过程中,须要临时搁置当前分支的开发并在其它分之下进行操作。我们能够使用git stash对当前分支进行隐藏。

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

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

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

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

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

切换会dev3分支

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

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

首先查看隐藏的现场。

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

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

    另外一种运行git stash pop。恢复的同一时候删除stash的内容。

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

dev3分支下完毕改动后。运行合并分支的操作。

!注意:假设我们开发完毕一个分支,准备切换到主分支进行合并的时候,却发现该分支下的改动已经不须要了,这个时候我们假设要删除该分支我们须要运行git branch -D [分支名]

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

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

$ git push -u origin master
Username for 'https://github.com': huangyabin001
Password for 'https://huangyabin001@github.com':
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (29/29), 2.23 KiB | 0 bytes/s, done.
Total 29 (delta 9), reused 0 (delta 0)
To https://github.com/huangyabin001/learngit.git
   1cf2aaa..7b69267  master -> master
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.1client配置

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新手教程(上)

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

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

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

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

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

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

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

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

    声明:由于本人对于Git的学习还处于摸索阶段,对有些概念的理解或许只是我断章取义,有曲解误导的地方还请见谅指正! 一.分支 1.1分支的概念. 对于的分支的理解,我们可以用模块化这个词来解释:在日常工 ...

  6. WIN下Git GUI 教程

    现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...

  7. linux系统下 git 使用教程

    一.初始化 1.首先安装git软件,安装环境是centos 7.x下的云服务器.使用命令: #yum install git 2.设置用户名和邮箱(必须): # git config --global ...

  8. linux 下git使用教程

    #添加所有新增文件 git add . #提交所有修改,包括删除,添加,修改 git add -A git add --all #查看状态 git status #添加一个文件 git add rea ...

  9. git学习------>写给 Git 初学者的7个建议

    PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...

随机推荐

  1. 创建自定义ssl证书用于https

    这里,不探究证书原理.我们要完成的任务是,自己充当CA,然后签出证书供服务器使用. 本次教程是在windows实现,实验之前,确认自己的电脑中有openssl程序.如果没有,博主帮你准备了一个:htt ...

  2. centos下 安装python相关

    centos 安装python相关 python3 https://blog.csdn.net/tanxiaob/article/details/78725301 yum -y install zli ...

  3. 20.multi_case04

    import aiohttp import asyncio import ssl async def fetch(session, url): async with session.get(url,s ...

  4. 2018-8-10-win10-uwp-验证输入-自定义用户控件

    title author date CreateTime categories win10 uwp 验证输入 自定义用户控件 lindexi 2018-08-10 19:16:51 +0800 201 ...

  5. Qt分割线

    方法:使用QFrame QFrame * line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameSh ...

  6. poj3167- Cow Patterns

    传送门 两个串相等定义为串中每一位排序后的相对大小相等. 一位相等等价于这一位前面比他小的和等于他的数的个数相等. 那么用kmp,比较的时候比较这两个个数就可以了. 一开始很瓜地想,询问一段区间内比我 ...

  7. MySQL 中LIMIT的使用详解

    在使用数据库过程中,常会遇到查询或者导出某个数据表或者查询集的前几条或者后几条记录,LIMIT可以很好的满足需求. LIMIT基本语法: 如果只给定一个参数,表示记录数. mysql; ) 相当于 m ...

  8. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  9. 深入浅出 Java Concurrency (40): 并发总结 part 4 性能与伸缩性[转]

    性能与伸缩性 使用线程的一种说法是为了提高性能.多线程可以使程序充分利用闲置的资源,提高资源的利用率,同时能够并行处理任务,提高系统的响应性. 但是很显然,引入线程的同时也引入了系统的复杂性.另外系统 ...

  10. iOS之CAScrollLayer属性简介和使用

    1.CAScrollLayer的简介 CAScrollLayer用于显示一个滑动图层的一部分,可以确定滑动方向和可视区域面积,限制不滑出区域外!相关属性如下:其中 /* Scroll the cont ...