使用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等等經常使用操做。bash

gitgui

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

gitk

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

可是,和「關於命令行」中說的那句話同樣,並不是全部的程序猿都願意使用這個 界面簡陋到醜陋 的工具,尤爲是被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了,看來我也沒必要羅嗦 :D

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 參數的做用:

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

GitX-dev

6.2 SourceTree

SourceTree

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

 

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

相關文章
相關標籤/搜索