Git初始配置和基本使用


 Git初始配置和基本使用

在學習完本文之后,你應該能夠配置並初始化一個倉庫(repository)、開始或停止跟蹤(track)文件、暫存(stage)或提交(commit)更改。 本章也將向你演示如何配置 Git 來忽略指定的文件和文件模式、如何迅速而簡單地撤銷錯誤操作、如何瀏覽你的項目的歷史版本以及不同提交(commits)間的差異、如何向你的遠程倉庫推送(push)以及如何從你的遠程倉庫拉取(pull)文件。

初次運行Git前的配置

用戶信息

當安裝完 Git 應該做的第一件事就是設置你的用戶名稱與郵件地址。 這樣做很重要,因為每一個 Git 的提交都會使用這些信息,並且它會寫入到你的每一次提交中,不可更改:

  1.  
    $ git config --global user .name "Junk Chen"
  2.  
    $ git config --global user .email junkchen@vip.qq.com

 

“Junk Chen”是你自己設置的名字,junkchen@vip.qq.com是你的郵箱地址。

再次強調,如果使用了 –global 選項,那么該命令只需要運行一次,因為之后無論你在該系統上做任何事情,Git 都會使用那些信息。當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運行沒有 –global 選項的命令來配置。

很多 GUI 工具都會在第一次運行時幫助你配置這些信息。

檢查配置信息

如果想要檢查你的配置,可以使用 git config –list 命令來列出所有 Git 當時能找到的配置。

  1.  
    $ git config --list
  2.  
    core.autocrlf=true
  3.  
    color.diff=auto
  4.  
    color.status=auto
  5.  
    color.branch=auto
  6.  
    help.format=html
  7.  
    user.name=JunkChen
  8.  
    user.email=junkchen@vip.qq.com
  9.  
     

你可以通過輸入 git config : 來檢查 Git 的某一項配置:

  1.  
    $ git config user.name
  2.  
    Junk Chen

獲取幫助

若你使用Git時需要獲取幫助,有三種方法可以找到Git命令的使用手冊:

  1.  
    $ git help <verb>
  2.  
    $ git <verb> --help
  3.  
    $ man git-<verb>

 

如想要獲得config命令的手冊,可執行:

$ git help config

這些命令很棒,因為你隨時隨地可以使用而無需聯網。

安裝和初始配置都已經設置好了,下面就來看看具體的應用了。

獲取Git倉庫

兩種獲取Git項目倉庫的方法: 一是在現有項目或目錄下導入所有文件到Git中; 二是從一個服務器克隆一個現有的Git倉庫。

在現有目錄中初始化倉庫

進入該項目目錄並輸入:

$ git init

該命令將創建一個名為 .git 的子目錄,這個子目錄含有你初始化的 Git 倉庫中所有的必須文件,這些文件是 Git 倉庫的骨干。

克隆現有的倉庫

如果你想獲得一份已經存在了的Git倉庫的拷貝,可以使用git clone [url]。

$ git clone https://github.com/libgit2/libgit2

 

該命令執行后會在當前目錄下創建一個名為 “libgit2” 的目錄,並在在這個目錄下初始化一個.git文件夾,從遠程倉庫拉取所有的數據放在改文件夾,然后從中讀取最新版本的文件的拷貝。 如果你進入到這個新建的 libgit2 文件夾,你會發現所有的項目文件已經在里面了,准備就緒等待后續的開發和使用。 請將 https://github.com/libgit2/libgit2 替換為你自己的Git倉庫地址。

$ git clone https://github.com/libgit2/libgit2 mylibgit

 

這將執行與上一個命令相同的操作,不過在本地創建的倉庫名字變為 mylibgit。

Git 支持多種數據傳輸協議。 上面的例子使用的是https:// 協議,不過你也可以使用 git:// 協議或者使用SSH 傳輸協議,比如 user@server:path/to/repo.git 。

記錄每次更新到倉庫

現在我們有了一個真實項目的 Git 倉庫,並從這個倉庫中取出了所有文件的工作拷貝。 當我們對文件做了些修改,在完成一個階段的目標后,就提交本次更新到倉庫。

請記住,你工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。 已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態可能處於未修改,已修改或已放入暫存區。 工作目錄中除已跟蹤文件以外的所有其它文件都屬於未跟蹤文件,它們既不存在於上次快照的記錄中,也沒有放入暫存區。 初次克隆某個倉庫的時候,工作目錄中的所有文件都屬於已跟蹤文件,並處於未修改狀態。

編輯過某些文件之后,由於自上次提交后你對它們做了修改,Git 將它們標記為已修改文件。 我們逐步將這些修改過的文件放入暫存區,然后提交所有暫存了的修改,如此反復。

檢查當前文件的狀態

查看文件處於什么狀態:

$ git status

 

跟蹤新文件

如果我們的工作目錄中創建了新的文件,可使用git add開始跟蹤一個文件。如跟蹤 READEME.txt 文件:

$ git add READEME.txt

 

此時再運行 git status 命令,會看到 README 文件狀態已發生改變。

git add 命令使用文件或目錄的路徑作為參數;如果參數是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件。

暫存已修改文件

當一個已被跟蹤的文件每次被修改后,需要使用 git add 把最新版本添加到暫存區方可進行提交更新,否則不會提交本次更改到倉庫中。如 READEME.txt 文件被修改后添加暫存:

$ git add READEME.txt

 

git add 是個多功能命令:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區,還能用於合並時把有沖突的文件標記為已解決狀態等。可理解為 “添加內容到下一次提交中”。

查看已暫存和未暫存的修改

如果 git status 命令的輸出對於你來說過於模糊,你想知道具體修改了什么地方,可以用 git diff 命令。

$ git diff

 

此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異, 也就是修改之后還沒有暫存起來的變化內容。

若要查看已暫存的將要添加到下次提交里的內容,可以用 git diff –cached 命令。(Git 1.6.1 及更高版本還允許使用 git diff –staged,效果是相同的,但更好記些。)

git diff 本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。 所以有時候你一下子暫 
存了所有更新過的文件后,運行 git diff 后卻什么也沒有,就是這個原因。

提交更新

當使用 git add 添加到暫存區后,就可以提交到倉庫了。在此之前,請一定要確認還有什么修改過的或新建的文件還沒有 git add 過,否則提交的時候不會記錄這些還沒有暫存起來的變化。這些修改過的文件只保留在本地磁盤。所以,每次准備提交前,先用 git status 看下,是不是都已暫存起來了,然后在運行提交命令 git commit :

$ git commit -m "Input your commit message"

 

使用 -m 選項,添加提交信息。

到此,使用 Git 就完成了,初始化倉庫、添加文件、提交更新到倉庫的全過程。

跳過使用暫存區

盡管使用暫存區域的方式可以精心准備要提交的細節,但有時候這么做略顯得繁瑣。 Git 提供了一個跳過使用暫存區域的方式,只要在提交的時候,給 git commit 加上 -a 選項,Git就會自動把所有已經跟蹤過的文件暫存起來一並提交,從而跳過 git add 步驟。

$ git commit -a -m "Commit message"

 

移除文件

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

$ git rm <finame>

 

下一次提交時,該文件就不再納入版本管理了。 如果刪除之前修改過並且已經放到暫存區域的話,則必須要用強制刪除選項 -f(譯注:即 force 的首字母)。 這是一種安全特性,用於防止誤刪還沒有添加到快照的數據,這樣的數據不能被 Git 恢復。

另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。 換句話說,你想讓文件保留在磁盤,但是並不想讓 Git 繼續跟蹤。 當你忘記添加 .gitignore 文件,不小心把一個很大的日志文件或一堆 .a 這樣的編譯生成文件添加到暫存區時,這一做法尤其有用。 為達到這一目的,使用 –cached 選項:

$ git rm --cached README

 

git rm 命令后面可以列出文件或者目錄的名字,也可以使用 glob 模式。 比方說:

$ git rm log/\*.log

 

注意到星號 * 之前的反斜杠 \, 因為 Git 有它自己的文件模式擴展匹配方式,所以我們不用 shell 來幫忙展開。此命令刪除 log/ 目錄下擴展名為 .log 的所有文件。 類似的比如:

$ git rm \*~

 

該命令為刪除以 ~ 結尾的所有文件。

移動文件

不像其它的 VCS 系統,Git 並不顯式跟蹤文件移動操作。 如果在 Git 中重命名了某個文件,倉庫中存儲的元數據並不會體現出這是一次改名操作。 不過 Git 非常聰明,它會推斷出究竟發生了什么。

既然如此,當你看到 Git 的 mv 命令時一定會困惑不已。 要在 Git 中對文件改名,可以這么做:

$ git mv file_from file_to

 

它會恰如預期般正常工作。 實際上,即便此時查看狀態信息,也會明白無誤地看到關於重命名操作的說明:

  1.  
    $ git mv README.md README
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
    renamed: README.md -> README

 

其實,運行 git mv 就相當於運行了下面三條命令:

  1.  
    $ mv README.md README
  2.  
    $ git rm README.md
  3.  
    $ git add README

 

如此分開操作,Git 也會意識到這是一次改名,所以不管何種方式結果都一樣。 兩者唯一的區別是,mv 是一條命令而另一種方式需要三條命令,直接用 git mv 輕便得多。不過有時候用其他工具批處理改名的話,要記得在提交前刪除老的文件名,再添加新的文件名。

忽略文件

一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。 通常都是些自動生成的文 
件,比如日志文件,或者編譯過程中創建的臨時文件等。 在這種情況下,我們可以創建一個名為 .gitignore 
的文件,列出要忽略的文件模式。 來看一個實際的例子:

  1.  
    $ cat .gitignore
  2.  
    *.[oa]
  3.  
    *~

 

第一行告訴 Git 忽略所有以 .o 或 .a 結尾的文件。第二行告訴 Git 忽略所有以波浪符(~)結尾的文件,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本。此外,你可能還需要忽略 log,tmp 或者 pid 目錄,以及自動生成的文檔等等。 要養成一開始就設置好.gitignore 文件的習慣,以免將來誤提交這類無用的文件。

文件 .gitignore 的格式規范如下:

  • 所有空行或者以 # 開頭的行都會被 Git 忽略。
  • 可以使用標准的 glob 模式匹配。
  • 匹配模式可以以(/)開頭防止遞歸。
  • 匹配模式可以以(/)結尾指定目錄。
  • 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。

所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。

查看提交歷史

在提交了若干更新后,想回顧下提交歷史,可使用 git log 命令。

$ git log

 

撤銷操作

在任何一個階段,你都有可能想要撤消某些操作。 這里,我們將會學習幾個撤消你所做修改的基本工具。 注意,有些撤消操作是不可逆的。 這是在使用 Git 的過程中,會因為操作失誤而導致之前的工作丟失的少有的幾個地方之一。

有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 –amend 選項的提交命令嘗試重新提交:

$ git commit --amend

 

這個命令會將暫存區中的文件提交。 如果自上次提交以來你還未做任何修改(例如,在上次提交后馬上執行了此命令),那么快照會保持不變,而你所修改的只是提交信息。

文本編輯器啟動后,可以看到之前的提交信息。 編輯后保存會覆蓋原來的提交信息。

例如,你提交后發現忘記了暫存某些需要的修改,可以像下面這樣操作:

  1.  
    $ git commit -m 'initial commit'
  2.  
    $ git add forgotten_file
  3.  
    $ git commit --amend

 

最終你只會有一個提交 - 第二次提交將代替第一次提交的結果。

取消暫存文件

如何操作暫存區域與工作目錄中已修改的文件, 這些命令在修改文件狀態的同時,也會提示如何撤消操作。 例如,你已經修改了兩個文件並且想要將它們作為兩次獨立的修改提交,但是卻意外地輸入了 git add * 暫存了它們兩個。 如何只取消暫存兩個中的一個呢? git status 命令提示了你:

  1.  
    $ git add *
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
    renamed: README.md -> README
  7.  
    modified: CONTRIBUTING.md

 

在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD … 來取消暫存。 所以,我們可以這樣來取消暫存 CONTRIBUTING.md 文件:

  1.  
    $ git reset HEAD CONTRIBUTING.md
  2.  
    Unstaged changes after reset:
  3.  
    MCONTRIBUTING.md
  4.  
    $ git status
  5.  
    On branch master
  6.  
    Changes to be committed:
  7.  
    ( use "git reset HEAD <file>..." to unstage)
  8.  
     
  9.  
    renamed: README.md -> README
  10.  
     
  11.  
    Changes not staged for commit:
  12.  
    ( use "git add <file>..." to update what will be committed)
  13.  
    ( use "git checkout -- <file>..." to discard changes in working
  14.  
    directory)
  15.  
     
  16.  
    modified: CONTRIBUTING.md

 

撤銷對文件的修改

如果你並不想保留對 CONTRIBUTING.md 文件的修改怎么辦? 你該如何方便地撤消修改 - 將它還原成上次提交時的樣子(或者剛克隆完的樣子,或者剛把它放入工作目錄時的樣子)? 幸運的是,git status 也告訴了你應該如何做。 在最后一個例子中,未暫存區域是這樣:

  1.  
    Changes not staged for commit:
  2.  
    ( use "git add <file>..." to update what will be committed)
  3.  
    ( use "git checkout -- <file>..." to discard changes in working
  4.  
    directory)
  5.  
    modified: CONTRIBUTING.md

 

它非常清楚地告訴了你如何撤消之前所做的修改。 讓我們來按照提示執行:

  1.  
    $ git checkout -- CONTRIBUTING.md
  2.  
    $ git status
  3.  
    On branch master
  4.  
    Changes to be committed:
  5.  
    ( use "git reset HEAD <file>..." to unstage)
  6.  
     
  7.  
    renamed: README.md -> README

 

可以看到那些修改已經被撤消了。

記住,在 Git 中任何 已提交的 東西幾乎總是可以恢復的。 甚至那些被刪除的分支中的提交或使用 –amend 選項覆蓋的提交也可以恢復。 然而,任何你未提交的東西丟失后很可能再也找不到了。

遠程倉庫的使用

為了能在任意 Git 項目上協作,你需要知道如何管理自己的遠程倉庫。遠程倉庫是指托管在因特網或其他網絡中你的項目的版本庫。 與他人協作涉及管理遠程倉庫以及根據需要推送或拉取數據。

查看遠程倉庫

如果想查看你已經配置的遠程倉庫服務器,可以運行 git remote 命令。 它會列出你指定的每一個遠程服務器的簡寫。 如果你已經克隆了自己的倉庫,那么至少應該能看到 origin ,這是 Git 給你克隆的倉庫服務器的默認名字:

  1.  
    $ git remote
  2.  
    origin

 

可指定選項 -v,回顯示需要讀寫遠程倉庫使用的 Git 保存的與其對應的URL。

  1.  
    $ git remote -v
  2.  
    origin https://github .com/junkchen/Documents.git (fetch)
  3.  
    origin https://github .com/junkchen/Documents.git (push)

 

若還想要查看某個遠程倉庫的更多信息,可以使用 git remote show [remote-name] 命令,如查看 origin :

$ git remote show origin

 

添加遠程倉庫

運行 git remote add < shortname > < url > 添加一個新的遠程Git 倉庫,同時指定一個你可以輕松引用的簡寫:

$ git remote add pb https://github.com/paulboone/ticgit

 

現在可以在命令行中使用字符串 pb 來代替整個 URL。如果你想獲取 Paul 的倉庫中有但你沒有的信息,可以運行 git fetch pb:

$ git fetch pb

 

從遠程倉庫中抓取與拉取

如上面所示,從遠程倉庫中獲取數據,可以執行:

$ git fetch <remote-name>

 

這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。執行完成后,你將會擁有遠程倉庫中所有分支的引用,可隨時合並或查看。

若你使用 git clone 命令克隆一個倉庫,命令會自動將其添加為遠程倉庫並默認以 “origin” 為簡寫。 所以,git fetch origin 會抓取克隆(或上一次抓取)后新推送的所有工作。 必須注意 git fetch 命令會將數據拉取到你的本地倉庫,它並不會自動合並或修改你當前的工作。 當准備好時你必須手動將其合並入你的工作。

如果你有一個分支設置為跟蹤一個遠程分支,可以使用 git pull 命令來自動的抓取然后合並遠程分支到當前分支。 默認情況下,git clone 命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的master 分支(或不管是什么名字的默認分支)。運行 git pull 通常會從最初克隆的服務器上抓取數據並自動嘗試合並到當前所在的分支。

推送到遠程倉庫

使用 git push [remote-name] [branch-name] 命令可以推送到遠程倉庫。 當你想要將 master 分支推送到 origin 服務器時(再次說明,克隆時通常會自動幫你設置好那兩個名字),那么運行這個命令就可以將你所做的備份到服務器:

$ git push origin master

 

只有當你有所克隆服務器的寫入權限,並且之前沒有人推送過時,這條命令才能生效。 當你和其他人在同一時間克隆,他們先推送到上游然后你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先將他們的工作拉取下來並將其合並進你的工作后才能推送。(可先 pull 再 push )

遠程倉庫的移除與重命名

如果想要重命名引用的名字可以運行 git remote rename 去修改一個遠程倉庫的簡寫名。 例如,想要將 pb 重命名為 paul,可以用 git remote rename 這樣做:

  1.  
    $ git remote rename pb paul
  2.  
    $ git remote
  3.  
    origin
  4.  
    paul

 

值得注意的是這同樣也會修改你的遠程分支名字。 那些過去引用 pb/master 的現在會引用 paul/master。

如果因為一些原因想要移除一個遠程倉庫,你已經從服務器上搬走了或不再想使用某一個特定的鏡像了,又或者某一個貢獻者不再貢獻了 - 可以使用 git remote rm :

  1.  
    $ git remote rm paul
  2.  
    $ git remote
  3.  
    origin
     
    -------------------------------------------------------------------------------------------------------------------
    把遠程分支的代碼pull到本地分支:git pull <遠程主機名> <遠程分支名>:<本地分支名>
    如:取回origin主機的xf分支,與本地的xf分支合並,輸入命令:
    git pull origin xf:xf
    遠程主機名可通過上方的git branch -a或git branch -r查詢,看下圖:
    PS:push代碼前最好先用pull更新本地代碼。
     
    8、最后一步:git push <遠程主機名> <本地分支名>:<遠程分支名>
    PS:注意,分支推送順序的寫法是<來源地>:<目的地>,所以git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。
     
    eg: 
    git push origin xf:xf
    上面命令表示,將本地的xf分支推送到origin主機的xf分支。
     
    如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關系"的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
    eg: 
    git push origin test
    上面命令表示,將本地的test分支推送到origin主機的test分支。如果后者不存在,則會被新建。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM