1. 程式人生 > >git學習01

git學習01

Git 提供了一個 git-config 命令,專門用來配置或讀取相應的工作環境變數。這些變數可以存放在以下三個不同的地方:

●/etc/gitconfig 檔案:系統中對所有使用者都普遍適用的配置。若使用 git config 時用--system 選項,讀寫的就是這個檔案。

●~/.gitconfig 檔案:使用者目錄下的配置檔案只適用於該使用者。若使用 git config 時用--global 選項,讀寫的就是這個檔案。

●當前專案的 git 目錄中的配置檔案(也就是工作目錄中的 .git/config 檔案):這裡的配置僅僅針對當前專案有效。每一個級別的配置都會覆蓋上層的相同配置,所以.git/config

 裡的配置會覆蓋/etc/gitconfig 中的同名變數。

第一個要配置的是你個人的使用者名稱稱和電子郵件地址。這兩條配置很重要,每次 Git 提交時都會引用這兩條資訊,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記錄:

$ git config --global user.name "John Doe"
$ git config --global user.email [email protected] example.com
如果用了 --global 選項,那麼更改的配置檔案就是位於你使用者主目錄下的那個,以後你所有的專案都會預設使用這裡配置的使用者資訊。如果要在某個特定的專案中使用其他名字或者電郵,只要去掉
--global 選項重新配置即可,新的設定儲存在當前專案的.git/config 檔案裡。

在解決合併衝突時使用哪種差異分析工具。比如要改用 vimdiff 的話:

$ git config --global merge.tool vimdiff

要檢查已有的配置資訊,可以使用 git config --list 命令,也可以直接查閱某個環境變數的設定,只要把特定的名字跟在後面即可,

$ git config user.name  // 查出user.name配置的值

獲取幫助時用:
git help
git help config

$ git init

初始化後,在當前目錄下會出現一個名為 .git 的目錄,所有 Git 需要的資料和資源都存放在這個目錄中。不過目前,僅僅是按照既有的結構框架初始化好了裡邊所有的檔案和目錄,但我們還沒有開始跟蹤管理專案中的任何一個檔案。

如果當前目錄下有幾個檔案想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些檔案進行跟蹤,然後提交:

$ git add   *.c
$ git add README
$ git commit -m  'initial project version'

以用 -m 引數後跟提交說明的方式,在一行命令中提交更新。

$ git clone git://github.com/schacon/grit.git

如上命令會在當前目錄下建立一個名為“grit”的目錄,其中包含一個 .git 的目錄,用於儲存下載下來的所有版本記錄,然後從中取出最新版本的檔案拷貝。這個新建的grit 目錄包含所有檔案。如果希望在克隆的時候,自己定義要新建的專案目錄名稱,可以在上面的命令末尾指定新的名字。

工作目錄下面的所有檔案都不外乎這兩種狀態:

(1)已跟蹤  已跟蹤的檔案是指本來就被納入版本控制管理的檔案,在上次快照中有它們的記 錄,工作一段時間後,它們的狀態可能是未更新,已修改或者已放入暫存區

(2)未跟蹤  它們既沒有上次更新時的快照,也不在當前的暫存區域。初次克隆某個倉庫時,工作目錄中的所有檔案都屬於已跟蹤檔案,且狀態為未修改。

Git詳解之二:Git基礎

   檔案狀態的週期性變化

要確定哪些檔案當前處於什麼狀態,可以用如下命令:

 git status
根據打印出來的資訊還可以檢視到當前處於哪個分支

git add . 全加到了暫存區域

git add
可以用它開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合併時把有衝突的檔案標記為已解決狀態等。在 git add 後面可以指明要跟蹤的檔案或目錄路徑。如果是目錄的話,就說明要遞迴跟蹤該目錄下的所有檔案。
$ cat .gitignore *.[oa] *~
第一行告訴 Git 忽略所有以 .o 或 .a 結尾的檔案。

第二行告訴 Git 忽略所有以波浪符(~)結尾的檔案。

# 此為註釋 – 將被 Git 忽略
*.a       # 忽略所有 .a 結尾的檔案
!lib.a    # 但 lib.a 除外
/TODO     # 僅僅忽略專案根目錄下的 TODO 檔案,不包括 subdir/TODO
build/    # 忽略 build/ 目錄下的所有檔案
doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
檢視尚未暫存的檔案更新了哪些部分,不加引數直接輸入
git diff

命令比較的是工作目錄中當前檔案和暫存區域快照之間的差異,也就是修改之後還沒有暫存起來的變化內容。若要看已經暫存起來的檔案和上次提交時的快照之間(就是上次暫存)的差異,可以用命令

 git diff --cached
請注意,單單 git diff 不過是顯示還沒有暫存起來的改動,而不是這次工作和上次提交之間的差異。所以有時候你一下子暫存了所有更新過的檔案後,執行git diff 後卻什麼也沒有,就是這個原因。

git commit 加上-a 選項,Git 就會自動把所有已經跟蹤過的檔案暫存起來一併提交,從而跳過 git add 步驟

要從 Git 中移除某個檔案,就必須要從已跟蹤檔案清單中移除(確切地說,是從暫存區域移除),然後提交。可以用如下命令完成此項工作,並連帶從工作目錄中刪除指定的檔案,這樣以後就不會出現在未跟蹤檔案清單中了。

git rm  // 有時候需要使用強制刪除  -f
只刪除暫存區的檔案,而不刪除工作目錄下的檔案,用如下命令:
$ git rm --cached readme.txt
$ git rm log/\*.log
此命令刪除所有log/ 目錄下副檔名為 .log 的檔案
$ git rm \*~
會遞迴刪除當前目錄及其子目錄中所有 ~ 結尾的檔案
$ git log -p -2
-p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新,--stat,僅顯示簡要的增改行數統計,format可以格式化進行輸出

git reset HEAD benchmarks.rb  // 取消快取區暫存的benchmarks.rb檔案,回到之前已修改未暫存的狀態

要檢視當前配置有哪些遠端倉庫,可以用 命令
 git remote  // -v 可以同時顯示克隆的地址

地址只有用 SSH URL 連結時才能將自己的專案推送上去( [email protected] github.com:mojombo/grit.git)

$ git remote add pb git://github.com/paulboone/ticgit.git
新增一個遠端的倉庫

git fetch origin 會抓取從你上次克隆以來別人上傳到此遠端倉庫中的所有更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,需要記住,fetch 命令只是將遠端的資料拉到本地倉庫,並不自動合併到當前工作分支,只有當你確實準備好了,才能手工合併。

如果設定了某個分支用於跟蹤某個遠端倉庫的分支,可以使用 git pull 命令自動抓取資料下來,然後將遠端分支自動合併到本地倉庫中當前分支。在日常工作中我們經常這麼用,既快且好。實際上,預設情況下git clone 命令本質上就是自動建立了本地的 master 分支用於跟蹤遠端倉庫中的 master 分支(假設遠端倉庫確實有 master 分支)。所以一般我們執行git pull,目的都是要從原始克隆的遠端倉庫中抓取資料後,合併到工作目錄中的當前分支。

git push [remote-name] [branch-name]

如果要把本地的 master 分支推送到origin 伺服器上(再次說明下,克隆操作會自動使用預設的 master 和 origin 名字),可以執行下面的命令:

$ git push origin master
 git remote show [remote-name] 檢視某個遠端倉庫的詳細資訊
$ git remote show origin
* remote origin
  URL: [email protected] github.com:defunkt/github.git
  Remote branch merged with 'git pull' while on branch issues // 執行git pull 時將自動合併哪些分支
    issues
  Remote branch merged with 'git pull' while on branch master  // 執行git pull 時將自動合併哪些分
    master
  New remote branches (next fetch will store in remotes/origin) // 它還顯示了有哪些遠端分支還沒有同步到本地
    caching
  Stale tracking branches (use 'git remote prune')  // 哪些已同步到本地的遠端分支在遠端伺服器上已被刪除
    libwalker
    walker2
  Tracked remote branches
    acl
    apiv2
    dashboard2
    issues
    master
    postgres
  Local branch pushed with 'git push' // 執行 git push 時預設推送的分支是什麼
    master:master


$ git remote rename pb paul
修改某個遠端倉庫在本地的簡短名稱
$ git remote rm paul
移除對應的遠端倉庫


自動完成

如果你用的是 Bash shell,可以試試看 Git 提供的自動完成指令碼。下載 Git 的原始碼,進入 contrib/completion 目錄,會看到一個git-completion.bash 檔案。將此檔案複製到你自己的使用者主目錄中(譯註:按照下面的示例,還應改名加上點:cp git-completion.bash ~/.git-completion.bash),並把下面一行內容新增到你的.bashrc 檔案中:

source ~/.git-completion.bash

也可以為系統上所有使用者都設定預設使用此指令碼。Linux 上覆制到/etc/bash_completion.d/ 目錄中。指令碼會在 Bash 啟動時自動載入。

在輸入 Git 命令的時候可以敲兩次跳格鍵(Tab),就會看到列出所有匹配的可用命令建議:

$ git co commit config

此例中,鍵入git co 然後連按兩次 Tab 鍵,會看到兩個相關的建議(命令) commit 和 config。繼而輸入 會自動完成git commit 命令的輸入。

命令的選項也可以用這種方式自動完成,其實這種情況更實用些。比如執行 git log 的時候忘了相關選項的名字,可以輸入開頭的幾個字母,然後敲 Tab 鍵看看有哪些匹配的:

$ git log --s
       --shortstat  --since=  --src-prefix=  --stat   --summary

這個技巧不錯吧,可以節省很多輸入和查閱文件的時間。

Git 命令別名

Git 並不會推斷你輸入的幾個字元將會是哪條命令,不過如果想偷懶,少敲幾個命令的字元,可以用 git config 為命令設定別名。來看看下面的例子:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

現在,如果要輸入 git commit 只需鍵入 git ci 即可。而隨著 Git 使用的深入,會有很多經常要用到的命令,遇到這種情況,不妨建個別名提高效率。

使用這種技術還可以創造出新的命令,比方說取消暫存檔案時的輸入比較繁瑣,可以自己設定一下:

$ git config --global alias.unstage 'reset HEAD --'
這樣一來,下面的兩條命令完全等同:
$ git unstage fileA
$ git reset HEAD fileA

顯然,使用別名的方式看起來更清楚。另外,我們還經常設定 last 命令:

$ git config --global alias.last 'log -1 HEAD'
可以看出,實際上 Git 只是簡單地在命令中替換了你設定的別名。不過有時候我們希望執行某個外部命令,而非 Git 的附屬工具,這個好辦,只需要在命令前加上 ! 就行。如果你自己寫了些處理 Git 倉庫資訊的指令碼的話,就可以用這種技術包裝起來。作為演示,我們可以設定用 git visual 啟動gitk
$ git config --global alias.visual "!gitk"

安裝完後,需要生成一對 Key(這裡指金鑰),然後才能通過加密的方式和伺服器的程式碼庫取得同步。

到開始選單,找到“Git Bash”,執行之,並執行以下命令:

$ ssh-keygen -t rsa -C "[email protected]"

程式會提示您輸入金鑰的檔名,直接按回車即可。
然後會要求你輸入一個密碼,將來在使用金鑰的時候需要提供這個密碼。可以輸入,也可以不輸入直接回車(無論輸入還是不輸入,都會要求你確認一次)。
確認完畢後,程式將生成一對金鑰存放在以下資料夾:

C:\Users\Administrator[這裡替換成你的使用者名稱]\.ssh

金鑰分成兩個檔案,一個私鑰(id_rsa)、一個公鑰(id_rsa.pub)。
私鑰儲存在您的電腦上,公鑰交專案負責人新增到伺服器上。使用者必須擁有與伺服器公鑰所配對的私鑰,才能訪問伺服器上的程式碼庫。