1、寫在開頭
Java做爲一個編程界最流行的語言之一,有着很強的生命力。代碼的編寫規範也是不容忽視的,今天,我就把本身閱讀的國內的互聯網巨頭阿里巴巴的《阿里巴巴 Java 開發手冊》一些精彩內容摘錄以下。以饗讀者。《阿里巴巴Java開發手冊 終極版v1.3.0.pdf》 下載地址html
2、精彩摘錄
4.1)【命名風格】java
【01 強制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類 命名以它要測試的類的名稱開始,以 Test 結尾。git
【02 強制】中括號是數組類型的一部分,數組定義以下:String[] args; 反例:使用 String args[]的方式來定義。程序員
【03強制】POJO 類中布爾類型的變量,都不要加 is,不然部分框架解析會引發序列化錯誤。 spring
==反例:定義爲基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(), 框架在反向解析的時候,「覺得」對應的屬性名稱是 deleted,致使屬性獲取不到,進而拋出異 常。shell
【04 強制】包名統一使用小寫,點分隔符之間有且僅有一個天然語義的英語單詞。包名統一使用 單數形式,可是類名若是有複數含義,類名可使用複數形式。 正例: 應用工具類包名爲 com.alibaba.open.util、類名爲 MessageUtils(此規則參考 spring 的框架結構)數據庫
【05 推薦】若是模塊、接口、類、方法使用了設計模式,在命名時體現出具體模式編程
【06 推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔 性,並加上有效的 Javadoc 註釋。儘可能不要在接口裏定義變量,若是必定要定義變量,確定是 與接口方法相關,而且是整個應用的基礎常量。 正例:接口方法簽名:void f(); 接口基礎常量表示:String COMPANY = "alibaba"; 反例:接口方法定義:public abstract void f(); 說明:JDK8 中接口容許有默認實現,那麼這個 default 方法,是對全部實現類都有價值的默 認實現。設計模式
【不是很理解--todo】接口和實現類的命名有兩套規則:api
1)【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務必定是接口,內部 的實現類用 Impl 的後綴與接口區別。 正例:CacheServiceImpl 實現 CacheService 接口。
2)【推薦】若是是形容能力的接口名稱,取對應的形容詞作接口名(一般是–able 的形式)。 正例:AbstractTranslator 實現 Translatable。
4.2)【常量定義】
【不是很理解--todo】【強制】不容許任何魔法值(即未經定義的常量)直接出如今代碼中。 反例:String key = "Id#taobao_" + tradeId; cache.put(key, value);
4.3)【代碼格式】
【01 強制】大括號的使用約定。若是是大括號內爲空,則簡潔地寫成{}便可,不須要換行;若是 是非空代碼塊則: 1) 左大括號前不換行。 2) 左大括號後換行。 3) 右大括號前換行。 4) 右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。
【02 強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。
【03 強制】任何二目、三目運算符的左右兩邊都須要加一個空格。 說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。
【04 強制】註釋的雙斜線與註釋內容之間有且僅有一個空格。 正例:// 註釋內容,注意在//和註釋內容之間有一個空格。
4.4)【OOP規約】
【01 強制】Object 的 equals 方法容易拋空指針異常,應使用常量或肯定有值的對象來調用 equals。
==正例:"test".equals(object); 反例:object.equals("test"); 說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類)
【02 強制】全部的相同類型的包裝類對象之間值的比較,所有使用 equals 方法比較。
說明:對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象是在 IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值能夠直接使用==進行 判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑, 推薦使用 equals 方法進行判斷。
關於基本數據類型與包裝數據類型的使用標準以下:
1) 【強制】全部的 POJO 類屬性必須使用包裝數據類型。
2) 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。
3) 【推薦】全部的局部變量使用基本數據類型。
==說明:POJO 類屬性沒有初值是提醒使用者在須要使用時,必須本身顯式地進行賦值,任何 NPE (即空指針異常)問題,或者入庫檢查,都由使用者來保證。
==正例:數據庫的查詢結果多是 null,由於自動拆箱,用基本數據類型接收有 NPE 風險。
==反例:好比顯示成交總額漲跌狀況,即正負 x%,x 爲基本數據類型,調用的 RPC 服務,調用 不成功時,返回的是默認值,頁面顯示爲 0%,這是不合理的,應該顯示成中劃線。因此包裝 數據類型的 null 值,可以表示額外的信息,如:遠程調用失敗,異常退出。
【03 強制】序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗;如 果徹底不兼容升級,避免反序列化混亂,那麼請修改 serialVersionUID 值。 說明:注意 serialVersionUID 不一致會拋出序列化運行時異常。
【04 強制】POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString 時,若是繼承了另外一個 POJO 類,注意在前面加一下 super.toString。 說明:在方法執行拋出異常時,能夠直接調用 POJO 的 toString()方法打印其屬性值,便於排 查問題。
【05 推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一塊兒, 便於閱讀,
【06 推薦】 類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter 方法。
【07 推薦】循環體內,字符串的鏈接方式,使用 StringBuilder 的 append 方法進行擴展。
==說明:反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,而後進行 append 操做,最後經過 toString 方法返回 String 對象,形成內存資源浪費。
==反例: String str = "start"; for (int i = 0; i < 100; i++) { str = str + "hello"; }
【08 推薦】類成員與方法訪問控制從嚴:
1) 若是不容許外部直接經過 new 來建立對象,那麼構造方法必須是 private。
2) 工具類不容許有 public 或 default 構造方法。
3) 類非 static 成員變量而且與子類共享,必須是 protected。
4) 類非 static 成員變量而且僅在本類使用,必須是 private。
5) 類 static 成員變量若是僅在本類使用,必須是 private。
6) 如果 static 成員變量,必須考慮是否爲 final。
7) 類成員方法只供類內部調用,必須是 private。
8) 類成員方法只對繼承類公開,那麼限制爲 protected。
==說明:任何類、方法、參數、變量,嚴控訪問範圍。過於寬泛的訪問範圍,不利於模塊解耦。 思考:若是是一個 private 的方法,想刪除就刪除,但是一個 public 的 service 方法,或者 一個 public 的成員變量,刪除一下,不得手心冒點汗嗎?變量像本身的小孩,儘可能在本身的 視線內,變量做用域太大,無限制的處處跑,那麼你會擔憂的。
4.5)【集合處理】
【01 強制】關於 hashCode 和 equals 的處理,遵循以下規則:
1) 只要重寫 equals,就必須重寫 hashCode。
2) 由於 Set 存儲的是不重複的對象,依據 hashCode 和 equals 進行判斷,因此 Set 存儲的 對象必須重寫這兩個方法。
3) 若是自定義對象作爲 Map 的鍵,那麼必須重寫 hashCode 和 equals。 說明:String 重寫了 hashCode 和 equals 方法,因此咱們能夠很是愉快地使用 String 對象 做爲 key 來使用。
【02 強制】ArrayList的subList結果不可強轉成ArrayList,不然會拋出ClassCastException 異常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList.
==說明:subList 返回的是 ArrayList 的內部類 SubList,並非 ArrayList ,而是 ArrayList 的一個視圖,對於 SubList 子列表的全部操做最終會反映到原列表上。
== 例子:https://blog.csdn.net/qq_15118961/article/details/80893780
【03 強制】在 subList 場景中,高度注意對原集合元素個數的修改,會致使子列表的遍歷、增長、 刪除均會產生 ConcurrentModificationException 異常。
【04 強制】使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型徹底 同樣的數組,大小就是 list.size()。
【05 強制】使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方 法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。
== 說明:asList 的返回對象是一個 Arrays 內部類,並無實現集合的修改方法。Arrays.asList 體現的是適配器模式,只是轉換接口,後臺的數據還是數組。
==String[] str = new String[] { "you", "wu" }; List list = Arrays.asList(str); 第一種狀況:list.add("yangguanbao"); 運行時異常。 第二種狀況:str[0] = "gujin"; 那麼 list.get(0)也會隨之修改。
【06 強制】泛型通配符來接收返回的數據,此寫法的泛型集合不能使用 add 方 法,而不能使用 get 方法,作爲接口調用賦值時易出錯。
==說明:擴展說一下 PECS(Producer Extends Consumer Super)原則:第1、頻繁往外讀取內 容的,適合用<? extends T>。第2、常常往裏插入的,適合用<? super T>。
【07 強制】c。remove 元素請使用 Iterator 方式,若是併發操做,須要對 Iterator 對象加鎖。
【08 強制】 在 JDK7 版本及以上,Comparator 要知足以下三個條件,否則 Arrays.sort, Collections.sort 會報 IllegalArgumentException 異常。
== 說明:三個條件以下 1) x,y 的比較結果和 y,x 的比較結果相反。 2) x>y,y>z,則 x>z。 3) x=y,則 x,z 比較結果和 y,z 比較結果相同。
== 參考資料:http://www.javashuo.com/article/p-exdndlvt-b.html : JAVA Comparator 接口排序用法
【09 推薦】集合初始化時,指定集合初始值大小。
==說明:HashMap 使用 HashMap(int initialCapacity) 初始化,
==正例:initialCapacity = (須要存儲的元素個數 / 負載因子) + 1。注意負載因子(即 loader factor)默認爲 0.75,若是暫時沒法肯定初始值大小,請設置爲 16(即默認值)。
== 反例:HashMap 須要放置 1024 個元素,因爲沒有設置容量初始大小,隨着元素不斷增長,容 量 7 次被迫擴大,resize 須要重建 hash 表,嚴重影響性能。
【10 推薦】使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。
==說明:keySet 實際上是遍歷了 2 次,一次是轉爲 Iterator 對象,另外一次是從 hashMap 中取出 key 所對應的 value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效 率更高。若是是 JDK8,使用 Map.foreach 方法。 正例:values()返回的是 V 值集合,是一個 list 集合對象;keySet()返回的是 K 值集合,是 一個 Set 集合對象;entrySet()返回的是 K-V 值組合集合。
== 網絡例子: https://blog.csdn.net/lisiben/article/details/84855030
【11 推薦】高度注意 Map 類集合 K/V 能不能存儲 null 值的狀況,以下表格:
4.6)【集合處理】
【強制】獲取單例對象須要保證線程安全,其中的方法也要保證線程安全。 說明:資源驅動類、工具類、單例工廠類都須要注意。
4.7)【控制語句】
【01 強制】在一個 switch 塊內,每一個 case 要麼經過 break/return 等來終止,要麼註釋說明程 序將繼續執行到哪個 case 爲止;在一個 switch 塊內,都必須包含一個 default 語句而且 放在最後,即便它什麼代碼也沒有。
【02 強制】在 if/else/for/while/do 語句中必須使用大括號。即便只有一行代碼,避免採用 單行的編碼方式:if (condition) statements;
【03 推薦】表達異常的分支時,少用 if-else 方式,這種方式能夠改寫成: if (condition) { ... return obj; } // 接着寫 else 的業務邏輯代碼;
==正例:超過 3 層的 if-else 的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現,
== 參考: http://www.javashuo.com/article/p-artqhpbk-o.html
【04 推薦】循環體中的語句要考量性能,如下操做盡可能移至循環體外處理,如定義對象、變量、 獲取數據庫鏈接,進行沒必要要的 try-catch 操做(這個 try-catch 是否能夠移至循環體外)。
4.8)【註釋規約】
【01 強制】類、類屬性、類方法的註釋必須使用 Javadoc 規範,使用/**內容*/格式,不得使用 // xxx 方式。
【02 強制】全部的類都必須添加建立者和建立日期。
【03 強制】方法內部單行註釋,在被註釋語句上方另起一行,使用//註釋。方法內部多行註釋 使用/* */註釋,注意與代碼對齊。
【04 參考】特殊註釋標記,請註明標記人與標記時間。注意及時處理這些標記,經過標記掃描, 常常清理此類標記。線上故障有時候就是來源於這些標記處的代碼。
== 1) 待辦事宜(TODO):( 標記人,標記時間,[預計處理時間]) 表示須要實現,但目前還未實現的功能。這其實是一個 Javadoc 的標籤,目前的 Javadoc 尚未實現,但已經被普遍使用。只能應用於類,接口和方法(由於它是一個 Javadoc 標籤)。
== 2) 錯誤,不能工做(FIXME):(標記人,標記時間,[預計處理時間]) 在註釋中用 FIXME 標記某代碼是錯誤的,並且不能工做,須要及時糾正的狀況。
4.9)【其餘】
【01 強制】後臺輸送給頁面的變量必須加$!{var}——中間的感嘆號。 說明:若是 var=null 或者不存在,那麼${var}會直接顯示在頁面上。
【02 強制】注意 Math.random() 這個方法返回是 double 類型,注意取值的範圍 0≤x<1(可以 取到零值,注意除零異常),若是想獲取整數類型的隨機數,不要將 x 放大 10 的若干倍而後 取整,直接使用 Random 對象的 nextInt 或者 nextLong 方法。
【03 強制】獲取當前毫秒數 System.currentTimeMillis(); 而不是 new Date().getTime(); 說明:若是想獲取更加精確的納秒級時間值,使用 System.nanoTime()的方式。在 JDK8 中, 針對統計時間等場景,推薦使用 Instant 類。
【04 推薦】任何數據結構的構造或初始化,都應指定大小,避免數據結構無限增加吃光內存。
【05 推薦】及時清理再也不使用的代碼段或配置信息。 說明:對於垃圾代碼或過期配置,堅定清理乾淨,避免程序過分臃腫,代碼冗餘。
== 正例:對於暫時被註釋掉,後續可能恢復使用的代碼片段,在註釋代碼上方,統一規定使用三 個斜槓(///)來講明註釋掉代碼的理由。
4.10)【異常處理】
【01 強制】對大段代碼進行 try-catch,這是不負責任的表現。catch 時請分清穩定代碼和非穩 定代碼,穩定代碼指的是不管如何不會出錯的代碼。對於非穩定代碼的 catch 儘量進行區分 異常類型,再作對應的異常處理。
【02 參考】在代碼中使用「拋異常」仍是「返回錯誤碼」,對於公司外的 http/api 開放接口必須 使用「錯誤碼」;而應用內部推薦異常拋出;跨應用間 RPC 調用優先考慮使用 Result 方式,封 裝 isSuccess()方法、「錯誤碼」、「錯誤簡短信息」。
== 說明:關於 RPC 方法返回方式使用 Result 方式的理由: 1)使用拋異常返回方式,調用方若是沒有捕獲到就會產生運行時錯誤。 2)若是不加棧信息,只是 new 自定義異常,加入本身的理解的 error message,對於調用 端解決問題的幫助不會太多。若是加了棧信息,在頻繁調用出錯的狀況下,數據序列化和傳輸 的性能損耗也是問題。
4.11)【日誌規約】
【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架 SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。
【推薦】謹慎地記錄日誌。生產環境禁止輸出 debug 日誌;有選擇地輸出 info 日誌;若是使 用 warn 來記錄剛上線時的業務行爲信息,必定要注意日誌輸出量的問題,避免把服務器磁盤 撐爆,並記得及時刪除這些觀察日誌。
4.12)【單元測試】
【01 強制】好的單元測試必須遵照 AIR 原則。 說明:單元測試在線上運行時,感受像空氣(AIR)同樣並不存在,但在測試質量的保障上, 倒是很是關鍵的。好的單元測試宏觀上來講,具備自動化、獨立性、可重複執行的特色。
A:Automatic(自動化) I:Independent(獨立性) R:Repeatable(可重複)
【02 強制】保持單元測試的獨立性。爲了保證單元測試穩定可靠且便於維護,單元測試用例之間 決不能互相調用,也不能依賴執行的前後次序。
== 反例:method2 須要依賴 method1 的執行,將執行結果作爲 method2 的輸入。
【03 強制】對於單元測試,要保證測試粒度足夠小,有助於精肯定位問題。單測粒度至可能是類級 別,通常是方法級別。
【04 推薦】單元測試的基本目標:語句覆蓋率達到 70%;核心模塊的語句覆蓋率和分支覆蓋率都 要達到 100%
【05 推薦】對於數據庫相關的查詢,更新,刪除等操做,不能假設數據庫裏的數據是存在的, 或者直接操做數據庫把數據插入進去,請使用程序插入或者導入數據的方式來準備數據。
【06 推薦】單元測試做爲一種質量保障手段,不建議項目發佈後補充單元測試用例,建議在項 目提測前完成單元測試。
4.13)【安全規約】
【01 強制】用戶請求傳入的任何參數必須作有效性驗證。
== 說明:忽略參數校驗可能致使:
page size 過大致使內存溢出
惡意 order by 致使數據庫慢查詢
任意重定向
SQL 注入
反序列化注入
正則輸入源串拒絕服務 ReDoS
==說明:Java 代碼用正則來驗證客戶端的輸入,有些正則寫法驗證普通用戶輸入沒有問題, 可是若是攻擊人員使用的是特殊構造的字符串來驗證,有可能致使死循環的結果。
【02 強制】在使用平臺資源,譬如短信、郵件、電話、下單、支付,必須實現正確的防重放限制, 如數量限制、疲勞度控制、驗證碼校驗,避免被濫刷、資損。 說明:如註冊時發送驗證碼到手機,若是沒有限制次數和頻率,那麼能夠利用此功能騷擾到其 它用戶,並形成短信平臺資源浪費。
【03 推薦】發貼、評論、發送即時消息等用戶生成內容的場景必須實現防刷、文本內容違禁詞過 濾等風控策略。
4.14)【MySQL數據庫】
【01 強制】主鍵索引名爲 pk_字段名;惟一索引名爲 uk_字段名;普通索引名則爲 idx_字段名。 說明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的簡稱。
【02 強制】小數類型爲 decimal,禁止使用 float 和 double。
==說明:float 和 double 在存儲的時候,存在精度損失的問題,極可能在值的比較時,獲得不 正確的結果。若是存儲的數據範圍超過 decimal 的範圍,建議將數據拆成整數和小數分開存儲。
【03 強制】varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,若是存儲長 度大於此值,定義字段類型爲 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索 引效率。
【04 推薦】單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。 說明:若是預計三年後的數據量根本達不到這個級別,請不要在建立表時就分庫分表。
【05 強制】業務上具備惟一特性的字段,即便是多個字段的組合,也必須建成惟一索引。
== 說明:不要覺得惟一索引影響了 insert 速度,這個速度損耗能夠忽略,但提升查找速度是明 顯的;另外,即便在應用層作了很是完善的校驗控制,只要沒有惟一索引,根據 墨菲定律,必 然有髒數據產生。
【06 強制】在 varchar 字段上創建索引時,必須指定索引長度,不必對全字段創建索引,根據 實際文本區分度決定索引長度便可。 說明:索引的長度與區分度是一對矛盾體,通常對字符串類型數據,長度爲 20 的索引,區分度會高達 90%以上,可使用 count(distinct left(列名, 索引長度))/count(*)的區分度 來肯定。
【07 推薦】若是有 order by 的場景,請注意利用索引的有序性。order by 最後的字段是組合 索引的一部分,而且放在索引組合順序的最後,避免出現 file_sort 的狀況,影響查詢性能。 正例:where a=? and b=? order by c; 索引:a_b_c 反例:索引中有範圍查找,那麼索引有序性沒法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 沒法排序。
【08 推薦】利用延遲關聯或者子查詢優化超多分頁場景。
==說明:MySQL 並非跳過 offset 行,而是取 offset+N 行,而後返回放棄前 offset 行,返回 N 行,那當 offset 特別大的時候,效率就很是的低下,要麼控制返回的總頁數,要麼對超過 特定閾值的頁數進行 SQL 改寫。
== 正例:先快速定位須要獲取的 id 段,而後再關聯: SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id
【09 推薦】建組合索引的時候,區分度最高的在最左邊。
==正例:若是 where a=? and b=? ,a 列的幾乎接近於惟一值,那麼只須要單建 idx_a 索引即 可。
== 說明:存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如:where a>? and b=? 那麼即便 a 的區分度更高,也必須把 b 放在索引的最前列。
【10 推薦】防止因字段類型不一樣形成的隱式轉換,致使索引失效。
【11 參考】建立索引時避免有以下極端誤解: 1)寧濫勿缺。認爲一個查詢就須要建一個索引。 2)寧缺勿濫。認爲索引會消耗空間、嚴重拖慢更新和新增速度。 3)抵制唯一索引。認爲業務的唯一性一概須要在應用層經過「先查後插」方式解決
【12 強制】不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 SQL92 定義的 標準統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。 說明:count(*)會統計值爲 NULL 的行,而 count(列名)不會統計此列爲 NULL 值的行。
【13 強制】count(distinct col) 計算該列除 NULL 以外的不重複行數,注意 count(distinct col1, col2) 若是其中一列全爲 NULL,那麼即便另外一列有不一樣的值,也返回爲 0。
【14 強制】使用 ISNULL()來判斷是否爲 NULL 值。
==說明:NULL 與任何值的直接比較都爲 NULL。 1) NULL<>NULL 的返回結果是 NULL,而不是 false。 2) NULL=NULL 的返回結果是 NULL,而不是 true。 3) NULL<>1 的返回結果是 NULL,而不是 true。
【15 參考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少,但 TRUNCATE 無事務且不觸發 trigger,有可能形成事故,故不建議在開發代碼中使用此語句。 說明:TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同。
4.15)【ORM映射】
【01 推薦】不要寫一個大而全的數據更新接口。傳入爲 POJO 類,無論是否是本身的目標更新字 段,都進行 update table setc1=value1,c2=value2,c3=value3; 這是不對的。執行 SQL 時,不要更新無改動的字段,一是易出錯;二是效率低;三是增長 binlog 存儲。
【02 參考】中的 compareValue 是與屬性值對比的常量,通常是數字,表示相等時帶 上此條件;表示不爲空且不爲 null 時執行;表示不爲 null 值時 執行。
3、番外--Git的使用
【01 常見Git命令】
#【001】
統一律念:工做區:改動(增刪文件和內容)
暫存區:輸入命令:git add 改動的文件名,這次改動就放到了 ‘暫存區’
本地倉庫(簡稱:本地):輸入命令:git commit 這次修改的描述,這次改動就放到了 ’本地倉庫’,每一個 commit,我叫它爲一個 ‘版本’。
遠程倉庫(簡稱:遠程):輸入命令:git push 遠程倉庫,這次改動就放到了 ‘遠程倉庫’(GitHub 等)
commit-id:輸出命令:git log,最上面那行 commit xxxxxx,後面的字符串就是 commit-id
#【002】
#編輯修改等
git show # 顯示某次提交的內容 git show $id
git checkout <file-name> #放棄工做區的修改 ,相似於 svn revert
git revert <commit-id> #以新增一個 commit 的方式還原某一個 commit 的修改
#比較diff
git diff <branch1>..<branch2> # 在兩個分支之間比較
git diff --staged # 比較暫存區和版本庫差別
git diff --cached # 比較暫存區和版本庫差別
git whatchanged --since='2 weeks ago' #查看兩個星期內的改動
git diff --word-diff #詳細展現一行中的修改
#查看提交記錄
git log -p -2 # 查看最近兩次詳細修改內容的diff
git blame <file-name> #查看某段代碼是誰寫的, blame 的意思爲‘責怪’,你懂的。
git reflog #顯示本地更新過 HEAD 的 git 命令記錄 ,相似 shell的 history
git log --all --grep='<given-text>' #在 commit log 中查找相關內容
#Git 本地分支管理
git branch -r # 查看遠程分支
git branch <new_branch> # 建立新的分支
git co <branch> # 切換到某個分支
git co $id # 把某次歷史提交記錄checkout出來,但無分支信息,切換到其餘分支會自動刪除
git branch -d <branch> # 刪除某個分支
git branch -vv 展現本地分支關聯遠程倉庫的狀況
git merge <branch> # 將branch分支合併到當前分支
#Git暫存管理
git stash # 暫存
git stash list # 列全部stash
git stash apply # 恢復暫存的內容
git stash drop # 刪除暫存區
#Git遠程分支管理
git pull --no-ff # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併
git push # push全部分支-- 要慎用,仍是要push具體的分支好一點 https://www.cnblogs.com/djiankuo/p/6492533.html
git push -u origin develop # 首次將本地develop分支提交到遠程develop分支,而且track
git push origin master # 將本地主分支推到遠程主分支
git push origin dev_20190513_registrationpath #咱們的java項目 數據統計的Git push命令
#Git遠程倉庫管理
git remote -v # 查看遠程服務器地址和倉庫名稱
git remote show origin # 查看遠程服務器倉庫狀態
【02 】本地倉庫「三棵樹」
本地倉庫由 git 維護的三棵「樹」組成。
1)【圖01】本地倉庫git 三棵樹
2)【圖02】git本地三棵樹的相互轉化命令:https://josh-persistence.iteye.com/blog/2215214
3)三棵樹的更詳細的命令示意圖
git commit的時候,只是提交的 緩存區內的內容(若是你git add過,不然也等同你本地工做區內容的提交)
== git add能夠實現我以前在 雲主機上保存臨時文件的tmpdjp的操做
==git diff 對比的是工做區和 緩存區的區別
==git diff --cached 對比是 緩衝區和本地的 head版本庫的對比
另外須要指出來的是 git stash 不在上面的「三顆樹」裏,git stash 是暫存區,區別於 緩存區「stage」
git stash的用法見 https://www.cnblogs.com/tocy/p/git-stash-reference.html
4、寫在最後
簡單的摘錄,見仁見智,但願喜歡Java開發的同窗能從中收益。
歡迎關注個人微信公衆號哈 「 程序員的文娛情懷」 http://t.cn/RotyZtu 😊