learn git branching网站的题目解答-Main部分

这两天花时间把 Learn Git Branching Main部分的做了一遍。 对理解git分支的使用很有帮助,另外发现git的帮助文档和github的帮助文档都很详细,应该好好读一遍。 答案记录在下面,没用show solution看作者给出的答案,只是简单看了看命令数目是不是和作者的solution一样。

1.1 Introduction to Git Commits

git commit
git commit

1.2 Branching in Git

git branch bugFix
git checkout bugFix

1.3 Merging in Git

git checkout -b bugFix
git commit
git checkout master
git commit
git merge bugFix

1.4 Rebase Introduction

git checkout -b bugFix
git commit
git checkout master
git commit
git checkout bugFix
git rebase master

2.1 Detach yo’ HEAD

git checkout C4

2.2 Relative refs (^)

git checkout C4^

2.3 Relative refs #2 (~)

git branch -f master C6
git branch -f bugFix C0
git checkout C1

2.4 Reversing Changes in Git

git reset local~1
git checkout pushed
git revert pushed

3.1 Cherry-pick Intro

git cherry-pick C3 C4 C7

3.2 Interactive Rebase Intro

git rebase -i master~4 --aboveAll

4.1 Grabbing Just 1 Commit

git checkout master
git cherry-pick C4

4.2 Juggling Commits

git rebase -i caption~2 --aboveAll
git commit --amend
git rebase -i caption~2 --aboveAll
git branch -f master caption

4.3 Juggling Commits #2

git checkout master
git cherry-pick C2
git commit --amend
git cherry-pick C3

4.4 Git Tags

git tag v0 C1
git tag v1 C2
git checkout C2

4.5 Git Describe

git commit

5.1 Rebasing over 9000 times

git rebase master bugFix
git rebase bugFix side
git rebase side another
git rebase another master

5.2 Multiple parents

git branch bugWork master~^2~

5.3 Branch Spaghetti

git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2

vim插件CtrlP中文文档

带有直观接口的全路径模糊文件, 缓冲区, 最近最多使用, 标签, ... 检索。使用纯净的Vimscript编写,可以运行在MacVim,gVim和版本号7.0以上的Vim中。 全面支持Vim的正则表达式 |regexp| 作为搜索模式,内建最近最多使用文件监测,项目根目录定位和更多特性。

抽空翻译了CtrlP的帮助文档,这个应该是目前最好的搜索插件了。Github地址:kien/ctrlp.vim · GitHub 如果CtrlP的作者merge我的request的话,可能会成为项目默认的中文文档,暂时只能在我fork的分支中获取,Github地址:codepiano/ctrlp.vim · GitHub。 这个插件的选项很多,建议把选项都看一下,自己定制过的用起来才顺手。 对于翻译上的建议和指正,欢迎提issue。

在线版地址:

solarized-light版:ctrlp-cn-light

solarized-dark版:ctrlp-cn-dark


vim插件pathogen介绍

插件作者

vim-pathogen是一个操作vim的runtimepath的插件,通过灵活的操作runtimepath,可以对安装的vim插件进行方便的管理。 vim原始的安装插件的方式需要将插件文件复制到vim下的对应目录中,所有的插件混合在一个目录,不便于管理。 使用vim-pathogen后,可以将插件放在原始的独立目录内,由pathogen插件通过操作runtimepath加载其余的插件。 插件的github地址为:tpope/vim-pathogen · GitHub
作者是tpope,tpope贡献了很多实用的vim插件,他的github:tpope (Tim Pope) · GitHub

安装插件

pathogen插件的安装可以按照原始的方式,直接将插件文件复制到~/.vim/autoload中,然后将需要由pathogen加载的插件放入~/.vim/bundle。 要启用pathogen插件,还需要在vimrc文件里, filetype plugin indent on之前的任何地方,加入下面的命令:

" 执行pathogen.vim中的infect函数
execute pathogen#infect()
" 注意:需要在下面设置之前添加上面的执行语句
syntax on
filetype plugin indent on

如果你有强迫症,想把pathogen插件也放入~/.vim/bundle目录中,可以在vimrc中添加如下命令:

" 通过runtime命令将pathogen.vim加入vim的运行时环境
runtime bundle/vim-pathogen.git/autoload/pathogen.vim
" 执行pathogen.vim中的infect函数
execute pathogen#infect()

通过上面的命令,也可以大概猜测出pathogen加载插件的机制,应该也是通过runtime命令,去动态的将~/vim/bundle目录中的插件添加到 vim的运行时环境。

定制插件存放目录

可以通过下面的方式指定pathogen去加载指定目录下的插件:

execute pathogen#infect('bundle/{}', '~/src/vim/bundle/{}')

生成插件tags文件

由于插件现在是存放在独立的目录中,使用:helptags命令生成文档的tags文件就不是太方便。插件提供了:Helptags函数来解决这个问题, 通过该函数可以很方便的生成插件文档的tags文件。

使用github管理插件

可以使用个人帐号在github新建一个仓库,专门用来托管vim插件和设置,然后将所需的vim插件作为子模块添加到工程中, vim.org和github.com进行了合作,所有的vim插件都会自动获得一个github地址,pathogen这种组织插件的方式可以结合git的submodule机制, 便捷的将个人所安装的插件全部托管在github上,将vim插件的git项目作为git submodule加入到自己的插件托管项目中, 通过git submodule命令对插件进行统一的管理和更新,具体操作方式参考下面的命令:

" 添加新的vim插件vim-pathogen作为子模块到.vim/bundle目录
git submodule add git@github.com:tpope/vim-pathogen.git .vim/bundule/pathogen
" 通过git submodule更新所有插件
git submodule foreach git pull origin master

vim插件surround介绍

插件作者

vim-surround是一个处理成对出现的“包围结构”的插件,比如处理括号、引号和html标签。对文本的外包的结构进行增加、修改和删除。 由于插件提供的命令接受vim文本对象和vim的移动命令,使用起来比较方便,额外的学习成本比较低。 插件的github地址为:tpope/vim-surround · GitHub
作者是tpope,tpope贡献了很多实用的vim插件,他的github:tpope (Tim Pope) · GitHub

普通模式命令

普通模式下,插件提供下列按键绑定:

替换:change surround

cs命令是change surround的缩写,可以对指定的文本的外部包围字符进行替换,命令接受两个参数: 第一个是被替换的外部包围字符,第二个是要替换为的字符。替换时光标需要移动到被包围的文本内。 比如需要将字符串'test'外部的包围字符'替换为",可以将光标移动到文本区域内,然后使用cs'"即可 下面是一些例子,部分来自帮助文件,其中的*号代表光标位置
注意 命令中使用形如()、{}、[]的字符的左半部分和右半部分是有区别的, 区别在于处理中的头部和尾部的空格的处理,考虑例子6、7、8、9的情况,处理字符串(   test   ), 字符串有3个头部空格,有2个尾部空格。
规则 规则可以总结如下:
1.第一个参数使用符号的左半部分,会自动删除所有的头部和尾部 的空格,使用右半部分则不对空格进行处理
2.第二个参数使用符号的左半部分,会自动在左半部分的后面和右半部分的前面插入一个空格
注意例子8中的空格个数,被自动插入了空格

样例序号 原始文本 执行命令 执行结果
1 "Hello*world!" cs"' 'Helloworld!'
2 "Hello*world!" cs"<q> <q>Helloworld!</q>
3 (( Hello*world! )) cs(* (*Hello*world!*)
4 (( Hello*world! )) cs( * (* Hello*world! *)
5 <div>Yo!*</div> cst<p> <p>Yo!</p>
6 (   test   ) cs([ [ test ]
7 (   test   ) cs(] [test]
8 (   test   ) cs)[ [    test    ]
9 (   test   ) cs)] [   test   ]

删除:delete surround

ds命令是delete surround的缩写,该命令只接受一个参数,即为需要删除的外部包围字符 如果需要删除文本外部的标签,可以使用字符t来指代标签,不需要输入标签全称 下面是一些例子:
注意 命令中使用形如()、{}、[]的字符的左半部分和右半部分是有区别的, 规则同cs命令的规则1,即同样遵守第一个参数的规则,不再举例示范

样例序号 原始文本 执行命令 执行结果
1 "Hello*world!" ds" Hello world!
2 ((Hello*world!)) ds{ (Hello*world!)
2 (123+4*56)/2 ds) 123+456/2
3 <div>Yo!*</div> dst Yo!

添加:you surround

ys命令是you surround(按作者的说法),可以对指定的文本进行包围,命令接受两个参数: 第一个是指示文本范围或者移动位置的文本对象,第二个是包围操作使用的字符。插入时光标需要移动到被包围的文本内。 比如需要将字符串test添加外部包围字符',可以将光标移动到文本区域内,然后使用ysaw"即可,其中aw会被当作vim文本对象, ys模式有一种变形,即yss和ySS,操作的对象是当前行,不过yss的包围符号添加在行首行尾,而ySS的符号会插入两个新行来包围。 下面是一些例子,部分来自帮助文件,其中的*号代表光标位置
指定范围的两种方法
1.文本对象,规则基本同vim的文本对象规则一样
2.移动位置,可以使用^、$、f等命令来指定位置,作用范围是当前光标到指定的位置
注意 命令中使用形如()、{}、[]的字符的左半部分和右半部分是有区别的, 规则同cs命令的规则2,即同样遵守第二个参数的规则,不再举例示范

样例序号 原始文本 执行命令 执行结果
1 test ysiw' 'test'
2 'test' ysi') '(test)'
3 'test' ysa') ('test')
4 foo*testbar ystb) foo(test)bar
5 test ysaw<p class="example"> <p class="example">test</p>

可视模式命令

可视模式下可以选择需要的文本块,然后使用命令S,就可以输入用来进行包围的字符,不再赘述。

插入模式命令

插件的插入模式还处于试验状态,可以在插入模式下插入字符对,不过我并没有测试成功。通过map命令查看文档中的按键绑定,发现并未绑定函数。

定制插件行为

插件提供对符号的行为进行定制的功能,如果需要定制'-'符号在php文件中的功能,则按下面步骤操作

" 1.使用vim函数获得ascii码
:echo char2nr("-")
" 2.在vim文件中添加绑定,并使用文件类型侦测
" 注意b:surround_45使用了'-'的ascii码值45
autocmd FileType php let b:surround_45 = "<?php \r ?>"

如果文件类型是php,则在字符串 print "Hello *world!"上执行yss-即可得到<?php print "Hello world!" ?>。使用如下方式还可以请求用户输入,jekyll的语法高亮使用highlight语法来完成,每次输入较麻烦,可以在vimrc中加入下面的设置

let g:surround_45 = "{% hightlight \1代码语言: \1 %}\r{% endhighlight %}"

这样就自定义了字符"-"的包围语法模板,比如在testtest上使用ySS-,会显示“代码语言:”并等待用户输入,输入bash,则得到下面的代码 其中的"\1代码语言: \1"被替换为用户输入的字符串,"\r"被替换为用户选择的需要被包围的文本,其余的均原样输出, 如果需要,可以在语法模板中使用换行等转义字符。语法模板也支持正则表达式的处理,但是语法过于古怪和丑陋,个人认为没有使用的价值。

{% highlight bash %}
testtest
{% endhighlight %}
  

—  原创作品许可 — 署名-非商业性使用-禁止演绎 3.0 未本地化版本 — CC BY-NC-ND 3.0   —