標籤:

Git常用方法小結

說明:該文檔只對有一定的git使用基礎的人有效。 關於git如何如何好,這裡就不用描述了。我將僅僅描述一些常規的用法,並在附件發一份網友翻譯的git中文文檔,以便作為你的git辭典,隨時查閱。 為了能夠更形象地介紹git的用法,我們還是拿一個典型的例子來做描述吧。 最近我在dev.lemote.com建立了自己的RT_PREEMPT for loongson的項目,這個項目是通過git來維護的。下面我將從項目的創建到目前項目已經有了多個分支這一過程進行詳細的介紹。 1、創建項目倉庫 在http://dev.lemote.com/code註冊一個帳號,並登錄申請一個項目,申請好以後你將獲得一份訪問該站的私鑰,並獲得一個項目的倉庫地址:

  • git://dev.lemote.com/rt4ls.git (git protocal, anonymous)
  • http://dev.lemote.com/http_git/rt4ls.git (http protocal, if the git protocal is blocked by firewall)
  • ssh://git@dev.lemote.com/rt4ls.git(ssh protocal, for project"s owner)
  • 這三個地址分別支持不同的協議,第一個用於普通用戶checkout,第二個用於在線瀏覽,第三個用戶項目管理員checkin。 申請好項目好,我們需要把那個私鑰保存到你的本地帳號家目錄下的.ssh/id_rsa文件中,並修改該文件的訪問許可權為只有屬主可讀寫。

    $ vim ~/.ssh/id_rsa$ chmod 600 ~/.ssh/id_rsa

    2、初始化項目倉庫 上面雖然創建了倉庫,但是倉庫裡頭還沒有內容,我們需要放一些東西上去。要放東西上去蠻簡單,我們先在本地建立一個倉庫,然後把倉庫提交上去即可。

    $ cd project //你的項目目錄$ git init && git add . && git commit -a // 初始化本地倉庫並添加項目$ git config --global user.name "Wu Zhangjin" // 初始化你的項目作者信息$ git config --global user.email "wuzhangjin@gmail.com" // 郵件$ git push ssh://git@dev.lemote.com/rt4ls.git master // 把本地倉庫提交到遠程倉庫的master分支中

    這樣就初始化了遠程倉庫了,將在遠程倉庫看到一個master分支。實際上為了方便起見,上面的最後一步操作往往是這樣。

    $ git remote add origin ssh://git@dev.lemote.com/rt4ls.git$ git push origin master

    這兩個是等價的,第一行的意思是添加一個標記,讓origin指向ssh://git@dev.lemote.com/rt4ls.git,也就是說你操作origin的時候,實際上就是在操作ssh://git@dev.lemote.com/rt4ls.git。origin在這裡完全可以理解為後者的別名。 需要說明的是,默認情況下這條語句等價於提交本地的master倉庫到遠程倉庫,並作為遠程的master分支。 如果想把本地的某個分支test提交到遠程倉庫,並作為遠程倉庫的master分支,或者作為另外一個名叫test的分支,那麼可以這麼做。

    $ git push origin test:master // 提交本地test分支作為遠程的master分支$ git push origin test:test // 提交本地test分支作為遠程的test分支

    如果想刪除遠程的分支呢?類似於上面,如果:左邊的分支為空,那麼將刪除:右邊的遠程的分支。

    $ git push origin :test // 剛提交到遠程的test將被刪除,但是本地還會保存的,不用擔心

    3、本地和遠程倉庫的交互 上面實際上已經介紹了本地和遠程的交互操作了,當然,這些交互操作還有兩個需要介紹。介紹完以後我們就介紹本地操作。 首先是clone一個遠程倉庫到本地,例如一個普通用戶想把我的git倉庫clone下來,可以這麼做。

    $ git clone git://dev.lemote.com/rt4ls.git

    如果已經clone過我的git倉庫,但是想看看我的倉庫是否已經更新,如果有更新就checkout到本地。

    $ git pull

    相應地,如果你想弄到最新的內核,那麼可以clone內核的git倉庫,Linux內核的git倉庫在這裡http://git.kernel.org,比如說我們想checkout最新的內核穩定版,先從http://git.kernel.org找到對應git倉庫的地址:git://git.kernel.org/pub/scm/ + linux/kernel/git/stable/linux-2.6.29.y.git

    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.29.y.git

    4、本地操作 實際上除了上面的本地和遠程的交互操作外,平時的工作主要是一些本地操作了。本地操作無非是一些不停的修改源代碼的工作。 如果沒有問題的話,大概的工作流程是這樣:

  • 修改代碼
  • 標記哪些代碼要進入本地倉庫
  • 把標記過的代碼提交到倉庫中,並編寫修改日誌 這個過程分別對應:
  • 用源代碼編輯器編輯源代碼,比如vim
  • git add [需要提交的文件或者目錄]
  • git commit,然後編寫修改日誌,並退出編輯器 例如,我們修改了一個三個文件file1,file2,file3,但是只想提交file2和file3,那麼可以這麼做。

    $ git add file2 file3$ git commit

    修改過程中可以通過git status查看當前狀態,通過git log查看之前的commits,通過git show顯示某次的commit,通過git diff查看當前還有哪些修改沒有提交。 需要注意地是,當你想刪除或者重命名已經在倉庫中的文件時,請使用git rm和git mv,因為它們除了基本的rm和mv操作外,還會對應地調整倉庫中的記錄。 實際上,在維護某個項目時,往往不會很順利,需要不停地更新,不停地debug,需要多個不同開發人員的協同合作,也涉及到版本之間的回退,補丁的製作和發布等。 下面介紹幾個常用的內容: a. 根據commits產生一序列補丁 例如,我們想導出歷史上的某個commit之後的所有commits為一序列的補丁序列,那麼可以這麼做。

    $ git log | grep ^commit | head -5commit a11c7fd5839ddac9a19edadc245522f606a9e067commit a718cbdc3ea9c72e05dd3beb5c58bfac91fe1a76commit b5345a1b077259958fa56cb7c4dea82694214247commit 380f57ad3157b644bb822995dcd85d73504a75d8commit 68a0c4b66d619f816ded5b83f5e8c526e43bdf3e$ git format-patch 68a0c4b66d619f816ded5b83f5e8c526e43bdf3e

    $ git am 68a0c4b66d619f816ded5b83f5e8c526e43bdf3e //應用Patch

    b. checkout出某個commit並據此創建一個分支

    $ git checkout -b test 68a0c4b66d619f816ded5b83f5e8c526e43bdf3e$ git checkout master // 要刪除某個分支,先checkout到另外一個分支,然後刪除那個分支$ git branch -d test

    c. 從本地機器的其他目錄下pull某個分支例如,我有兩個不同的git倉庫,分別放在兩個不同的目錄下,一個叫linux-mips,一個叫rt4ls,如果我的rt4ls的master想跟 linux-mips的master分支同步,並且我的linux-mips分支已經跟遠程的分支同步了,那我就沒有必要從遠程同步,而是直接從本地的 linux-mips同步,這個怎麼做呢?

    $ cd rt4ls$ git checkout master$ git pull /path/to/linux-mips master

    d. 應用另外一個分支的交付(commit)到當前分支如果你的git倉庫裡頭維護了很多分支,你對其中某個分支進行了某個更新,但是這個更新也最好是應用到其他分支上,那怎麼辦呢?一個分支改一次?沒這麼麻煩,我們有git cherry-pick,這個工具可以幫助我們應用某個指定的commit到當前分支。例如:

    $ git cherry-pick 0f0b60cff094dfdb313e6a3d197e7907a7626f42

    0f0b60cff094dfdb313e6a3d197e7907a7626f42是我在另外一個分支裡頭剛追加的一個交付。 e. tag的用法 tag實際上就是一個標籤,如果你發現維護到該項目的某個commit時,這個commit可以當作一個非常重要的「里程碑」,比如這裡開始引入了一個非常重要的功能,那麼你就可以對當前這個commit創建一個tag,這樣當你繼續更新你的項目以後,你就可以非常容易的通過這個tag找到當時實現的這個功能。 例如,你想對當前的commmit創建一個名叫test的tag,那麼可以這麼做。

    $ git tag test HEAD

    刪除這個tag可以這麼做。

    $ git tag -d test

    如果想把這個tag提交到遠程,可以用git push --tags,如果想刪除遠程tag呢?可以類似刪除遠程分支以後,在冒號(:)右邊加上tag名,左邊保持為空! f. 如果發現某個中間的commit出現了問題,該如何測試它呢 如果你發現一個歷史的commit有問題,並且後續的commit並不需要,所以可以直接回溯到那個commit,進行測試,這個貌似可以通過git bisect來實現,或者是簡單的checkout出某個歷史來測試。 但是,如果你就懷疑某個歷史的commit有問題,但是後面的所有commit你也需要,那麼可以這麼做: 先用git diff或者是format-patch把這個commit弄出一個補丁出來,然後用patch -R把這個補丁臨時撤銷(如果你不commit的話)。這樣就可以方便的測試某個中間的commit是否有問題了!

  • GIT命令

    主題一 基本使用

    1:下載git clone ***

    2:本地與伺服器端同步git pull

    3:本地的狀態查詢git status

    4:本地修改同步至伺服器端git commit -a -m 「log_message」 (-a是提交所有改動,-m是加入log信息)

    5:本地修改上傳至伺服器端git push主題二 分支

    1:git branch查看所有分支

    2:git branch branch_0.1 master從主分支master創建branch_0.1分支

    3:git branch -m branch_0.1 branch_1.0將branch_0.1重命名為branch_1.0

    4:git checkout branch_1.0/master切換到branch_1.0/master分支

    小竅門: 3與4的一步實現方式為:git checkout -b branch_1.0 master

    5:git rebase branch_1.0(前提假設已git checkout master)在branch_1.0與master分叉處後master的變更append至branch_1.0(較難理解)

    6:git branch -d branch_1.0刪除branch_1.0

    主題三 更補

    1:git commit -C HEAD –amend使用最近commit增補提交,不產生新的commit log

    2:git reset –hard HEAD~1將版本庫回復到HEAD之前的版本


    推薦閱讀:

    12種【家居招財風水】絕密方法,讓你財源滾滾來
    五香咸雞蛋的腌制方法與營養價值
    注意!這七種情況醫保是不管的!(附詳細使用方法)
    衛生間設計 | 小空間大設計, 29種衛浴間收納方法
    靈性財富/21種喚醒財富的方法

    TAG:方法 |