使用Git、Git GUI和TortoiseGit

1. 關於命令行

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

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

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

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

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

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

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

因此,有了TortoiseSVN和TortoiseGit。緩存

2. Git GUI

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

gitgui

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

gitk

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

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

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

3. 安裝TortoiseGit

3.1 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版本的權利。

3.2 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在本地編譯成可執行文件。

3.3 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

4. 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了,看來我也沒必要羅嗦 😀

4.1 轉換OpenSSH密鑰到ppk格式

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

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

putty_key_generator

4.2 生成OpenSSH和ppk格式的密鑰

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

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

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

4.3 在TortoiseGit中使用SSH host

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

4.4 從 putty 切換到 OpenSSH

也許是你一時 手賤……唔,手快選擇了 putty 做爲客戶端,某天又良心發現想用 OpenSSH ,是否必須重裝一次 TortoiseGit 來從新選擇一次呢?

我曾經這樣作過,直到我找到這個設置:

putty to openssh

是的,只須要把 ssh客戶端 改爲 git for windows 提供的 ssh.exe 便可。若是用 Cygwin,那麼這個程序在 cygwin/bin 目錄中。

5. 雜項

5.1 換行符的問題 autocrlf and safecrlf

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

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

例如,出現這種狀況:

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

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

# 簽出時將換行符轉換成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 就能夠發揮做用了:

# 拒絕提交包含混合換行符的文件
git config --global core.safecrlf true # 容許提交包含混合換行符的文件 git config --global core.safecrlf false # 提交包含混合換行符的文件時候給出警示 git config --global core.safecrlf warn 

5.2 文件權限問題 755 and 664

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

$ 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了。

解決方法:

git config --global core.filemode false
git config core.filemode false 

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

6. Mac OS X GUI 選擇

由於 Mac OS X 已經自帶了 git 工具,絕大多數狀況下,不須要使用 GUI 工具。

若是必定要使用,那麼建議使用下面兩款:

6.1 GitX-dev

GitX-dev

6.2 SourceTree

SourceTree

個人選擇主要參考 The Best Mac Git Gui 以及 Git 官網的 GUI Clients 。

7. 文章參考

相關文章
相關標籤/搜索