声明:因为本人对于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。并在master进行提交:create a new branch dev2.
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