歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 25個Git用法技巧

25個Git用法技巧

日期:2017/2/28 14:23:08   编辑:Linux教程

Andy Jeffries 給 Git 中級用戶總結分享的 25 個小貼士。你不需要去做大量搜索,或許這些小貼士對你就很有幫助的。

我從開始使用git到現在已經差不多18個月了,以為自己已經很懂git了。直到我看到github上 Scott Chacon在 LVS, a supplier/developer of betting/gaming software 上的教學,第一天就受益匪淺。

作為一個很享受git的人,我想要分享從各種社區學到的實用經驗,讓大家不需要花費過多的功夫就能找到答案。

GitHub 教程系列文章

GitHub 使用教程圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm

Git 標簽管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm

Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm

Git 遠程倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm

Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm

Git 服務器搭建與客戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm

Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm

分享實用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm

基本技巧

1.安裝後的第一步

安裝git後,第一件事你需要設置你的名字和郵箱,因為每次提交都需要這些信息。

$ git config --global user.name "Some One"
$ git config --global user.email "[email protected]"

2.是基於指針的

git上的所有東西都是儲存在文件裡的,當你創建一次提交時,它會創建一個包含你的提交信息和相關數據(名字,郵箱,日期/時間、上一次提交等等)的文件並連接一個樹文件,而這個樹文件包含了對象列表或者其他樹。這上面的對象或者blob文件就是這次提交的實際內容(你可以認為這也是一個文件,盡管並沒有儲存在對象裡而是儲存在樹中)。所有的文件都以經過SHA-1計算後的文件名(譯者注:經過SHA-1計算後的數,即git中的版本號)儲存在上面。

從這裡可以看出,分支和標簽都是包含一個指向這次提交的sha-1數(版本號)簡單的文件,這樣使用引用會變得更快和更靈活,創建一個新的分支是就像創建文件一樣簡單,SHA – 1數(版本號)也會引用你這個分支的提交。當然,如果你使用GIT命令行工具(或者GUI)你將無法接觸這些。但真的很簡單。

你可能聽說過HEAD引用,這是一個指向你當前提交的內容的SHA-1 數(版本號)的指針。如果你正在解決合並沖突,使用HEAD不會對你的特定分支有任何改動只會指向你當前的分支。

所有分支的指針都保存在 .git/refs/heads,HEAD指針保存在.git/HEAD,標簽則保存在 .git/refs/tags,有時間就去看看吧。

3. 兩個母體(Parent),當然!

當我們在日志文件中查看合並提交信息,你會看到兩個母體,第一個母體是正在進行的分支,第二個是你要合並的分支。

4.合並沖突

現在,我發現有合並沖突並解決了它,這是一件在我們編輯文件時很正常的事。將 <<<<, ====, >>>> 這些標記移除後,並保存你想要保存的代碼。有些時候在代碼被直接替代之前,能看到沖突是件挺不錯的事。比如在兩個沖突的分支變動之前,可以用這樣的命令方式:

$ git diff --merge
diff --cc dummy.rb  
index 5175dde,0c65895..4a00477  
--- a/dummy.rb
+++ b/dummy.rb
@@@ -1,5 -1,5 +1,5 @@@
  class MyFoo
    def say
-     puts "Bonjour"
 -    puts "Hello world"
++    puts "Annyong Haseyo"
    end
  end

If the file is binary, diffing files isn’t so easy… What you’ll normally want to do is to try each version of the binary file and decide which one to use (or manually copy portions over in the binary file’s editor). To pull a copy of the file from a particular branch (say you’re merging master and feature132):

如果是二進制文件(binary),區別這些文件並不容易。通常你會查看每個二進制文件的版本,再決定使用哪個(或者在二進制文件編輯器中手動復制),並將其推送至特定的分支。(比如你要合並master和feature132)

$ git checkout master flash/foo.fla # or...
$ git checkout feature132 flash/foo.fla
$ # Then...
$ git add flash/foo.fla

Another way is to cat the file from git – you can do this to another filename then copy the correct file over (when you’ve decided which it is) to the normal filename:

另一個方法就是在git中cat文件,你可以將其命名為另一個文件名,然後將你決定的那個文件改為正確的文件名:

$ git show master:flash/foo.fla > master-foo.fla
$ git show feature132:flash/foo.fla > feature132-foo.fla
$ # Check out master-foo.fla and feature132-foo.fla
$ # Let's say we decide that feature132's is correct
$ rm flash/foo.fla
$ mv feature132-foo.fla flash/foo.fla
$ rm master-foo.fla
$ git add flash/foo.fla

更新:感謝carls在原博評論中提醒我,可以使用 “git checkout —ours flash/foo.fla” 和“git checkout —theirs flash/foo.fla” 在不用考慮你需要合並的分支來檢查指定版本,就我個人而言,我喜歡更明確的方法,但這也是一個選擇…

記住,解決完合並沖突後要添加文件。(我之前就犯過這樣的錯誤)

服務,分支和標注

5. 遠程服務

Git有一個非常強大的特性,就是可以有多個遠程服務端(以及你運行的一個本地倉庫)。你不需要總是進行訪問,你可以有多個服務端並能從其中一個(合並工作)讀取再寫入另一個。添加一個遠程服務端很簡單:

$ git remote add john [email protected]:johnsomeone/someproject.git

If you want to see information about your remote servers you can do:

如果你想查看遠程服務端的信息你可以:

# shows URLs of each remote server
$ git remote -v 

# gives more details about each
$ git remote show name 

You can always see the differences between a local branch and a remote branch:

你總是能看到本地分支和遠程分支不同的地方:

$ git diff master..john/master

You can also see the changes on HEAD that aren’t on that remote branch:

你同樣也能看到遠程分支上沒有的HEAD指針的改動:

$ git log remote/branch..
# Note: no final refspec after ..

6. Tagging 標簽

在Git中有兩種類型的標注:輕量級標注和注釋型標注。

記住第二個是Git的指針基礎,兩者區別很簡單,輕量級標注是簡單命名提交的指針,你可以將其指向另一個提交。注釋型標注是一個有信息和歷史並指向標注對象的名字指針,它有著自己的信息,如果需要的話,可以進行GPG標記。

創建兩種類型的標簽很簡單(其中一個命令行有改動)

$ git tag to-be-tested
$ git tag -a v1.1.0 # Prompts for a tag message

7. Creating Branches 創建分支

在git中創建分支是件非常簡單的事情(非常快並只需要不到100byte的文件大小)。創建新分支並切換到該分支,通常是下面這樣的:

$ git branch feature132
$ git checkout feature132

當然,如果你想切換到該分支,最直接的方式是使用這樣一條命令:

$ git checkout -b feature132

如果你想要重新命名本地分支,也很簡單:

$ git checkout -b twitter-experiment feature132
$ git branch -d feature132

更新:或者你(Brian Palmer在原博的評論中指出的)可以使用 -m來切換到“git branch”(就像Mike指出,如果你只需要一個特定的分支,就可以重命名當前分支)

$ git branch -m twitter-experiment
$ git branch -m feature132 twitter-experiment

8.合並分支

以後你可能回想合並你的變動,有兩種方式可以做到這一點:

$ git checkout master
$ git merge feature83 # Or...
$ git rebase feature83

merge和rebase的區別是,merge會嘗試解決改動並創建的新的提交來融合他們。rebase則是將從你最後一次從另一個分支分離之後的改動並入,並直接沿用另一個分支的head指針。盡管如此,在你往遠端服務器上推送分支之前,不要使用rebase。這會讓你混亂。

如果你不能確定哪個分支(哪些需要合並,哪些需要移除)。這裡有兩個git分支切換方式來幫助你:

# Shows branches that are all merged in to your current branch
$ git branch --merged

# Shows branches that are not merged in to your current branch
$ git branch --no-merged

9.遠程分支

如果你想將本地分支放置遠程服務端,你可以用這條命令進行推送:

$ git push origin twitter-experiment:refs/heads/twitter-experiment
# Where origin is our server name and twitter-experiment is the branch

如果你想要從服務端刪除分支:

$ git push origin :twitter-experiment

如果你想要查看遠程分支的狀態:

$ git remote show origin

這將列出那些曾經存在而現在不存在的遠程分支,這將幫助你輕易地刪除你本地多余的分支。

$ git remote prune

最後,如果本地追蹤遠程分支,常用方式是:

$ git branch --track myfeature origin/myfeature
$ git checkout myfeature

盡管這樣,Git的新版本將啟動自動追蹤,如果你使用-b來checkout:

$ git checkout -b myfeature origin/myfeature

Storing Content in Stashes, Index and File System 在stash儲存內容、索引和文件系統

10. Stashing

在Git中你可以將當前的工作區的內容保存到Git棧中並從最近的一���提交中讀取相關內容。以下是個簡單的例子:

$ git stash
# Do something...
$ git stash pop

很多人推薦使用git stash apply來代替pop。這樣子恢復後儲存的stash內容並不會刪除,而‘pop’恢復的同時把儲存的stash內容也刪了 ,使用git stash apply 就可以移除任何棧中最新的內容。

<code data-language="javascript">$ git stash drop
</code>

git可以自動創建基於當前提交信息的指令,如果你更喜歡使用通用的信息(相當於不會對前一次提交做任何改動)

<code data-language="javascript">$ git stash save "My stash message"
</code>

如果你想使用某個stash(不一定是最後一個),你可以這樣將其列表顯示出來然後使用:

<code data-language="javascript">$ git stash list
  stash@{0}: On master: Changed to German
  stash@{1}: On master: Language is now Italian
$ git stash apply stash@{1}
</code>

11.添加交互

在svn中,如果你文件有了改動之後,然後會提交所有改動的文件,在 Git中為了能更好的提交特定的文件或者某個補丁,你需要在交互模式提交選擇提交的文件的內容。

$ git add -i
staged     unstaged path

*** Commands ***
  1: status      2: update   3: revert   4: add untracked
  5: patch      6: diff     7: quit     8: help
What now&gt;

這是基於菜單的交互式提示符。您可以使用命令前的數字或進入高亮字母(如果你有高亮輸入)模式。常用形式是,輸入你想執行的操作前的數字。(你可以像1或1 – 4或2、4、7的格式來執行命令)。

如果你想進入補丁模式(在交互模式中輸入p或5),同樣也可以這樣操作:

$ git add -p    
diff --git a/dummy.rb b/dummy.rb  
index 4a00477..f856fb0 100644  
--- a/dummy.rb
+++ b/dummy.rb
@@ -1,5 +1,5 @@
 class MyFoo
   def say
-    puts "Annyong Haseyo"
+    puts "Guten Tag"
   end
 end
Stage this hunk [y,n,q,a,d,/,e,?]?

如你所見,你將在選擇添加改動的那部分文件的底部獲得一些選項。此外,使用“?”會說明這個選項。

12. 文件系統中的儲存/檢索

有些項目(比如Git自己的項目)需要直接在Git的文件系統中添加額外的並不想被檢查的文件。

讓我們開始在Git中保存隨機文件

$ echo "Foo" | git hash-object -w --stdin
51fc03a9bb365fae74fd2bf66517b30bf48020cb

比如數據庫中的對象,如果你不想讓一些對象被垃圾回收,最簡單的方式是給它加標簽:

$ git tag myfile 51fc03a9bb365fae74fd2bf66517b30bf48020cb

在這裡我們設置myfile的標簽,當我們需要檢索該文件時可以這樣:

$ git cat-file blob myfile

這對開發者可能需要的但是並不想每次都去檢查的有用文件(密碼,gpg鍵等等)很管用(特別是在生產過程中)。

Logging and What Changed? 記錄日志和什麼改變了?

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-02/112846p2.htm

Copyright © Linux教程網 All Rights Reserved