在上篇中,咱們已經能基本使用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
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
對象模型定義了git版本存儲的方式。
每一次提交git會根據內容生成一個SHA1值,做爲對象名。app
版本跟蹤結構分爲4個部分:工做區,暫存區,本地倉庫,遠程倉庫。
less
不免在提交以後發現一些錯誤,但願能亡羊補牢補救一下,這就須要使用以下命令。編輯器
# 修改上次的提交 git commit --amend # 合併本地全部未提交的提交, 在彈出的交互界面, 保留一行的pick,把其餘每行提交的pick改成fixup或者squuash # 其實從上面的操做上看,若是你想保留幾個提交,就保留幾個pick便可 git rebase -i origin/master # 合併最後兩個提交, 在彈出的交互界面,操做同上 git rebase -i HEAD~2
簡單的修改提交多是合理的,可是合併提交,就須要考慮到提交的目的,不建議把徹底獨立的提交硬是合併在一塊兒, 從工程上會下降版本管理的意義,同時增大了合併到其餘分支出錯的可能性。ide
前面講到了branch,它的使用場景下,有一種常見的操做,就是把某個commit也合併到另一個分支B,怎麼作呢?工具
// 切換到分支B git checkout B // 把以前的commit使用cherry-pick命令到當前分支 git cherry-pick 5d1c8562cd3d6b902e7d1542940ba39a97179017
git reset的藝術就在於它的幾個參數的使用。
當了解上面定義的版本庫,暫存區,工做區概念以後,reset的幾個參數的區別就很是好說明了,我畫了一張圖:
若是一個項目的提交很是對,面對一個不知道何時出現的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命令能夠查看每一個文件的每一行的版本信息,包括提交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實踐(下)/