(大資料工程師學習路徑)第三步 Git Community Book----中級技能(下)

來源:互聯網
上載者:User

標籤:

一、追蹤分支1.追蹤分支

在Git中‘追蹤分支’是用於聯絡本地分支和遠程分支的. 如果你在’追蹤分支‘(Tracking Branches)上執行推送(push)或拉取(pull)時,它會自動推送(push)或拉取(pull)到關聯的遠程分支上. 如果你經常要從遠程倉庫裡拉取(pull)分支到本地,並且不想很麻煩的使用"git pull "這種格式; 那麼就應當使用‘追蹤分支‘(Tracking Branches). git clone‘命令會自動在本地建立一個‘master‘分支,它是‘origin/master‘的‘追蹤分支’. 而‘origin/master‘就是被複製(clone)倉庫的‘master‘分支. 你可以在使用‘git branch‘命令時加上‘--track‘參數, 來手動建立一個‘追蹤分支‘.

$ git branch --track experimental origin/experimental

當你運行下命令時:

$ git pull experimental

它會自動從‘origin‘抓取(fetch)內容,再把遠端‘origin/experimental‘分支合并進(merge)本地的‘experimental‘分支. 當要把修改推送(push)到origin時, 它會將你本地的‘experimental‘分支中的修改推送到origin的‘experimental‘分支裡, 而無需指定它(origin).

三、使用Git Grep進行搜尋1.使用Git Grep進行搜尋

用git grep 命令尋找Git庫裡面的某段文字是很方便的. 當然, 你也可以用unix下的‘grep‘命令進行搜尋, 但是‘git grep‘命令能讓你不用簽出(checkout)曆史檔案, 就能尋找它們. 例如, 你要看 git.git這個倉庫裡每個使用‘xmmap‘函數的地方, 你可以運行下面的命令:

$ git grep xmmap

如果你要顯示行號, 你可以添加‘-n‘選項:

$ git grep -n xmmap

如果我們想只顯示檔案名稱, 我們可以使用‘--name-onley‘選項:

$ git grep --name-only xmmap

我們用‘-c‘選項可以查看每個檔案裡有多少行匹配內容(line matches):

$ git grep -c xmmap

現在, 如果我們要尋找git倉庫裡某個特定版本裡的內容, 我們可以像下面一樣在命令列末尾加上標籤名(tag reference):

$ git grep xmmap v1.5.0

我們也可以組合一些搜尋條件, 下面的命令就是尋找我們在倉庫的哪個地方定義了‘SORT_DIRENT‘.

$ git grep -e ‘#define‘ --and -e SORT_DIRENT

我不但可以進行“與"(both)條件搜尋操作,也可以進行"或"(either)條件搜尋操作.

$ git grep --all-match -e ‘#define‘ -e SORT_DIRENT

我們也可以尋找出符合一個條件(term)且符合兩個條件(terms)之一的檔案行.例如我們要找出名字中含有‘PATH‘或是‘MAX‘的常量定義:

$ git grep -e ‘#define‘ --and \( -e PATH -e MAX \)
四、Git的撤銷操作 - 重設, 簽出 和 撤銷1.修複未提交檔案中的錯誤(重設)

如果你現在的工作目錄(work tree)裡搞的一團亂麻, 但是你現在還沒有把它們提交; 你可以通過下面的命令, 讓工作目錄回到上次提交時的狀態(last committed state):

$ git reset --hard HEAD

這條命令會把你工作目錄中所有未提交的內容清空(當然這不包括未置於版控制下的檔案 untracked files). 從另一種角度來說, 這會讓"git diff" 和"git diff --cached"命令的顯示法都變為空白. 如果你只是要恢複一個檔案,如"hello.rb", 你就要使用 git checkout

$ git checkout -- hello.rb

這條命令把hello.rb從HEAD中籤出並且把它恢複成未修改時的樣子.

2.修複已提交檔案中的錯誤

如果你已經做了一個提交(commit),但是你馬上後悔了, 這裡有兩種截然不同的方法去處理這個問題: 建立一個新的提交(commit), 在新的提交裡撤消老的提交所作的修改. 這種作法在你已經把代碼發布的情況下十分正確. 你也可以去修改你的老提交(old commit). 但是如果你已經把代碼發布了,那麼千萬別這麼做; git不會處理項目的曆史會改變的情況,如果一個分支的曆史被改變了那以後就不能正常的合并. 建立新提交來修複錯誤 建立一個新的,撤銷(revert)了前期修改的提交(commit)是很容易的; 只要把出錯的提交(commit)的名字(reference)做為參數傳給命令: git revert就可以了; 下面這條命令就示範了如何撤消最近的一個提交:

$ git revert HEAD

這樣就建立了一個撤消了上次提交(HEAD)的新提交, 你就有機會來修改新提交(new commit)裡的提交注釋資訊. 你也可撤消更早期的修改, 下面這條命令就是撤銷“上上次”(next-to-last)的提交:

$ git revert HEAD^

在這種情況下,git嘗試去撤銷老的提交,然後留下完整的老提交前的版本. 如果你最近的修改和要撤銷的修改有重疊(overlap),那麼就會被要求手工解決衝突(conflicts), 就像解決合并(merge)時出現的衝突一樣. 譯者注: git revert 其實不會直接建立一個提交(commit), 把撤銷後的檔案內容放到索引(index)裡,你需要再執行git commit命令,它們才會成為真正的提交(commit). 修改提交來修複錯誤 如果你剛剛做了某個提交(commit), 但是你又想馬上修改這個提交; git commit 現在支援一個叫--amend的參數,它能讓你修改剛才的這個提交(HEAD commit). 這項機制能讓你在代碼發布前,添加一些新的檔案或是修改你的提交注釋(commit message). 如果你在老提交(older commit)裡發現一個錯誤, 但是現在還沒有發布到代碼伺服器上. 你可以使用 git rebase命令的互動模式, "git rebase -i"會提示你在編輯中做相關的修改. 這樣其實就是讓你在rebase的過程來修改提交.

五、維護Git1.保證良好的效能

在大的倉庫中, git靠壓縮曆史資訊來節約磁碟和記憶體空間. 壓縮操作並不是自動進行的, 你需要手動執行 git gc:

$ git gc

壓縮操作比較耗時, 你運行git gc命令最好是在你沒有其它工作的時候.

2.保持可靠性

git fsck 運行一些倉庫的一致性檢查, 如果有任何問題就會報告. 這項操作也有點耗時, 通常報的警告就是“懸Null 物件"(dangling objects).

$ git fsck

“懸Null 物件"(dangling objects)並不是問題, 最壞的情況只是它們多佔了一些磁碟空間. 有時候它們是找回丟失的工作的最後一絲希望.

六、建立一個公用倉庫1.建立一個公用倉庫

假設你個人的倉庫在目錄 ~/proj. 我們先複製一個新的“裸倉庫“,並且建立一個標誌檔案告訴git-daemon這是個公用倉庫.

$ git clone --bare ~/proj proj.git$ touch proj.git/git-daemon-export-ok

上面的命令建立了一個proj.git目錄, 這個目錄裡有一個“裸git倉庫" -- 即只有‘.git‘目錄裡的內容,沒有任何簽出(checked out)的檔案. 下一步就是你把這個 proj.git 目錄拷到你打算用來託管公用倉庫的主機上. 你可以用scp, rsync或其它任何方式.

2.通過git協議匯出git倉庫

用git協議匯出git倉庫, 這是推薦的方法. 如果這台伺服器上有管理員,TA們要告訴你把倉庫放在哪一個目錄中, 並且“git:// URL”除倉庫目錄部分外是什麼. 你現在要做的是啟動 git daemon; 它會監聽在 9418連接埠. 預設情況下它會允許你訪問所有的git目錄(看目錄中是否有git-daemon-export-ok檔案). 如果以某些目錄做為 git-daemon 的參數, 那麼 git-daemon 會限制使用者通過git協議只能訪問這些目錄. 你可以在inetd service模式下運行 git-daemon; 點擊 git daemon 可以查看協助資訊.

3.通過http協議匯出git倉庫

git協議有不錯的效能和可靠性, 但是如果主機上已經配好了一台web伺服器,使用http協議(git over http)可能會更容易配置一些. 你需要把建立的"裸倉庫"放到Web伺服器的可訪問目錄裡, 同時做一些調整,以便讓web用戶端獲得它們所需的額外資訊.

$ mv proj.git /home/you/public_html/proj.git$ cd proj.git$ git --bare update-server-info$ chmod a+x hooks/post-update

$ git clone http://yourserver.com/~you/proj.git

$ git clone http://yourserver.com/~you/proj.git
七、建立一個私人倉庫1.通過SSH協議來訪問倉庫 

通常最簡單的辦法是通ssh協議訪問Git(Git Over SSH). 如果你在一台機器上有了一個ssh帳號, 你只要把“git祼倉庫"放到任何一個可以通過ssh訪問的目錄, 然後可以像ssh登入一樣簡單的使用它. 假設你現在有一個倉庫,並且你要把它建成可以在網上可訪問的私人倉庫. 你可以用下面的命令, 匯出一個"祼倉庫", 然後用scp命令把它們拷到你的伺服器上:

$ git clone --bare /home/user/myrepo/.git /tmp/myrepo.git$ scp -r /tmp/myrepo.git myserver.com:/opt/git/myrepo.git

如果其它人也在 myserver.com 這台伺服器上有ssh帳號,那麼TA也可以從這台伺服器上複製(clone)代碼:

$ git clone myserver.com:/opt/git/myrepo.git

上面的命令會提示你輸入ssh密碼或是使用公開金鑰(public key).

八、小結

本節講了追蹤分支,使用Git Grep進行搜尋,Git的撤消操作(git reset、git checkout、git revert),維護Git(git gc、git fsck)以及建立公有和私人倉庫。

九、練習

請自己建一個公有倉庫讓小夥伴可以訪問。

(大資料工程師學習路徑)第三步 Git Community Book----中級技能(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.