使用Git、Git GUI和TortoiseGit

原文 http://zengrong.net/post/1722.htmhtml


2012-12-26更新:在TortoiseGit中使用SSH host
2012-12-30更新:在安裝的時候選擇TortoiseGit使用的SSH客戶端linux


注意: 本文不講解任何關於Git提交、合併等等使用細節和語法,只記錄做者在使用Git相關工具中碰到的問題和選擇的經驗。本文只是我的意見的集中,不表明適合全部人。若是你是 「被慣壞了的那批」,請不要介意。:-)git

關於命令行

我一直建議在命令行中使用Git或者SVN。由於這樣可能更加了解他們的工做方式,也不容易遺漏重要的問題和提醒。github

在Windows習慣的驅使下,大多數人是不會看彈出的對話框中有什麼信息的,通常都是直接關掉。可是,版本庫給咱們的提示信息都是很是重要的,有的是衝突,有的是提交失敗,等等,這些都被略過了。編程

我碰到的關於版本庫使用問題主要包括下面這些:windows

  • 沒有獲取到最新版本就編譯程序
    出現這個問題的緣由,主要是忽略了文件的衝突。有的是從不看版本庫給的提示,有的是太依賴Windows資源管理器中指示衝突的圖標覆蓋。衆所周知,Windows系統的圖標緩存一直都有那麼點問題。
  • 用刪除文件的方式解決衝突
    許多程序猿並不知道如何解決衝突,也看不懂版本庫在文件中加入的解決衝突的提示。
  • 用刪除文件代替revert
    至於爲何你們都這麼用,我還搞不懂……
  • 強行覆蓋提交
    碰到衝突後,備份本身修改的文件,而後恢復版本庫中最新文件,再用本身的文件覆蓋版本庫中的文件而後提交。 哥哥誒~~你乾的好事!

其實若是在命令行中使用Git或者SVN,以上的問題應該都不會存在。由於命令行會事無鉅細的給咱們提示,尤爲是Git的命令行,會很是聰明的猜想咱們的意圖並給咱們提示。
使用者要正確的使用命令行,就必須去仔細閱讀版本庫的文檔。這樣就能進一步瞭解版本庫的工做原理,減小在使用中的錯誤。緩存

另外,Git的不少功能,尤爲是高級功能,只有命令行能實現。bash

但並不是全部程序猿都願意使用命令行工具,尤爲是被Windows慣壞了的那批。服務器

因此,有了TortoiseSVN和TortoiseGit。session

Git GUI

Git自帶GUI界面。使用 git gui 命令能夠打開它。在這個界面中能夠完成commit、merge、push、pull等等經常使用操做。

gitgui

使用 gitk 能夠打開查看Git版本庫歷史,在 git gui 中也有菜單能夠打開它。

gitk

我的覺得,徹底能夠不用安裝TortoiseGit,對於絕大多數程序猿來講,這個界面已經足夠了。

可是,和「關於命令行」中說的那句話同樣,並不是全部的程序猿都願意使用這個 界面簡陋到醜陋 的工具,尤爲是被TortoiseSVN慣壞了的那批。

那些從SVN轉換過來的程序猿,絕大多數都只用過TortoisSVN。那麼好吧,就讓界面、名字都徹底同樣的TortoiseGit登場吧!

安裝TortoiseGit

TortoiseGit沒有集成Git

TortoiseGit官方網站能夠下載到它。有32bit和64bit版本,同時也有中文語言包(但我不建議你安裝)。

安裝完畢以後,若是你沒有安裝過Git,那麼還須要去下載msysGit來安裝。由於TortoiseGit其實只是一個殼,它須要調用Git命令行才能發揮做用。(如今你知道我爲何推薦你用命令行了麼?)

若是你不安裝msysGit,那麼在運行TortoiseGit的時候會彈出這個提示:

need_git

爲何TortoiseGit不像TortoiseSVN同樣,把SVN命令行工具集成在安裝包中呢?我猜測是如下幾點緣由:

  • Git官方從未出過Windows版本二進制包;
  • msysGit和TortoiseGit是兩個不一樣的團隊開發的;
  • msysGit和TortoiseGit的更新週期差別較大;
  • TortoiseGit團隊但願安裝包更小;
  • TortoiseGit團隊給用戶更靈活的選擇Git版本的權利。

Git for Windows VS msysGit

msysGit的主頁提供了兩個項目:Git for Windows和msysGit,並寫明瞭它們的詳細區別。
我的認爲,Git for Windows適合絕大多數程序猿(又見絕大多數 :D )。因此,強烈建議安裝Git for Window。
msysGit使用一種很BT也很NB的方式來安裝。先安裝一個最小的MinGW/MSYS系統,而後使用git pull 全部的源碼,調用gcc在本地編譯成可執行文件。

Cygwin

若是本機安裝過Cygwin,那麼在安裝msysGit的時候,cygwin的bin目錄不能位於PATH環境變量中,不然msysGit會拒絕安裝。
其實,若是你不在乎Cygwin提供的Git版本比較老,你徹底能夠不安裝Git for Windows或者msysGit,直接在TortoiseGit中設置Git.exe的路徑爲Cygwin的bin目錄便可。

gitpath

因爲Cygwin目前的Git版本較老,在運行TortoiseGit的時候你會獲得這個提示:

gitold

關於Cygwin、MinGW以及msysGit的關係和選擇,能夠看這篇文章:Cygwin與MinGW,如何選擇?
還有這篇轉載的文章:Msys/MinGW與Cygwin/gcc

TortoiseGit的密鑰

我認爲TortoiseGit最大的問題,就是在於它使用ppk密鑰格式,而不是使用OpenSSH密鑰格式。
由於linux系統是默認使用OpenSSH的,因此Git在基於命令行的時候是使用OpenSSH格式的密鑰。
同理,gitolite這種服務器端程序使用的是OpenSSH格式的密鑰。
因此,必須將原有的OpenSSH密鑰轉換成PPK密鑰才能在TortoiseGit中使用。

在安裝TortoiseGit的時候,你能夠選擇使用Putty仍是OpenSSH做爲SSH客戶端。安裝程序中說,Putty和Windows配合得更好。

gitold

如何選擇?我分別給出它們的特色:

Putty

  1. Putty有GUI界面,能夠經過配置sessions來訪問不一樣的git服務器端口
  2. Putty有GUI程序(Putty Key Generator)來生成密鑰;
  3. 若是使用Putty做爲SSH客戶端,那麼傳輸速度可能會比較慢(我的感受,固然也有人和我有同樣的感受);
  4. Putty不能直接使用原有的OpenSSH密鑰,必須將其轉換成PPK密鑰才行。

OpenSSH

  1. OpenSSH是Git命令行程序默認使用的SSH客戶端程序;
  2. Git for Windows默認就包含了OpenSSH程序;
  3. 你能夠利用已有的OpenSSH密鑰,不用作轉換(例如我原來用cygwin的時候積累了一堆OpenSSH密鑰,如今只須要在~/.ssh下作一個符號連接就能用了);
  4. GitHub/bitbucket等Host使用的都是OpenSSH密鑰;
  5. 大多數Linux發行版默認使用OpenSSH做爲服務端;
  6. 你能夠方便的使用命令行程序來實現自動化處理。

看完上面的特色,若是你仍是選擇了Putty做爲客戶端的話,那麼須要轉換原有的OpenSSH密鑰(若是有的話);
若是你依然義無反顧選擇了OpenSSH做爲客戶端的話,我相信你已經知道如何生成、修改、配置SSH了,看來我也沒必要羅嗦 :D

轉換OpenSSH密鑰到ppk格式

可使用TortoiseGit自帶的Putty Key Generator來轉換原來的OpenSSH密鑰到ppk格式。

打開該程序,選擇 Conversions->Import Key 命令將OpenSSH 私鑰 導入界面中,而後點擊 Save private key 按鈕將密鑰保存成ppk格式。建議在 Key comment 中輸入說明,不然密鑰多了很難分辨。至於密碼,爲了方即可以不設置。

putty_key_generator

生成OpenSSH和ppk格式的密鑰

爲了同時支持服務端和客戶端,咱們能夠在生成一個密鑰的時候,同時生成該密鑰的ppk格式和OpenSSH格式。而每一個密鑰對都包含 公鑰私鑰,兩對一共是4個文件。這樣就能夠知足全部狀況了。

打開Putty Key Generator,選擇 Generator 按鈕,晃動鼠標生成一個密鑰,而後這樣處理:

  • 點擊 Save private key 按鈕將密鑰保存成 ppk格式私鑰
  • 點擊 Save public key 按鈕將密鑰保存成 ppk格式公鑰
  • 點擊 Conversions->Export OpenSSH Key 按鈕將密鑰保存成 OpenSSH格式私鑰
  • 獲取上圖紅框中的全部文本內容,粘貼到文本編輯軟件中,保存爲一個單行的文件,這就是 OpenSSH格式公鑰

在TortoiseGit中使用SSH host

若是使用Putty做爲TortoiseGit的SSH客戶端,那麼就不能使用OpenSSH的 ~/.ssh/config 來定義使用不一樣的端口和密鑰訪問SSH,而是須要使用 PuTTY Session。這篇文章進行了詳細講解:http://zengrong.net/post/1775.htm

換行符的問題 autocrlf and safecrlf

Windows(\r\n)、Linux(\n)和MacOS(\r)三個主流系統的換行符各不相同,這樣在跨平臺合做的時候就容易出現換行符的問題。

Git提供了 autocrlfsafecrlf 兩個參數來解決這個問題。但這兩個參數若是沒用好,就會影響開發。

例如,出現這種狀況:

A和B兩個開發人員,A使用LF(\n)作換行符,B使用CRLF(\r\n)作換行符,且都沒有開啓 autocrlf 參數,那麼A在遷出B的文件,並使用本身的編輯器打開以後就會發現,雖然沒有對文件作任何修改,但它的狀態是modified。這是因爲A的編輯器自動將B的文件中的全部換行符替換成了(LF),這與版本庫中的(CRLF)不一樣。

讓咱們來看看 autocrlf 參數的做用:

? View Code BASH
1
2
3
4
5
6
7
8
# 簽出時將換行符轉換成CRLF,簽入時轉換回 LF。
git config --global core.autocrlf true
 
#簽出時不轉換換行符,簽入時轉換回 LF
git config --global core.autocrlf input
 
#簽出簽入均不轉換
git config --global core.autocrlf false

這些選項在TorgoiseGit中也能夠設置。

個人建議是在不管在什麼系統下編程,都把全部人的編輯器的換行符模式設置成Unix格式,而後把autocrlf設置成false,這樣一勞永逸。
畢竟除了Windows記事本這類軟件外,已經不多有文本編輯器不支持換行符設置了。

若是你把換行符搞亂了,在一個文件中既包含windows風格的換行符也包含unix風格換行符,那麼 safecrlf 就能夠發揮做用了:

? View Code BASH
1
2
3
4
5
6
7
8
# 拒絕提交包含混合換行符的文件
git config --global core.safecrlf true
 
# 容許提交包含混合換行符的文件
git config --global core.safecrlf false 
 
# 提交包含混合換行符的文件時候給出警示
git config --global core.safecrlf warn

文件權限問題 755 and 664

我在Cygwin下以命令行的形式使用Git,同時也使用TortoiseGit。
在使用TortoiseGit簽出使用cygwin提交的項目時,發現全部的文件權限都改變了:

? View Code BASH
1
2
3
4
$ git diff 
diff --git a/launch4j/spritesheet_conterver.xml b/launch4j/spritesheet_conterver.xml
old mode 100755
new mode 100644

這是由於msysgit是一個類Unix模擬器,須要擁有Unix形式的文件訪問權限。而因爲Windows的種種限制,信息不能復原,從而致使原來的755成644了。

解決方法:

? View Code BASH
1
2
git config --global core.filemode false
git config core.filemode false

這個選擇的在TortoiseGit中沒有界面來設置,只能用命令行或者手動修改git配置文件。

文章參考