stash & stash pop

当你正在写一段代码的时候,突然有其他事请需要打断你编码的过程,此时使用git的正确姿势应该是:

git stash

把当前未提交的改动“复制”到另一个地方暂存起来,使用git status命令可以发现

On branch master
nothing to commit, working directory clean

待要恢复的时候执行:

git stash pop

关于.gitignore

当我们使用vim的时候总会有临时文件产生,例如.swp或者~。在以前粗放型的git使用中(使用git add –all命令),会把这些临时文件或者编译所产生的中间变量都加入到stage中。其实这种并不是一个好的(起码是精致的)git使用习惯。恰当的做法是使用.gitignore文件。

.gitignore文件有自己的格式:

以下转自刘大帅的解读gitignore Manual Page

  • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9]示匹配所有0到9的数字)。

一个.gitignore例子:

#此为注释-将被git忽略

#忽略所有.a结尾的文件

*.a

#但lib.a除外

!lib.a

#仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO

/TODO

#忽略build/目录下的所有文件

build/

#会忽略doc/notes.txt,但不包括doc/server/arch.txt

doc/*.txt

#ignore all .txt files in the doc/ directory

doc/**/*.txt

两个星号连在一起在路径中有特殊的含义:

  1. **/foo表示的是任意路径下的foo文件或路径;**/foo/bar表示的是任意路径下在foo里面的bar文件或路径。
  2. abc/**表示的是abc下的所有文件,具有无限深度。
  3. a/**/b表示a/b,a/x/b或者a/x/y/b等等。
  4. 除上述三种情形之外的连续星号视为非法。

另外,gitignore.io可以帮你自动生成常规的.gitignore文件。

git config –global, system or local?

一般情况下,git配置过程中第一步就是配置用户名和邮箱:

git config –global user.name “sean MA”

git config –global user.mail “ma.xiaoyuan.mail@gmail.com”

但以前一直没有深究为什么要用global参数。

[以下引用自git-scm]

git 使用一系列的配置文件来存储你定义的偏好,它首先会查找/etc/gitconfig文件,该文件含有对系统上所有用户及他们所拥有的仓库都生效的配置值,如果传递system参数给git config命令,git会读写这个文件。

接下来git会查找每个用户的~/.gitconfig文件,你能传递global项让git读写该文件。

最后git会查找由用户定义的各个库中git目录下的配置文件(.git/config),该文件中的值只对属主库有效。 以上阐述的三层配置从一般到特殊层层推进,如果定义的值有冲突,以后面层中定义的为准,例如:在.git/config与/etc/gitconfig的较量中,.git/config得了胜利。当然你也可以直接手动编辑这些配置文件。