1. 程式人生 > >使用Git、Git GUI和TortoiseGit

使用Git、Git GUI和TortoiseGit

body nts mac-os-x 很難 output global clas rac google

1. 關於命令行

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

在Windows習慣的驅使下,大多數人是不會看彈出的對話框中有什麽信息的,一般都是直接關掉。但是,版本庫給我們的提示信息都是非常重要的,有的是沖突,有的是提交失敗,等等,這些都被略過了。

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

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

其實如果在命令行中使用 Git 或者 SVN ,以上的問題應該都不會存在。因為命令行會事無巨細的給我們提示,尤其是Git的命令行,會非常聰明的猜測我們的意圖並給我們提示。
使用者要正確的使用命令行,就必須去仔細閱讀版本庫的文檔。這樣就能進一步了解版本庫的工作原理,減少在使用中的錯誤。

另外,Git的很多功能,尤其是高級功能,只有命令行能實現。

但並非所有程序猿都願意使用命令行工具,尤其是被Windows慣壞了的那批。

所以,有了TortoiseSVN和TortoiseGit。

2. Git GUI

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

技術分享

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

技術分享

個人以為,完全可以不用安裝TortoiseGit,對於絕大多數程序猿來說,這個界面已經足夠了。

但是,和“關於命令行”中說的那句話一樣,並非所有的程序猿都願意使用這個 界面簡陋到醜陋 的工具,尤其是被TortoiseSVN慣壞了的那批。

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

3. 安裝TortoiseGit

3.1 TortoiseGit沒有集成Git

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

安裝完畢之後,如果你沒有安裝過Git,那麽還需要去下載msysGit來安裝。因為TortoiseGit其實只是一個殼,它需要調用Git命令行才能發揮作用。(現在你知道我為什麽推薦你用命令行了麽?)

如果你不安裝msysGit,那麽在運行TortoiseGit的時候會彈出這個提示:

技術分享

為什麽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目錄即可。

技術分享

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

技術分享

關於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配合得更好。

技術分享

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

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

4.1 轉換OpenSSH密鑰到ppk格式

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

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

技術分享

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 來重新選擇一次呢?

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

技術分享

是的,只需要把 ssh客戶端 改成 git for windows 提供的 ssh.exe 即可。如果用 Cygwin,那麽這個程序在 cygwin/bin 目錄中。

5. 雜項

5.1 換行符的問題 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 參數的作用:

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 就可以發揮作用了:

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

5.2 文件權限問題 755 and 664

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

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

解決方法:

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

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

5.3 中文文件名和路徑亂碼

在文件名和路徑名中包含中文的時候, git status 的顯示是這樣的:

1 2 3 4 5 6 7 8 git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) "\344\275\240\345\245\275.txt" nothing added to commit but untracked files present (use "git add" to track)

要解決這個問題,只需要告訴 git 不對 0x80 以上的字符進行轉義即可:

1 git config --global core.quotepath false

查看 官方說明 :

The commands that output paths (e.g. ls-files, diff), when not given the -z option, will quote “unusual” characters in the pathname by enclosing the pathname in a double-quote pair and with backslashes the same way strings in C source code are quoted. If this variable is set to false, the bytes higher than 0x80 are not quoted but output as verbatim. Note that double quote, backslash and control characters are always quoted without -z regardless of the setting of this variable.

使用後效果如下:

1 2 3 4 5 6 7 8 git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) 你好.txt nothing added to commit but untracked files present (use "git add" to track)

6. Mac OS X GUI 選擇

因為 Mac OS X 已經自帶了 git 工具,絕大多數情況下,不需要使用 GUI 工具。

如果一定要使用,那麽建議使用下面兩款:

6.1 GitX-dev

技術分享

6.2 SourceTree

技術分享

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

原文地址:https://blog.zengrong.net/post/1722.html

使用Git、Git GUI和TortoiseGit