记一次小团队Git实践(下)

在上篇中,咱们已经能基本使用git了,接下来继续更深刻的挖掘一下git。java

更多的配置自定义信息

除了前面讲的用户名和邮箱的配置,还能够自定义其余配置:android

# 自定义你喜欢的编辑器,可选
git config --global core.editor vim
# 自定义差别工具,可选
git config --global merge.tool vimdiff
git config --global mergetool.prompt false
# 为git着色
git config --global color.ui true

还有一些配置,好比core.autocrlf,core.whitespace等等就点到为止,不作赘述。git

忽略文件 -- 使用.gitignore

git支持使用.gitignore文件定义忽略规则,一行一个。
gitignore文件只能忽略非版本库的文件,对于已经添加到版本库的文件,须要先删除掉才能忽略。
因此,通常.gitignore文件建议在建立项目的时候就加进来,这样能够减小没必要要的麻烦,没必要把一些中间生成文件添加到版本库。
以Android为例子:vim

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Eclipse project files
.classpath
.project

# Android Studio
.idea/
.gradle
/*/local.properties
/*/out
build
/*/*/production
*.iml
*.iws
*.ipr
*~
*.swp

两个重要概念

git最基础也是最重要的两个概念:对象模型和版本跟踪结构。bash

  1. 对象模型定义了git版本存储的方式。
    每一次提交git会根据内容生成一个SHA1值,做为对象名。app

  2. 版本跟踪结构分为4个部分:工做区,暂存区,本地仓库,远程仓库。
    git reset 的几个参数区别示意图less

修改提交

不免在提交以后发现一些错误,但愿能亡羊补牢补救一下,这就须要使用以下命令。编辑器

# 修改上次的提交
git commit --amend
# 合并本地全部未提交的提交, 在弹出的交互界面, 保留一行的pick,把其余每行提交的pick改成fixup或者squuash
# 其实从上面的操做上看,若是你想保留几个提交,就保留几个pick便可
git rebase -i origin/master
# 合并最后两个提交, 在弹出的交互界面,操做同上
git rebase -i HEAD~2

简单的修改提交多是合理的,可是合并提交,就须要考虑到提交的目的,不建议把彻底独立的提交硬是合并在一块儿, 从工程上会下降版本管理的意义,同时增大了合并到其余分支出错的可能性。ide

cherry-pick -- 分支之间的smart merge

前面讲到了branch,它的使用场景下,有一种常见的操做,就是把某个commit也合并到另一个分支B,怎么作呢?工具

// 切换到分支B
git checkout B
// 把以前的commit使用cherry-pick命令到当前分支
git cherry-pick 5d1c8562cd3d6b902e7d1542940ba39a97179017

reset的艺术

git reset的艺术就在于它的几个参数的使用。
当了解上面定义的版本库,暂存区,工做区概念以后,reset的几个参数的区别就很是好说明了,我画了一张图:
git reset 的几个参数区别示意图

二分法定位问题 -- git bisect的使用

若是一个项目的提交很是对,面对一个不知道何时出现的bug,git借用了二分法平均时间最快的思想,提供了git bisect命令。

// 开始查找, 对应最后面的结束查找
git bisect start
// 标记当前版本为错误
git bisect bad
// 标记5d1c8562cd3d6b902e为正确的版本
git bisect good 5d1c8562cd3d6b902e
// 如今git会自动选取bad和good的中间版本
// ...
// 咱们能作的就是不断的测试并标记这些中间版本时good仍是bad,直到找到问题
// git bisect good 或者git bisect bad
// ...
// 结束查找,回到开始查找以前的状态
git bisect reset

这行代码是谁加的 -- git blame助你火眼金睛

git blame命令能够查看每一个文件的每一行的版本信息,包括提交SHA,日期,做者:

git blame ./lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java

结果:

406962f0 (Jay      2015-02-05 19:31:17 +0800   1) package com.jayfeng.lesscode.core;
406962f0 (Jay      2015-02-05 19:31:17 +0800   2)
406962f0 (Jay      2015-02-05 19:31:17 +0800   3) import android.content.Context;
8ee8388a (Jay      2015-05-23 18:20:40 +0800   4) import android.support.v4.app.Fragment;
8ee8388a (Jay      2015-05-23 18:20:40 +0800   5) import android.support.v4.app.FragmentManager;
8ee8388a (Jay      2015-05-23 18:20:40 +0800   6) import android.support.v4.app.FragmentPagerAdapter;
a03f8aa3 (Jay      2015-05-23 16:59:05 +0800   7) import android.support.v4.view.PagerAdapter;
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800   8) import android.support.v7.widget.RecyclerView;
406962f0 (Jay      2015-02-05 19:31:17 +0800   9) import android.util.SparseArray;
406962f0 (Jay      2015-02-05 19:31:17 +0800  10) import android.view.LayoutInflater;
406962f0 (Jay      2015-02-05 19:31:17 +0800  11) import android.view.View;
406962f0 (Jay      2015-02-05 19:31:17 +0800  12) import android.view.ViewGroup;
406962f0 (Jay      2015-02-05 19:31:17 +0800  13) import android.widget.BaseAdapter;
406962f0 (Jay      2015-02-05 19:31:17 +0800  14)
406962f0 (Jay      2015-02-05 19:31:17 +0800  15) import java.util.List;
406962f0 (Jay      2015-02-05 19:31:17 +0800  16)
4719215f (think    2015-02-06 22:06:50 +0800  17) public class AdapterLess {
406962f0 (Jay      2015-02-05 19:31:17 +0800  18)
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  19)     public static <T> RecyclerView.Adapter<RecycleViewHolder> $recycle(final Context context,
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  20)                                                                        final List<T> list,
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  21)                                                                        final int layoutId,
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  22)                                                                        final RecycleCallBack recycleCallBack) {
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  23)         RecyclerView.Adapter<RecycleViewHolder> result = new RecyclerView.Adapter<RecycleViewHolder>() {
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  24)             @Override
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  25)             public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  26)                 View view = LayoutInflater.from(context)
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  27)                         .inflate(layoutId, viewGroup, false);
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  28)                 RecycleViewHolder recycleViewHolder = new RecycleViewHolder(view);
2cf7bb1c (Jay      2015-07-26 11:59:18 +0800  44)    ... ...

小结

git做为小而美的工具,开创了一个版本控制的新时代。
学习git是一个按部就班的过程,经过结合基本使用方法和实践场景的练习,达到熟练使用的程度,可成!

同步发布:http://www.jayfeng.com/2015/07/25/记一次小团队Git实践(下)/

相关文章
相关标签/搜索