记一次小团队Git实践(下)
在上篇中,我们已经能基本使用git了,接下来继续更深入的挖掘一下git。
更多的配置自定义信息
除了前面讲的用户名和邮箱的配置,还可以自定义其他配置:
# 自定义你喜欢的编辑器,可选
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等等就点到为止,不做赘述。
忽略文件 -- 使用.gitignore
git支持使用.gitignore文件定义忽略规则,一行一个。
gitignore文件只能忽略非版本库的文件,对于已经添加到版本库的文件,需要先删除掉才能忽略。
所以,一般.gitignore文件建议在创建项目的时候就加进来,这样可以减少不必要的麻烦,不必把一些中间生成文件添加到版本库。
以Android为例子:
# 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最基础也是最重要的两个概念:对象模型和版本跟踪结构。
对象模型定义了git版本存储的方式。
每一次提交git会根据内容生成一个SHA1值,作为对象名。版本跟踪结构分为4个部分:工作区,暂存区,本地仓库,远程仓库。

修改提交
难免在提交之后发现一些错误,希望能亡羊补牢补救一下,这就需要使用如下命令。
# 修改上次的提交
git commit --amend
# 合并本地所有未提交的提交, 在弹出的交互界面, 保留一行的pick,把其他每行提交的pick改为fixup或者squuash
# 其实从上面的操作上看,如果你想保留几个提交,就保留几个pick即可
git rebase -i origin/master
# 合并最后两个提交, 在弹出的交互界面,操作同上
git rebase -i HEAD~2
简单的修改提交可能是合理的,但是合并提交,就需要考虑到提交的目的,不建议把完全独立的提交硬是合并在一起, 从工程上会降低版本管理的意义,同时增大了合并到其他分支出错的可能性。
cherry-pick -- 分支之间的smart merge
前面讲到了branch,它的使用场景下,有一种常见的操作,就是把某个commit也合并到另外一个分支B,怎么做呢?
// 切换到分支B
git checkout B
// 把之前的commit使用cherry-pick命令到当前分支
git cherry-pick 5d1c8562cd3d6b902e7d1542940ba39a97179017
reset的艺术
git reset的艺术就在于它的几个参数的使用。
当了解上面定义的版本库,暂存区,工作区概念之后,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实践(下)/
记一次小团队Git实践(下)的更多相关文章
- 记一次小团队Git实践(中)
对于初学者,从使用上先入手,往往学的最快,并从中汲取教训,再回头更深入的学习,效果尤佳. 安装git 安装git自不必说,mac已经内置了git,linux下一个命令就能搞定,windows下需要下载 ...
- 记一次小团队Git实践(上)
公司规模不大,成立之初,选择了svn作为版本控制系统.这对于用惯了git的我来说,将就了一段时间后,极为不爽,切换到git-svn勉强能用.随后,因为产品需要发布不同的版本,而git-svn对远程分支 ...
- 小团队git开发模式
实验室要使用Git进行代码管理,但是git非常复杂,各种开发模式也是层出不穷.作为新手的偶们很是发囧啊!!网上搜了一下,发现很多并不适合我们小团队运作(它本身就是为Linux内核管理而开发的分布式代码 ...
- 小团队Git协作流程
git和svn 最大的差异在于git是分布式的管理方式而svn是集中式的管理方式. 集中式 集中式代码管理的核心是服务器,所有开发者在开始coding之前必须从服务器获取代码,然后开发,最后解决冲突, ...
- Git 在小团队中的管理流程(转)
目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍 ...
- Git 在小团队中的管理流程
目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍 ...
- 记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题
记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题 前端开发中会经常涉及清理缓存的事情. 在一次开发后, 需要清理缓存,一个哥们怎么清理都不生效, 于是向我求救. 在我看了下后 ...
- 达观数据CTO纪达麒:小标注数据量下自然语言处理实战经验
自然语言处理在文本信息抽取.自动审校.智能问答.情感分析等场景下都有非常多的实际应用需求,在人工智能领域里有极为广泛的应用场景.然而在实际工程应用中,最经常面临的挑战是我们往往很难有大量高质量的标注语 ...
- Scrum&Kanban在移动开发团队的实践 (二)
Scrum&Kanban在移动开发团队的实践系列: Scrum&Kanban在移动开发团队的实践 (一) Scrum&Kanban在移动开发团队的实践 (二) 在第一篇分享文章 ...
随机推荐
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- codeforces 460D Little Victor and Set(构造、枚举)
最近的CF几乎都没打,感觉挺水的一个题,不过自己仿佛状态不在,看题解才知道做法. 输入l, r, k (1 ≤ l ≤ r ≤ 1012; 1 ≤ k ≤ min(106, r - l + 1)). ...
- ASM:《X86汇编语言-从实模式到保护模式》1-4章:处理器,内存和硬盘基础
其实很久之前就学完了实模式了,但是一直没有总结,感觉现在直接在书上做笔记的弊端就是有些知识点不能很很深刻地记下来(毕竟手写最明显的优点就是能深刻地记住知识,但是就是用太多的时间罢了).一下内容都是一些 ...
- (2016弱校联盟十一专场10.2) E.Coins
题目链接 很久之前写的了,好像是对拍打表过的,推一下就行了. #include <bits/stdc++.h> using namespace std; typedef long long ...
- NEFU 504 new Flip Game (高斯消元)
题目链接 题解:和 poj1753Filp game 差不多,区别在于t组数据并且翻转的时候多了一个左上角. #include <iostream> #include <cstdio ...
- java中带继承类的加载顺序详解及实战
一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...
- September 22nd 2016 Week 39th Thursday
Things won are done, the soul of joy lies in the doing. 得到即是完结,快乐的精髓在于过程. Things won are done, thing ...
- 群内大神与你交流WEB经验 业内专家指点就职技巧
就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...
- XMPP框架下微信项目总结(5)花名册获取(好友列表)
---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...
- 20145206实验四《Android开发基础》
20145206 实验四<Android开发基础> 实验内容 ·安装Android Studio ·运行安卓AVD模拟器 ·使用安卓运行出虚拟手机并显示HelloWorld以及自己的学号 ...