久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      詳細(xì)介紹的git使用

      詳細(xì)介紹的git使用

      1、Git概念

      1.1. Git庫(kù)中由三部

      Git 倉(cāng)庫(kù)就是那個(gè).git 目錄,其中存放的是我們所提交的文檔索引內(nèi)容,Git 可基于文檔索引內(nèi)容對(duì)其所管理的文檔進(jìn)行內(nèi)容追蹤,從而實(shí)現(xiàn)文檔的版本控制。.git目錄位于工作目

      1) 工作目錄:用戶本地的

      2) Index(索引):將工作目錄下所有文件(包含子目錄)生成快照,存放到一個(gè)臨時(shí)的存儲(chǔ)區(qū)域,Git 稱該區(qū)域?yàn)?/p>

      3) 倉(cāng)庫(kù):將索引通過(guò)commit命令提交至倉(cāng)庫(kù)中,每一次提交都意味著版本在進(jìn)行一次

      推薦(免費(fèi)):git

      1.2. 使用Git時(shí)的

      1.2.1. Git初始

      1) 配置使用git倉(cāng)庫(kù)的人

      git config –global user.name "Your Name Comes He

      2) 配置使用git倉(cāng)庫(kù)的人員em

      git config –global user.email you@yourdomain.example.

      1.2.2. Git文檔忽

      工作目錄中有一些文件是不希望接受Git 管理的,譬如程序編譯時(shí)生成的中間文件等等。Git 提供了文檔忽略機(jī)制,可以將工作目錄中不希望接受Git 管理的文檔信息寫到同一目錄下的.gitignore 文

      例如:工作目錄下有個(gè)zh目錄,如果不想把它加入到Git管理中,則

      echo “zh” &gt; .gitign

      git ad

      有關(guān)gitignore 文件的諸多細(xì)節(jié)知識(shí)可閱讀其使用手冊(cè):man gitign

      1.3. Git與Repo

      Git操作一般對(duì)應(yīng)一個(gè)倉(cāng)庫(kù),而Repo操作一般對(duì)應(yīng)一個(gè)項(xiàng)目,即一個(gè)項(xiàng)目會(huì)由若干倉(cāng)庫(kù)

      例如,在操作整個(gè)Recket項(xiàng)目時(shí)使用Repo,而操作其中的某個(gè)倉(cāng)庫(kù)時(shí)使用Git。在包含隱藏目錄.git的目錄下執(zhí)行g(shù)it

      2. Gi

      Git help 獲取git基

      (如果要知道某個(gè)特定命令的使用方法,例如:使用Git help clone,來(lái)獲取git clone的使用

      3. Git本地

      3.1. Git i

      或者使用git init-

      創(chuàng)建一個(gè)空的Git庫(kù)。在當(dāng)前目錄中產(chǎn)生一個(gè).git 的子目錄。以后,所有的文件變化信息都會(huì)保存到這個(gè)目錄下,而不像CVS那樣,會(huì)在每個(gè)目錄和子目錄下都創(chuàng)建一個(gè)CVS

      在.git目錄下有一個(gè)config文件,可以修改其中的配置

      3.2. Git

      將當(dāng)前工作目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的

      可以遞歸添加,即如果后面跟的是一個(gè)目錄作為參數(shù),則會(huì)遞歸添加整個(gè)目錄中的所有子目錄和文件。

      git add dir1 ( 添加dir1這個(gè)目錄,目錄下的所有文件都被加

      Git add f1 f2 ( 添加f1,f2

      git add . ( 添加當(dāng)前目錄下的所有文件和子目

      3.3. Git

      從當(dāng)前的工作目錄中和索引中刪除

      可以遞歸刪除,即如果后面跟的是一個(gè)目錄做為參數(shù),則會(huì)遞歸刪除整個(gè)目錄中的所有子目錄和文件。

      git rm –r * (進(jìn)入某個(gè)目錄中,執(zhí)行此語(yǔ)句,會(huì)刪除該目錄下的所有文件和子

      git rm f1 (刪除文件f1,包含本地目錄和index中的此文件

      git rm –ached f1 (刪除文件f1,不會(huì)刪除本地目錄文件,只刪除index中的文件記錄;將已經(jīng)git add的文件remove到cache中,這樣commit的時(shí)候不會(huì)提交這個(gè)文件, 適用于一下子添加了很多文件, 卻又想排除其中個(gè)別幾個(gè)文件的情

      3.4. Git com

      提交當(dāng)前工作目錄的修改

      直接調(diào)用git commit命令,會(huì)提示填寫注釋。通過(guò)如下方式在命令行就填寫提交注釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注釋必須不能為空,否則就會(huì)提交

      git commit還有一個(gè) -a的參數(shù),可以將那些沒(méi)有通過(guò)git add標(biāo)識(shí)的變化一并強(qiáng)行提交,但是不建議使用這種

      每一次提交,git就會(huì)為全局代碼建立一個(gè)唯一的commit標(biāo)識(shí)代碼,用戶可以通過(guò)git reset命令恢復(fù)到任意一次提交時(shí)的

      git commit –-amend –m “message” (在一個(gè)commit id上不斷修改提交的

      3.5. Git sta

      查看版本庫(kù)的狀態(tài)。可以得知哪些文件發(fā)生了變化,哪些文件還沒(méi)有添加到git庫(kù)中等等。 建議每次commit前都要通過(guò)該命令確認(rèn)庫(kù)

      最常見(jiàn)的誤操作是, 修改了一個(gè)文件, 沒(méi)有調(diào)用git add通知git庫(kù)該文件已經(jīng)發(fā)生了變化就直接調(diào)用commit操作, 從而導(dǎo)致該文件并沒(méi)有真正的提交。這時(shí)如果開(kāi)發(fā)者以為已經(jīng)提交了該文件,就繼續(xù)修改甚至刪除這個(gè)文件,那么修改的內(nèi)容就沒(méi)有通過(guò)版本管理起來(lái)。如果每次在 提交前,使用git status查看一下,就可以發(fā)現(xiàn)這種錯(cuò)誤。因此,如果調(diào)用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發(fā)生了變化,但是卻沒(méi)有通過(guò)git add標(biāo)識(shí)的

      3.6. Git

      查看歷史日志,包含每次的版本變化。每次版本變化對(duì)應(yīng)一個(gè)commit

      Git log

      -1的意思是只顯示一個(gè)commit,如果想顯示5個(gè),就-5。不指定的話,git log會(huì)從該commit一直往后

      Git log –stat –summary (顯示每次版本的詳細(xì)

      在項(xiàng)目日志信息中,每條日志的首行(就是那一串字符)為版本更新提交所進(jìn)行的命名,我們可以將該命名理解為項(xiàng)目版本號(hào)。項(xiàng)目版本號(hào)應(yīng)該是唯一的,默認(rèn)由 Git 自動(dòng)生成,用以標(biāo)示項(xiàng)目的某一次更新。如果我們將項(xiàng)目版本號(hào)用作git-show 命令的參數(shù),即可查看該次項(xiàng)目版本的更新細(xì)節(jié)。

      1) Git

      2)Git

      實(shí)際上,上述命令并非是真正的進(jìn)行版本號(hào)自定義,只是制造了一個(gè)tag對(duì)象而已,這在進(jìn)行項(xiàng)目版本對(duì)外發(fā)布時(shí)

      3.7. Git me

      把服務(wù)器上下載下來(lái)的代碼和本地代碼合并?;蛘哌M(jìn)行分支

      例如:當(dāng)前在master分支上,若想將分支dev上的合并到master上,則git merge

      注意:git merge nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支合并到本地分

      git rebase nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支映射到本地的一個(gè)臨時(shí)分支上,然后將本地分支上的變化合并到這個(gè)臨時(shí)分支,然后再用這個(gè)臨時(shí)分支初始化本地

      3.8. Git d

      把本地的代碼和index中的代碼進(jìn)行比較,或者是把index中的代碼和本地倉(cāng)庫(kù)中的代碼進(jìn)行

      1) Git d

      比較工作目錄和Index中的

      2) Git diff – – cac

      比較index和本地倉(cāng)庫(kù)中的

      3.9. Git check

      3.9.1. 切換

      1) 創(chuàng)建一個(gè)新分支,并切換到該

      Git checkout –b 新

      2)切換到某個(gè)已經(jīng)建立的本地分支local_bra

      Git checkout local_bra

      (使用cat .git/HEAD后,顯示refs:refs/heads/ local_bran

      3) 切換到服務(wù)器上的某個(gè)分支remote_bra

      Git checkout remote_bra

      (遠(yuǎn)程分支remote_branch可以通過(guò) git branch –r

      4) 切換到某個(gè)commit

      Git checkout commit

      (使用cat .git/HEAD后,顯示commit_

      5) 切換到某個(gè)

      Git checkout

      (使cat .git/HEAD后,顯示t

      注意: 除了1)和2)外,其余三種都只是切換到了一個(gè)臨時(shí)的( no branch )狀態(tài) (this head is detached),這時(shí)用 git branch 可以看到處于(no branch)上, cat .git/HEAD 看到指向相應(yīng)的commit id。 這個(gè)(no branch)只是臨時(shí)存在的,并不是一個(gè)真正建立的branch。 如果此時(shí)執(zhí)行2),則這個(gè)(no branch)就自動(dòng)消失了;如果執(zhí)行1), 則創(chuàng)建新分支 new branch,并把這個(gè)(no branch)掛到這個(gè)新分支上,此時(shí)cat .git/refs/heads/new_branch 可以看到已經(jīng)指向了剛才那個(gè)commit

      3.9.2. 用已有分支初始化

      執(zhí)行下面的命令,在切換到某個(gè)已經(jīng)建立的local branch或者某個(gè)remote branch或者某個(gè)commit id 或者某個(gè)tag的同時(shí),創(chuàng)建新分支new_branch,并且掛到這個(gè)新分

      1) 切換到某個(gè)已經(jīng)建立的本地分支local_branch,并且使用此分支初始化一個(gè)新分支new_bran

      git checkout –b new_branch local_bra

      2) 切換到某個(gè)遠(yuǎn)程分支remote_branch,并且用此分支初始化一個(gè)新分支new_bran

      Git checkout –b new_branch remote_bra

      3) 切換到某個(gè)commit id,并建立新分支new_bra

      Git checkout –b new_branch commit

      4) 切換到某個(gè)tag,并建立新分支new_bra

      Git checkout –b new_branch

      3.9.3. 還

      例如 “git checkout app/model/user.rb” 就會(huì)將user.rb文件從上一個(gè)已提交的版本中更新回來(lái),未提交的工作目錄中的內(nèi)容全部會(huì)被

      3.10. Git-ls

      查看當(dāng)前的git庫(kù)中有那些

      3.11. Git

      重命名一個(gè)文件、目錄或者

      例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1

      3.12. Git bra

      3.12.1.

      在 git 版本庫(kù)中創(chuàng)建分支的成本幾乎為零,所以,不必吝嗇多創(chuàng)建幾個(gè)分支。當(dāng)?shù)谝淮螆?zhí)行g(shù)it init時(shí),系統(tǒng)就會(huì)創(chuàng)建一個(gè)名為“master”的分支。 而其它分支則通過(guò)手工

      下面列舉一些常見(jiàn)的分支

      創(chuàng)建一個(gè)屬于自己的個(gè)人工作分支,以避免對(duì)主分支 master 造成太多的干擾,也方便與他人交流

      當(dāng)進(jìn)行高風(fēng)險(xiǎn)的工作時(shí),創(chuàng)建一個(gè)試驗(yàn)性的

      合并別人的工作的時(shí)候,最好是創(chuàng)建一個(gè)臨時(shí)的分支用來(lái)合并,合并完成后再“fetch”到自己的

      對(duì)分支進(jìn)行增、刪、查等

      注意:分支信息一般在.git/refs/目錄下,其中heads目錄下為本地分支,remotes為對(duì)應(yīng)服務(wù)器上的分支,tags為

      3.12.2. 查

      git branch 列出本地git庫(kù)中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當(dāng)前

      git branch –r 列出服務(wù)器git庫(kù)的所有

      (可以繼續(xù)使用命令 “ git checkout -b 本地分支名 服務(wù)器分支名”來(lái)獲取服務(wù)器上某個(gè)分支的代碼文

      3.12.3. 查看當(dāng)前在哪個(gè)

      cat .git/H

      3.12.4. 創(chuàng)建一

      1) git branch

      雖然創(chuàng)建了分支,但是不會(huì)將當(dāng)前工作分支切換到新創(chuàng)建的分支上,因此,還需要命令“git checkout 分支名” 來(lái)

      2) git checout –b

      不但創(chuàng)建了分支,還將當(dāng)前工作分支切換到了該分

      3.12.5. 切換到某個(gè)分支:git checkout

      切換到主分支:git checkout mas

      3.12.6. 刪

      git branch –D

      注意: 刪除后,發(fā)生在該分支的所有變化都無(wú)法恢復(fù)。強(qiáng)制刪除此

      3.12.7. 比較兩個(gè)分支上的文件

      git diff master 分支名 (比較主分支和另一個(gè)分支的

      3.12.8. 查看分

      git-show-branch (查看當(dāng)前分支的提交注釋及

      git-show-branch -all(查看所有分支的提交注釋及信息)

      * [dev]

      ! [master]

      * [dev]

      * [dev^]

      * [dev~2]

      *+ [master]

      在上述例子中, “–”之上的兩行表示有兩個(gè)分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “–”之下的幾行表示了分支演化的歷史,其中 dev表示發(fā)生在dev分支上的最后一次提交,dev^表示發(fā)生在dev分支上的倒數(shù)第二次提交。dev~2表示發(fā)生在dev分支上的倒數(shù)第三次

      3.12.9. 查看當(dāng)前分支的操

      git whatchan

      3.12.10. 合

      git merge “注釋” 合并的目標(biāo)分支 合并的來(lái)

      如果合并有沖突,git會(huì)有

      例如:git checkout master (切換到master

      git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master de

      git pull 合并的目標(biāo)分支 合并的來(lái)

      例如: git checkout master (切換到master

      git pull . dev~2(合并當(dāng)前分支和dev~2

      3.13. Git reb

      一般在將服務(wù)器最新內(nèi)容合并到本地時(shí)使用,例如:在版本C時(shí)從服務(wù)器上獲取內(nèi)容到本地,修改了本地內(nèi)容,此時(shí)想把本地修改的內(nèi)容提交到服務(wù)器上;但發(fā)現(xiàn)服務(wù)器上的版本已經(jīng)變?yōu)镚了,此時(shí)就需要先執(zhí)行Git rebase,將服務(wù)器上的最新版本合并到本地。

      用下面兩幅圖解釋會(huì)比較清楚一些,rebase命令執(zhí)行后,實(shí)際上是將分支點(diǎn)從C移到了G,這樣分支也就具有了從C到G的

      3.14. Git

      庫(kù)的逆轉(zhuǎn)與恢復(fù)除了用來(lái)進(jìn)行一些廢棄的研發(fā)代碼的重置外,還有一個(gè)重要的作用。比如我們從遠(yuǎn)程clone了一個(gè)代碼庫(kù),在本地開(kāi)發(fā)后,準(zhǔn)備提交回遠(yuǎn)程。但是本地代碼庫(kù)在開(kāi)發(fā)時(shí),有功能性的commit,也有出于備份目的的commit等等??傊琧ommit的日志中有大量無(wú)用log,我們并不想把這些 log在提交回遠(yuǎn)程時(shí)也提交到庫(kù)中。 因此,就要用到git res

      git reset的概念比較復(fù)雜。它的命令形式:git reset [–mixed | –soft | –hard] [<commit-is

      命令的

      –mixed 這個(gè)是默認(rèn)的選項(xiàng)。如git reset [–mixed] dev^(dev^的定義可以參見(jiàn)2.6.5)。它的作用僅是重置分支狀態(tài)到dev1^, 但是卻不改變?nèi)魏喂ぷ魑募膬?nèi)容。即,從dev1^到dev1的所有文件變化都保留了,但是dev1^到dev1之間的所有commit日志都被清除了, 而且,發(fā)生變化的文件內(nèi)容也沒(méi)有通過(guò)git add標(biāo)識(shí),如果您要重新commit,還需要對(duì)變化的文件做一次git add。 這樣,commit后,就得到了一份非常干凈的提交記錄。 (回退了index和倉(cāng)庫(kù)中的

      –soft相當(dāng)于做了git reset –mixed,后,又對(duì)變化的文件做了git add。如果用了該選項(xiàng), 就可以直接commit了。(回退了倉(cāng)庫(kù)中的

      –hard這個(gè)命令就會(huì)導(dǎo)致所有信息的回退, 包括文件內(nèi)容。 一般只有在重置廢棄代碼時(shí),才用它。 執(zhí)行后,文件內(nèi)容也無(wú)法恢復(fù)回來(lái)了。(回退了工作目錄、index和倉(cāng)庫(kù)中的

      切換到使用的分

      git reset HEAD^ 回退第一

      git reset HEAD~2 回退第二

      如果想把工作目錄下的文件也回退,則使用git reset – – hard HEAD^ 回退第一

      git reset – – hard HEAD~2 回退第二

      還可以使用如下

      將當(dāng)前的工作目錄完全回滾到指定的版本號(hào),假設(shè)如下圖,我們有A-G五次提交的版本,其中C的版本號(hào)是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執(zhí)行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結(jié)果就只剩下了A-C三個(gè)提交

      3.15. Git r

      還原某次對(duì)版本的修改,例如:git revert commit_id (其中commit_id為commit代碼時(shí)生成的一個(gè)唯一表示的字

      例如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執(zhí)行此操作,則還原上一次commit的

      3.16. Git con

      利用這個(gè)命令可以新增、更改Git的各種設(shè)置,例如 “git config branch.master.remote origin” 就將master的遠(yuǎn)程版本庫(kù)設(shè)置為別名叫做origin版

      3.17. Git s

      顯示對(duì)象的不同

      3.18. Git

      創(chuàng)建、列出、刪除或者驗(yàn)證一個(gè)標(biāo)簽對(duì)象(使用GPG簽名

      可以將某個(gè)具體的版本打上一個(gè)標(biāo)簽,這樣就不需要記憶復(fù)雜的版本號(hào)哈希值字符串了,例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來(lái)標(biāo)記這個(gè)被你還原的版本,那么以后你想查看該版本時(shí),就可以使用 revert_version標(biāo)簽名,而不是哈希

      4. Git服務(wù)器操作命令(與

      4.1. Git cl

      取出服務(wù)器的倉(cāng)庫(kù)的代碼到本地建立的目錄中(與服務(wù)器

      通過(guò)git clone獲取遠(yuǎn)端git庫(kù)后,.git/config中的開(kāi)發(fā)者信息不會(huì)被一起clone過(guò)來(lái)。仍然需要為本地庫(kù)的.git/config文件添加開(kāi)發(fā)者信息。此外,開(kāi)發(fā)者還需要自己添加 . gitignore

      通過(guò)git clone獲取的遠(yuǎn)端git庫(kù),只包含了遠(yuǎn)端git庫(kù)的當(dāng)前工作分支。如果想獲取其它分支信息,需要使用 “git branch –r” 來(lái)查看, 如果需要將遠(yuǎn)程的其它分支代碼也獲取過(guò)來(lái),可以使用命令 “ git checkout -b 本地分支名 遠(yuǎn)程分支名”,其中,遠(yuǎn)程分支名為 “git branch –r” 所列出的分支名, 一般是諸如“origin/分支名”的樣子。如果本地分支名已經(jīng)存在, 則不需要“-b”

      4.2. Git

      從服務(wù)器的倉(cāng)庫(kù)中獲取代碼,和本地代碼合并。(與服務(wù)器交互,從服務(wù)器上下載最新代碼,等同于: Git fetch + Git mer

      從其它的版本庫(kù)(既可以是遠(yuǎn)程的也可以是本地的)將代碼更新到本地,例如:“git pull origin master ”就是將origin這個(gè)版本庫(kù)的代碼更新到本地的master主

      git pull可以從任意一個(gè)git庫(kù)獲取某個(gè)分支的內(nèi)容。用法

      git pull username@ipaddr:遠(yuǎn)端repository名遠(yuǎn)端分支名 本地分支名。這條命令將從遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名獲取到本地git庫(kù)的一個(gè)本地分支中。其中,如果不寫本地分支名,則默認(rèn)pull到本地當(dāng)前

      需要注意的是,git pull也可以用來(lái)合并分支。 和git merge的作用相同。 因此,如果你的本地分支已經(jīng)有內(nèi)容,則git pull會(huì)合并這些文件,如果有沖突會(huì)

      4

      將本地commit的代碼更新到遠(yuǎn)程版本庫(kù)中,例如 “git push origin”就會(huì)將本地的代碼更新到名為orgin的遠(yuǎn)程版本

      git push和git pull正好想反,是將本地某個(gè)分支的內(nèi)容提交到遠(yuǎn)端某個(gè)分支上。用法: git pushusername@ipaddr:遠(yuǎn)端repository名本地分支名 遠(yuǎn)端分支名。這條命令將本地git庫(kù)的一個(gè)本地分支push到遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支

      需要格外注意的是,git push好像不會(huì)自動(dòng)合并文件。因此,如果git push時(shí),發(fā)生了沖突,就會(huì)被后push的文件內(nèi)容強(qiáng)行覆蓋,而且沒(méi)有什么提示。 這在合作開(kāi)發(fā)時(shí)是很危險(xiǎn)的

      4.4. Git

      從服務(wù)器的倉(cāng)庫(kù)中下載代碼。(與服務(wù)器交互,從服務(wù)器上下載最新

      相當(dāng)于從遠(yuǎn)程獲取最新版本到本地,不會(huì)自動(dòng)merge,比Git pull更安

      使用此方法來(lái)獲取服務(wù)器上的

      例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為服務(wù)器上的分支名),則是獲取上次使用git fetch命令時(shí)從服務(wù)器上下載的代碼;如果先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務(wù)器上獲取最新的更新信息,然后從服務(wù)器上下載最新的代碼。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成Git

      1.1. Git庫(kù)中由三部分組

      Git 倉(cāng)庫(kù)就是那個(gè).git 目錄,其中存放的是我們所提交的文檔索引內(nèi)容,Git 可基于文檔索引內(nèi)容對(duì)其所管理的文檔進(jìn)行內(nèi)容追蹤,從而實(shí)現(xiàn)文檔的版本控制。.git目錄位于工作目錄內(nèi)

      1) 工作目錄:用戶本地的目錄

      2) Index(索引):將工作目錄下所有文件(包含子目錄)生成快照,存放到一個(gè)臨時(shí)的存儲(chǔ)區(qū)域,Git 稱該區(qū)域?yàn)樗饕?/p>

      3) 倉(cāng)庫(kù):將索引通過(guò)commit命令提交至倉(cāng)庫(kù)中,每一次提交都意味著版本在進(jìn)行一次更新

      1.2. 使用Git時(shí)的初始化事

      1.2.1. Git初始化配

      1) 配置使用git倉(cāng)庫(kù)的人員姓

      git config –global user.name "Your Name Comes Here

      2) 配置使用git倉(cāng)庫(kù)的人員emai

      git config –global user.email you@yourdomain.example.co

      1.2.2. Git文檔忽略機(jī)

      工作目錄中有一些文件是不希望接受Git 管理的,譬如程序編譯時(shí)生成的中間文件等等。Git 提供了文檔忽略機(jī)制,可以將工作目錄中不希望接受Git 管理的文檔信息寫到同一目錄下的.gitignore 文件中

      例如:工作目錄下有個(gè)zh目錄,如果不想把它加入到Git管理中,則執(zhí)行

      echo “zh” &gt; .gitignor

      git add

      有關(guān)gitignore 文件的諸多細(xì)節(jié)知識(shí)可閱讀其使用手冊(cè):man gitignor

      1.3. Git與Repo的比

      Git操作一般對(duì)應(yīng)一個(gè)倉(cāng)庫(kù),而Repo操作一般對(duì)應(yīng)一個(gè)項(xiàng)目,即一個(gè)項(xiàng)目會(huì)由若干倉(cāng)庫(kù)組成

      例如,在操作整個(gè)Recket項(xiàng)目時(shí)使用Repo,而操作其中的某個(gè)倉(cāng)庫(kù)時(shí)使用Git。在包含隱藏目錄.git的目錄下執(zhí)行g(shù)it操作

      2. Git he

      Git help 獲取git基本命

      (如果要知道某個(gè)特定命令的使用方法,例如:使用Git help clone,來(lái)獲取git clone的使用方法

      3. Git本地操作基本

      3.1. Git ini

      或者使用git init-db

      創(chuàng)建一個(gè)空的Git庫(kù)。在當(dāng)前目錄中產(chǎn)生一個(gè).git 的子目錄。以后,所有的文件變化信息都會(huì)保存到這個(gè)目錄下,而不像CVS那樣,會(huì)在每個(gè)目錄和子目錄下都創(chuàng)建一個(gè)CVS目錄

      在.git目錄下有一個(gè)config文件,可以修改其中的配置信息

      3.2. Git ad

      將當(dāng)前工作目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的一步

      可以遞歸添加,即如果后面跟的是一個(gè)目錄作為參數(shù),則會(huì)遞歸添加整個(gè)目錄中的所有子目錄和文件。例如

      git add dir1 ( 添加dir1這個(gè)目錄,目錄下的所有文件都被加入

      Git add f1 f2 ( 添加f1,f2文件

      git add . ( 添加當(dāng)前目錄下的所有文件和子目錄

      3.3. Git r

      從當(dāng)前的工作目錄中和索引中刪除文件

      可以遞歸刪除,即如果后面跟的是一個(gè)目錄做為參數(shù),則會(huì)遞歸刪除整個(gè)目錄中的所有子目錄和文件。例如

      git rm –r * (進(jìn)入某個(gè)目錄中,執(zhí)行此語(yǔ)句,會(huì)刪除該目錄下的所有文件和子目錄

      git rm f1 (刪除文件f1,包含本地目錄和index中的此文件記錄

      git rm –ached f1 (刪除文件f1,不會(huì)刪除本地目錄文件,只刪除index中的文件記錄;將已經(jīng)git add的文件remove到cache中,這樣commit的時(shí)候不會(huì)提交這個(gè)文件, 適用于一下子添加了很多文件, 卻又想排除其中個(gè)別幾個(gè)文件的情況.

      3.4. Git commi

      提交當(dāng)前工作目錄的修改內(nèi)容

      直接調(diào)用git commit命令,會(huì)提示填寫注釋。通過(guò)如下方式在命令行就填寫提交注釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注釋必須不能為空,否則就會(huì)提交失敗

      git commit還有一個(gè) -a的參數(shù),可以將那些沒(méi)有通過(guò)git add標(biāo)識(shí)的變化一并強(qiáng)行提交,但是不建議使用這種方式

      每一次提交,git就會(huì)為全局代碼建立一個(gè)唯一的commit標(biāo)識(shí)代碼,用戶可以通過(guò)git reset命令恢復(fù)到任意一次提交時(shí)的代碼

      git commit –-amend –m “message” (在一個(gè)commit id上不斷修改提交的內(nèi)容

      3.5. Git statu

      查看版本庫(kù)的狀態(tài)。可以得知哪些文件發(fā)生了變化,哪些文件還沒(méi)有添加到git庫(kù)中等等。 建議每次commit前都要通過(guò)該命令確認(rèn)庫(kù)狀態(tài)

      最常見(jiàn)的誤操作是, 修改了一個(gè)文件, 沒(méi)有調(diào)用git add通知git庫(kù)該文件已經(jīng)發(fā)生了變化就直接調(diào)用commit操作, 從而導(dǎo)致該文件并沒(méi)有真正的提交。這時(shí)如果開(kāi)發(fā)者以為已經(jīng)提交了該文件,就繼續(xù)修改甚至刪除這個(gè)文件,那么修改的內(nèi)容就沒(méi)有通過(guò)版本管理起來(lái)。如果每次在 提交前,使用git status查看一下,就可以發(fā)現(xiàn)這種錯(cuò)誤。因此,如果調(diào)用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發(fā)生了變化,但是卻沒(méi)有通過(guò)git add標(biāo)識(shí)的文件

      3.6. Git lo

      查看歷史日志,包含每次的版本變化。每次版本變化對(duì)應(yīng)一個(gè)commit id

      Git log –

      -1的意思是只顯示一個(gè)commit,如果想顯示5個(gè),就-5。不指定的話,git log會(huì)從該commit一直往后顯示

      Git log –stat –summary (顯示每次版本的詳細(xì)變化

      在項(xiàng)目日志信息中,每條日志的首行(就是那一串字符)為版本更新提交所進(jìn)行的命名,我們可以將該命名理解為項(xiàng)目版本號(hào)。項(xiàng)目版本號(hào)應(yīng)該是唯一的,默認(rèn)由 Git 自動(dòng)生成,用以標(biāo)示項(xiàng)目的某一次更新。如果我們將項(xiàng)目版本號(hào)用作git-show 命令的參數(shù),即可查看該次項(xiàng)目版本的更新細(xì)節(jié)。例如

      1) Git lo

      2)Git sho

      實(shí)際上,上述命令并非是真正的進(jìn)行版本號(hào)自定義,只是制造了一個(gè)tag對(duì)象而已,這在進(jìn)行項(xiàng)目版本對(duì)外發(fā)布時(shí)比較有用

      3.7. Git merg

      把服務(wù)器上下載下來(lái)的代碼和本地代碼合并。或者進(jìn)行分支合并

      例如:當(dāng)前在master分支上,若想將分支dev上的合并到master上,則git merge de

      注意:git merge nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支合并到本地分支上

      git rebase nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支映射到本地的一個(gè)臨時(shí)分支上,然后將本地分支上的變化合并到這個(gè)臨時(shí)分支,然后再用這個(gè)臨時(shí)分支初始化本地分支

      3.8. Git dif

      把本地的代碼和index中的代碼進(jìn)行比較,或者是把index中的代碼和本地倉(cāng)庫(kù)中的代碼進(jìn)行比較

      1) Git dif

      比較工作目錄和Index中的代碼

      2) Git diff – – cache

      比較index和本地倉(cāng)庫(kù)中的代碼

      3.9. Git checkou

      3.9.1. 切換到分

      1) 創(chuàng)建一個(gè)新分支,并切換到該分支

      Git checkout –b 新分支

      2)切換到某個(gè)已經(jīng)建立的本地分支local_branc

      Git checkout local_branc

      (使用cat .git/HEAD后,顯示refs:refs/heads/ local_branch

      3) 切換到服務(wù)器上的某個(gè)分支remote_branc

      Git checkout remote_branc

      (遠(yuǎn)程分支remote_branch可以通過(guò) git branch –r 列出

      4) 切換到某個(gè)commit i

      Git checkout commit_i

      (使用cat .git/HEAD后,顯示commit_id

      5) 切換到某個(gè)ta

      Git checkout ta

      (使用cat .git/HEAD后,顯示tag

      注意: 除了1)和2)外,其余三種都只是切換到了一個(gè)臨時(shí)的( no branch )狀態(tài) (this head is detached),這時(shí)用 git branch 可以看到處于(no branch)上, cat .git/HEAD 看到指向相應(yīng)的commit id。 這個(gè)(no branch)只是臨時(shí)存在的,并不是一個(gè)真正建立的branch。 如果此時(shí)執(zhí)行2),則這個(gè)(no branch)就自動(dòng)消失了;如果執(zhí)行1), 則創(chuàng)建新分支 new branch,并把這個(gè)(no branch)掛到這個(gè)新分支上,此時(shí)cat .git/refs/heads/new_branch 可以看到已經(jīng)指向了剛才那個(gè)commit id

      3.9.2. 用已有分支初始化新分

      執(zhí)行下面的命令,在切換到某個(gè)已經(jīng)建立的local branch或者某個(gè)remote branch或者某個(gè)commit id 或者某個(gè)tag的同時(shí),創(chuàng)建新分支new_branch,并且掛到這個(gè)新分支上

      1) 切換到某個(gè)已經(jīng)建立的本地分支local_branch,并且使用此分支初始化一個(gè)新分支new_branch

      git checkout –b new_branch local_branc

      2) 切換到某個(gè)遠(yuǎn)程分支remote_branch,并且用此分支初始化一個(gè)新分支new_branch

      Git checkout –b new_branch remote_branc

      3) 切換到某個(gè)commit id,并建立新分支new_branc

      Git checkout –b new_branch commit_i

      4) 切換到某個(gè)tag,并建立新分支new_branc

      Git checkout –b new_branch ta

      3.9.3. 還原代

      例如 “git checkout app/model/user.rb” 就會(huì)將user.rb文件從上一個(gè)已提交的版本中更新回來(lái),未提交的工作目錄中的內(nèi)容全部會(huì)被覆蓋

      3.10. Git-ls-fil

      查看當(dāng)前的git庫(kù)中有那些文件

      3.11. Git m

      重命名一個(gè)文件、目錄或者鏈接

      例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1.c

      3.12. Git branc

      3.12.1. 總

      在 git 版本庫(kù)中創(chuàng)建分支的成本幾乎為零,所以,不必吝嗇多創(chuàng)建幾個(gè)分支。當(dāng)?shù)谝淮螆?zhí)行g(shù)it init時(shí),系統(tǒng)就會(huì)創(chuàng)建一個(gè)名為“master”的分支。 而其它分支則通過(guò)手工創(chuàng)建

      下面列舉一些常見(jiàn)的分支策略

      創(chuàng)建一個(gè)屬于自己的個(gè)人工作分支,以避免對(duì)主分支 master 造成太多的干擾,也方便與他人交流協(xié)作

      當(dāng)進(jìn)行高風(fēng)險(xiǎn)的工作時(shí),創(chuàng)建一個(gè)試驗(yàn)性的分支

      合并別人的工作的時(shí)候,最好是創(chuàng)建一個(gè)臨時(shí)的分支用來(lái)合并,合并完成后再“fetch”到自己的分支

      對(duì)分支進(jìn)行增、刪、查等操作

      注意:分支信息一般在.git/refs/目錄下,其中heads目錄下為本地分支,remotes為對(duì)應(yīng)服務(wù)器上的分支,tags為標(biāo)簽

      3.12.2. 查看分

      git branch 列出本地git庫(kù)中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當(dāng)前分支

      git branch –r 列出服務(wù)器git庫(kù)的所有分支

      (可以繼續(xù)使用命令 “ git checkout -b 本地分支名 服務(wù)器分支名”來(lái)獲取服務(wù)器上某個(gè)分支的代碼文件)

      3.12.3. 查看當(dāng)前在哪個(gè)分支

      cat .git/HEA

      3.12.4. 創(chuàng)建一個(gè)分

      1) git branch 分支

      雖然創(chuàng)建了分支,但是不會(huì)將當(dāng)前工作分支切換到新創(chuàng)建的分支上,因此,還需要命令“git checkout 分支名” 來(lái)切換

      2) git checout –b 分支

      不但創(chuàng)建了分支,還將當(dāng)前工作分支切換到了該分支上

      3.12.5. 切換到某個(gè)分支:git checkout 分支

      切換到主分支:git checkout maste

      3.12.6. 刪除分

      git branch –D 分支

      注意: 刪除后,發(fā)生在該分支的所有變化都無(wú)法恢復(fù)。強(qiáng)制刪除此分支

      3.12.7. 比較兩個(gè)分支上的文件的區(qū)

      git diff master 分支名 (比較主分支和另一個(gè)分支的區(qū)別

      3.12.8. 查看分支歷

      git-show-branch (查看當(dāng)前分支的提交注釋及信息

      git-show-branch -all(查看所有分支的提交注釋及信息)例如

      * [dev] d

      ! [master] m

      * [dev] d

      * [dev^] d

      * [dev~2] d

      *+ [master] m

      在上述例子中, “–”之上的兩行表示有兩個(gè)分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “–”之下的幾行表示了分支演化的歷史,其中 dev表示發(fā)生在dev分支上的最后一次提交,dev^表示發(fā)生在dev分支上的倒數(shù)第二次提交。dev~2表示發(fā)生在dev分支上的倒數(shù)第三次提交

      3.12.9. 查看當(dāng)前分支的操作記

      git whatchange

      3.12.10. 合并分

      法一

      git merge “注釋” 合并的目標(biāo)分支 合并的來(lái)源分

      如果合并有沖突,git會(huì)有提示

      例如:git checkout master (切換到master分支

      git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master dev~

      法二

      git pull 合并的目標(biāo)分支 合并的來(lái)源分

      例如: git checkout master (切換到master分支

      git pull . dev~2(合并當(dāng)前分支和dev~2分支

      3.13. Git rebas

      一般在將服務(wù)器最新內(nèi)容合并到本地時(shí)使用,例如:在版本C時(shí)從服務(wù)器上獲取內(nèi)容到本地,修改了本地內(nèi)容,此時(shí)想把本地修改的內(nèi)容提交到服務(wù)器上;但發(fā)現(xiàn)服務(wù)器上的版本已經(jīng)變?yōu)镚了,此時(shí)就需要先執(zhí)行Git rebase,將服務(wù)器上的最新版本合并到本地。例如

      用下面兩幅圖解釋會(huì)比較清楚一些,rebase命令執(zhí)行后,實(shí)際上是將分支點(diǎn)從C移到了G,這樣分支也就具有了從C到G的功能

      3.14. Git rese

      庫(kù)的逆轉(zhuǎn)與恢復(fù)除了用來(lái)進(jìn)行一些廢棄的研發(fā)代碼的重置外,還有一個(gè)重要的作用。比如我們從遠(yuǎn)程clone了一個(gè)代碼庫(kù),在本地開(kāi)發(fā)后,準(zhǔn)備提交回遠(yuǎn)程。但是本地代碼庫(kù)在開(kāi)發(fā)時(shí),有功能性的commit,也有出于備份目的的commit等等??傊?,commit的日志中有大量無(wú)用log,我們并不想把這些 log在提交回遠(yuǎn)程時(shí)也提交到庫(kù)中。 因此,就要用到git reset

      git reset的概念比較復(fù)雜。它的命令形式:git reset [–mixed | –soft | –hard] [<commit-ish>

      命令的選項(xiàng)

      –mixed 這個(gè)是默認(rèn)的選項(xiàng)。如git reset [–mixed] dev^(dev^的定義可以參見(jiàn)2.6.5)。它的作用僅是重置分支狀態(tài)到dev1^, 但是卻不改變?nèi)魏喂ぷ魑募膬?nèi)容。即,從dev1^到dev1的所有文件變化都保留了,但是dev1^到dev1之間的所有commit日志都被清除了, 而且,發(fā)生變化的文件內(nèi)容也沒(méi)有通過(guò)git add標(biāo)識(shí),如果您要重新commit,還需要對(duì)變化的文件做一次git add。 這樣,commit后,就得到了一份非常干凈的提交記錄。 (回退了index和倉(cāng)庫(kù)中的內(nèi)容

      –soft相當(dāng)于做了git reset –mixed,后,又對(duì)變化的文件做了git add。如果用了該選項(xiàng), 就可以直接commit了。(回退了倉(cāng)庫(kù)中的內(nèi)容

      –hard這個(gè)命令就會(huì)導(dǎo)致所有信息的回退, 包括文件內(nèi)容。 一般只有在重置廢棄代碼時(shí),才用它。 執(zhí)行后,文件內(nèi)容也無(wú)法恢復(fù)回來(lái)了。(回退了工作目錄、index和倉(cāng)庫(kù)中的內(nèi)容

      例如

      切換到使用的分支上

      git reset HEAD^ 回退第一個(gè)記

      git reset HEAD~2 回退第二個(gè)記

      如果想把工作目錄下的文件也回退,則使用git reset – – hard HEAD^ 回退第一個(gè)記

      git reset – – hard HEAD~2 回退第二個(gè)記

      還可以使用如下方法

      將當(dāng)前的工作目錄完全回滾到指定的版本號(hào),假設(shè)如下圖,我們有A-G五次提交的版本,其中C的版本號(hào)是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執(zhí)行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結(jié)果就只剩下了A-C三個(gè)提交的版

      3.15. Git rever

      還原某次對(duì)版本的修改,例如:git revert commit_id (其中commit_id為commit代碼時(shí)生成的一個(gè)唯一表示的字符串

      例如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執(zhí)行此操作,則還原上一次commit的操作

      3.16. Git confi

      利用這個(gè)命令可以新增、更改Git的各種設(shè)置,例如 “git config branch.master.remote origin” 就將master的遠(yuǎn)程版本庫(kù)設(shè)置為別名叫做origin版本庫(kù)

      3.17. Git sho

      顯示對(duì)象的不同類型

      3.18. Git ta

      創(chuàng)建、列出、刪除或者驗(yàn)證一個(gè)標(biāo)簽對(duì)象(使用GPG簽名的)

      可以將某個(gè)具體的版本打上一個(gè)標(biāo)簽,這樣就不需要記憶復(fù)雜的版本號(hào)哈希值字符串了,例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來(lái)標(biāo)記這個(gè)被你還原的版本,那么以后你想查看該版本時(shí),就可以使用 revert_version標(biāo)簽名,而不是哈希值了

      4. Git服務(wù)器操作命令(與服務(wù)器交

      4.1. Git clon

      取出服務(wù)器的倉(cāng)庫(kù)的代碼到本地建立的目錄中(與服務(wù)器交互

      通過(guò)git clone獲取遠(yuǎn)端git庫(kù)后,.git/config中的開(kāi)發(fā)者信息不會(huì)被一起clone過(guò)來(lái)。仍然需要為本地庫(kù)的.git/config文件添加開(kāi)發(fā)者信息。此外,開(kāi)發(fā)者還需要自己添加 . gitignore文件

      通過(guò)git clone獲取的遠(yuǎn)端git庫(kù),只包含了遠(yuǎn)端git庫(kù)的當(dāng)前工作分支。如果想獲取其它分支信息,需要使用 “git branch –r” 來(lái)查看, 如果需要將遠(yuǎn)程的其它分支代碼也獲取過(guò)來(lái),可以使用命令 “ git checkout -b 本地分支名 遠(yuǎn)程分支名”,其中,遠(yuǎn)程分支名為 “git branch –r” 所列出的分支名, 一般是諸如“origin/分支名”的樣子。如果本地分支名已經(jīng)存在, 則不需要“-b”參數(shù)

      例如

      4.2. Git pul

      從服務(wù)器的倉(cāng)庫(kù)中獲取代碼,和本地代碼合并。(與服務(wù)器交互,從服務(wù)器上下載最新代碼,等同于: Git fetch + Git merge

      從其它的版本庫(kù)(既可以是遠(yuǎn)程的也可以是本地的)將代碼更新到本地,例如:“git pull origin master ”就是將origin這個(gè)版本庫(kù)的代碼更新到本地的master主分支

      git pull可以從任意一個(gè)git庫(kù)獲取某個(gè)分支的內(nèi)容。用法如下

      git pull username@ipaddr:遠(yuǎn)端repository名遠(yuǎn)端分支名 本地分支名。這條命令將從遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名獲取到本地git庫(kù)的一個(gè)本地分支中。其中,如果不寫本地分支名,則默認(rèn)pull到本地當(dāng)前分支

      需要注意的是,git pull也可以用來(lái)合并分支。 和git merge的作用相同。 因此,如果你的本地分支已經(jīng)有內(nèi)容,則git pull會(huì)合并這些文件,如果有沖突會(huì)報(bào)警

      例如

      4.3. Git push

      將本地commit的代碼更新到遠(yuǎn)程版本庫(kù)中,例如 “git push origin”就會(huì)將本地的代碼更新到名為orgin的遠(yuǎn)程版本庫(kù)中

      git push和git pull正好想反,是將本地某個(gè)分支的內(nèi)容提交到遠(yuǎn)端某個(gè)分支上。用法: git pushusername@ipaddr:遠(yuǎn)端repository名本地分支名 遠(yuǎn)端分支名。這條命令將本地git庫(kù)的一個(gè)本地分支push到遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名中

      需要格外注意的是,git push好像不會(huì)自動(dòng)合并文件。因此,如果git push時(shí),發(fā)生了沖突,就會(huì)被后push的文件內(nèi)容強(qiáng)行覆蓋,而且沒(méi)有什么提示。 這在合作開(kāi)發(fā)時(shí)是很危險(xiǎn)的事情

      例如

      4.4. Git fetc

      從服務(wù)器的倉(cāng)庫(kù)中下載代碼。(與服務(wù)器交互,從服務(wù)器上下載最新代碼

      相當(dāng)于從遠(yuǎn)程獲取最新版本到本地,不會(huì)自動(dòng)merge,比Git pull更安全些

      使用此方法來(lái)獲取服務(wù)器上的更新

      例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為服務(wù)器上的分支名),則是獲取上次使用git fetch命令時(shí)從服務(wù)器上下載的代碼;如果先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務(wù)器上獲取最新的更新信息,然后從服務(wù)器上下載最新的代碼。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成概念??。。??。。??。。??。。??。。??。。??。。??。。??。。更新全些代碼fetc例如事情名中庫(kù)中.3. Git push例如報(bào)警分支如下分支ge pul例如參數(shù)文件交互on服務(wù)器交值了的)ta類型ho本庫(kù)fi操作符串ever的版方法個(gè)記個(gè)記個(gè)記個(gè)記支上例如內(nèi)容內(nèi)容內(nèi)容選項(xiàng)h>etrese功能例如as分支分支源分法二v~分支提示源分法一并分ge作記提交 m d dd

      – m d例如信息支歷區(qū)別的區(qū)分支分支除分te分支支上分支切換分支個(gè)分EA分支件)分支分支看分標(biāo)簽操作分支分支協(xié)作策略創(chuàng)建 總nc.c鏈接 m文件-fil覆蓋原代tanc_incncchncch支上新分idagtataid_i i列出ncncchncnc分支分支到分ou代碼he代碼if比較if分支支上de合并rg比較有用 sholo例如變化顯示 -idlo文件狀態(tài)tu內(nèi)容代碼方式失敗內(nèi)容mi況.記錄目錄例如文件 r錄 文件入 例如一步ad信息目錄dbni操作基本方法本命t he操作組成的比ord or執(zhí)行件中略機(jī)coaire員姓化配初始化事更新索引目錄錄內(nèi)分組Git概念

      1.1. Git庫(kù)中由三部分組

      Git 倉(cāng)庫(kù)就是那個(gè).git 目錄,其中存放的是我們所提交的文檔索引內(nèi)容,Git 可基于文檔索引內(nèi)容對(duì)其所管理的文檔進(jìn)行內(nèi)容追蹤,從而實(shí)現(xiàn)文檔的版本控制。.git目錄位于工作目錄內(nèi)

      1) 工作目錄:用戶本地的目錄

      2) Index(索引):將工作目錄下所有文件(包含子目錄)生成快照,存放到一個(gè)臨時(shí)的存儲(chǔ)區(qū)域,Git 稱該區(qū)域?yàn)樗饕?/p>

      3) 倉(cāng)庫(kù):將索引通過(guò)commit命令提交至倉(cāng)庫(kù)中,每一次提交都意味著版本在進(jìn)行一次更新

      1.2. 使用Git時(shí)的初始化事

      1.2.1. Git初始化配

      1) 配置使用git倉(cāng)庫(kù)的人員姓

      git config –global user.name "Your Name Comes Here

      2) 配置使用git倉(cāng)庫(kù)的人員emai

      git config –global user.email you@yourdomain.example.co

      1.2.2. Git文檔忽略機(jī)

      工作目錄中有一些文件是不希望接受Git 管理的,譬如程序編譯時(shí)生成的中間文件等等。Git 提供了文檔忽略機(jī)制,可以將工作目錄中不希望接受Git 管理的文檔信息寫到同一目錄下的.gitignore 文件中

      例如:工作目錄下有個(gè)zh目錄,如果不想把它加入到Git管理中,則執(zhí)行

      echo “zh” &gt; .gitignor

      git add

      有關(guān)gitignore 文件的諸多細(xì)節(jié)知識(shí)可閱讀其使用手冊(cè):man gitignor

      1.3. Git與Repo的比

      Git操作一般對(duì)應(yīng)一個(gè)倉(cāng)庫(kù),而Repo操作一般對(duì)應(yīng)一個(gè)項(xiàng)目,即一個(gè)項(xiàng)目會(huì)由若干倉(cāng)庫(kù)組成

      例如,在操作整個(gè)Recket項(xiàng)目時(shí)使用Repo,而操作其中的某個(gè)倉(cāng)庫(kù)時(shí)使用Git。在包含隱藏目錄.git的目錄下執(zhí)行g(shù)it操作

      2. Git he

      Git help 獲取git基本命

      (如果要知道某個(gè)特定命令的使用方法,例如:使用Git help clone,來(lái)獲取git clone的使用方法

      3. Git本地操作基本

      3.1. Git ini

      或者使用git init-db

      創(chuàng)建一個(gè)空的Git庫(kù)。在當(dāng)前目錄中產(chǎn)生一個(gè).git 的子目錄。以后,所有的文件變化信息都會(huì)保存到這個(gè)目錄下,而不像CVS那樣,會(huì)在每個(gè)目錄和子目錄下都創(chuàng)建一個(gè)CVS目錄

      在.git目錄下有一個(gè)config文件,可以修改其中的配置信息

      3.2. Git ad

      將當(dāng)前工作目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的一步

      可以遞歸添加,即如果后面跟的是一個(gè)目錄作為參數(shù),則會(huì)遞歸添加整個(gè)目錄中的所有子目錄和文件。例如

      git add dir1 ( 添加dir1這個(gè)目錄,目錄下的所有文件都被加入

      Git add f1 f2 ( 添加f1,f2文件

      git add . ( 添加當(dāng)前目錄下的所有文件和子目錄

      3.3. Git r

      從當(dāng)前的工作目錄中和索引中刪除文件

      可以遞歸刪除,即如果后面跟的是一個(gè)目錄做為參數(shù),則會(huì)遞歸刪除整個(gè)目錄中的所有子目錄和文件。例如

      git rm –r * (進(jìn)入某個(gè)目錄中,執(zhí)行此語(yǔ)句,會(huì)刪除該目錄下的所有文件和子目錄

      git rm f1 (刪除文件f1,包含本地目錄和index中的此文件記錄

      git rm –ached f1 (刪除文件f1,不會(huì)刪除本地目錄文件,只刪除index中的文件記錄;將已經(jīng)git add的文件remove到cache中,這樣commit的時(shí)候不會(huì)提交這個(gè)文件, 適用于一下子添加了很多文件, 卻又想排除其中個(gè)別幾個(gè)文件的情況.

      3.4. Git commi

      提交當(dāng)前工作目錄的修改內(nèi)容

      直接調(diào)用git commit命令,會(huì)提示填寫注釋。通過(guò)如下方式在命令行就填寫提交注釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注釋必須不能為空,否則就會(huì)提交失敗

      git commit還有一個(gè) -a的參數(shù),可以將那些沒(méi)有通過(guò)git add標(biāo)識(shí)的變化一并強(qiáng)行提交,但是不建議使用這種方式

      每一次提交,git就會(huì)為全局代碼建立一個(gè)唯一的commit標(biāo)識(shí)代碼,用戶可以通過(guò)git reset命令恢復(fù)到任意一次提交時(shí)的代碼

      git commit –-amend –m “message” (在一個(gè)commit id上不斷修改提交的內(nèi)容

      3.5. Git statu

      查看版本庫(kù)的狀態(tài)??梢缘弥男┪募l(fā)生了變化,哪些文件還沒(méi)有添加到git庫(kù)中等等。 建議每次commit前都要通過(guò)該命令確認(rèn)庫(kù)狀態(tài)

      最常見(jiàn)的誤操作是, 修改了一個(gè)文件, 沒(méi)有調(diào)用git add通知git庫(kù)該文件已經(jīng)發(fā)生了變化就直接調(diào)用commit操作, 從而導(dǎo)致該文件并沒(méi)有真正的提交。這時(shí)如果開(kāi)發(fā)者以為已經(jīng)提交了該文件,就繼續(xù)修改甚至刪除這個(gè)文件,那么修改的內(nèi)容就沒(méi)有通過(guò)版本管理起來(lái)。如果每次在 提交前,使用git status查看一下,就可以發(fā)現(xiàn)這種錯(cuò)誤。因此,如果調(diào)用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發(fā)生了變化,但是卻沒(méi)有通過(guò)git add標(biāo)識(shí)的文件

      3.6. Git lo

      查看歷史日志,包含每次的版本變化。每次版本變化對(duì)應(yīng)一個(gè)commit id

      Git log –

      -1的意思是只顯示一個(gè)commit,如果想顯示5個(gè),就-5。不指定的話,git log會(huì)從該commit一直往后顯示

      Git log –stat –summary (顯示每次版本的詳細(xì)變化

      在項(xiàng)目日志信息中,每條日志的首行(就是那一串字符)為版本更新提交所進(jìn)行的命名,我們可以將該命名理解為項(xiàng)目版本號(hào)。項(xiàng)目版本號(hào)應(yīng)該是唯一的,默認(rèn)由 Git 自動(dòng)生成,用以標(biāo)示項(xiàng)目的某一次更新。如果我們將項(xiàng)目版本號(hào)用作git-show 命令的參數(shù),即可查看該次項(xiàng)目版本的更新細(xì)節(jié)。例如

      1) Git lo

      2)Git sho

      實(shí)際上,上述命令并非是真正的進(jìn)行版本號(hào)自定義,只是制造了一個(gè)tag對(duì)象而已,這在進(jìn)行項(xiàng)目版本對(duì)外發(fā)布時(shí)比較有用

      3.7. Git merg

      把服務(wù)器上下載下來(lái)的代碼和本地代碼合并。或者進(jìn)行分支合并

      例如:當(dāng)前在master分支上,若想將分支dev上的合并到master上,則git merge de

      注意:git merge nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支合并到本地分支上

      git rebase nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支映射到本地的一個(gè)臨時(shí)分支上,然后將本地分支上的變化合并到這個(gè)臨時(shí)分支,然后再用這個(gè)臨時(shí)分支初始化本地分支

      3.8. Git dif

      把本地的代碼和index中的代碼進(jìn)行比較,或者是把index中的代碼和本地倉(cāng)庫(kù)中的代碼進(jìn)行比較

      1) Git dif

      比較工作目錄和Index中的代碼

      2) Git diff – – cache

      比較index和本地倉(cāng)庫(kù)中的代碼

      3.9. Git checkou

      3.9.1. 切換到分

      1) 創(chuàng)建一個(gè)新分支,并切換到該分支

      Git checkout –b 新分支

      2)切換到某個(gè)已經(jīng)建立的本地分支local_branc

      Git checkout local_branc

      (使用cat .git/HEAD后,顯示refs:refs/heads/ local_branch

      3) 切換到服務(wù)器上的某個(gè)分支remote_branc

      Git checkout remote_branc

      (遠(yuǎn)程分支remote_branch可以通過(guò) git branch –r 列出

      4) 切換到某個(gè)commit i

      Git checkout commit_i

      (使用cat .git/HEAD后,顯示commit_id

      5) 切換到某個(gè)ta

      Git checkout ta

      (使用cat .git/HEAD后,顯示tag

      注意: 除了1)和2)外,其余三種都只是切換到了一個(gè)臨時(shí)的( no branch )狀態(tài) (this head is detached),這時(shí)用 git branch 可以看到處于(no branch)上, cat .git/HEAD 看到指向相應(yīng)的commit id。 這個(gè)(no branch)只是臨時(shí)存在的,并不是一個(gè)真正建立的branch。 如果此時(shí)執(zhí)行2),則這個(gè)(no branch)就自動(dòng)消失了;如果執(zhí)行1), 則創(chuàng)建新分支 new branch,并把這個(gè)(no branch)掛到這個(gè)新分支上,此時(shí)cat .git/refs/heads/new_branch 可以看到已經(jīng)指向了剛才那個(gè)commit id

      3.9.2. 用已有分支初始化新分

      執(zhí)行下面的命令,在切換到某個(gè)已經(jīng)建立的local branch或者某個(gè)remote branch或者某個(gè)commit id 或者某個(gè)tag的同時(shí),創(chuàng)建新分支new_branch,并且掛到這個(gè)新分支上

      1) 切換到某個(gè)已經(jīng)建立的本地分支local_branch,并且使用此分支初始化一個(gè)新分支new_branch

      git checkout –b new_branch local_branc

      2) 切換到某個(gè)遠(yuǎn)程分支remote_branch,并且用此分支初始化一個(gè)新分支new_branch

      Git checkout –b new_branch remote_branc

      3) 切換到某個(gè)commit id,并建立新分支new_branc

      Git checkout –b new_branch commit_i

      4) 切換到某個(gè)tag,并建立新分支new_branc

      Git checkout –b new_branch ta

      3.9.3. 還原代

      例如 “git checkout app/model/user.rb” 就會(huì)將user.rb文件從上一個(gè)已提交的版本中更新回來(lái),未提交的工作目錄中的內(nèi)容全部會(huì)被覆蓋

      3.10. Git-ls-fil

      查看當(dāng)前的git庫(kù)中有那些文件

      3.11. Git m

      重命名一個(gè)文件、目錄或者鏈接

      例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1.c

      3.12. Git branc

      3.12.1. 總

      在 git 版本庫(kù)中創(chuàng)建分支的成本幾乎為零,所以,不必吝嗇多創(chuàng)建幾個(gè)分支。當(dāng)?shù)谝淮螆?zhí)行g(shù)it init時(shí),系統(tǒng)就會(huì)創(chuàng)建一個(gè)名為“master”的分支。 而其它分支則通過(guò)手工創(chuàng)建

      下面列舉一些常見(jiàn)的分支策略

      創(chuàng)建一個(gè)屬于自己的個(gè)人工作分支,以避免對(duì)主分支 master 造成太多的干擾,也方便與他人交流協(xié)作

      當(dāng)進(jìn)行高風(fēng)險(xiǎn)的工作時(shí),創(chuàng)建一個(gè)試驗(yàn)性的分支

      合并別人的工作的時(shí)候,最好是創(chuàng)建一個(gè)臨時(shí)的分支用來(lái)合并,合并完成后再“fetch”到自己的分支

      對(duì)分支進(jìn)行增、刪、查等操作

      注意:分支信息一般在.git/refs/目錄下,其中heads目錄下為本地分支,remotes為對(duì)應(yīng)服務(wù)器上的分支,tags為標(biāo)簽

      3.12.2. 查看分

      git branch 列出本地git庫(kù)中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當(dāng)前分支

      git branch –r 列出服務(wù)器git庫(kù)的所有分支

      (可以繼續(xù)使用命令 “ git checkout -b 本地分支名 服務(wù)器分支名”來(lái)獲取服務(wù)器上某個(gè)分支的代碼文件)

      3.12.3. 查看當(dāng)前在哪個(gè)分支

      cat .git/HEA

      3.12.4. 創(chuàng)建一個(gè)分

      1) git branch 分支

      雖然創(chuàng)建了分支,但是不會(huì)將當(dāng)前工作分支切換到新創(chuàng)建的分支上,因此,還需要命令“git checkout 分支名” 來(lái)切換

      2) git checout –b 分支

      不但創(chuàng)建了分支,還將當(dāng)前工作分支切換到了該分支上

      3.12.5. 切換到某個(gè)分支:git checkout 分支

      切換到主分支:git checkout maste

      3.12.6. 刪除分

      git branch –D 分支

      注意: 刪除后,發(fā)生在該分支的所有變化都無(wú)法恢復(fù)。強(qiáng)制刪除此分支

      3.12.7. 比較兩個(gè)分支上的文件的區(qū)

      git diff master 分支名 (比較主分支和另一個(gè)分支的區(qū)別

      3.12.8. 查看分支歷

      git-show-branch (查看當(dāng)前分支的提交注釋及信息

      git-show-branch -all(查看所有分支的提交注釋及信息)例如

      * [dev] d

      ! [master] m

      * [dev] d

      * [dev^] d

      * [dev~2] d

      *+ [master] m

      在上述例子中, “–”之上的兩行表示有兩個(gè)分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “–”之下的幾行表示了分支演化的歷史,其中 dev表示發(fā)生在dev分支上的最后一次提交,dev^表示發(fā)生在dev分支上的倒數(shù)第二次提交。dev~2表示發(fā)生在dev分支上的倒數(shù)第三次提交

      3.12.9. 查看當(dāng)前分支的操作記

      git whatchange

      3.12.10. 合并分

      法一

      git merge “注釋” 合并的目標(biāo)分支 合并的來(lái)源分

      如果合并有沖突,git會(huì)有提示

      例如:git checkout master (切換到master分支

      git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master dev~

      法二

      git pull 合并的目標(biāo)分支 合并的來(lái)源分

      例如: git checkout master (切換到master分支

      git pull . dev~2(合并當(dāng)前分支和dev~2分支

      3.13. Git rebas

      一般在將服務(wù)器最新內(nèi)容合并到本地時(shí)使用,例如:在版本C時(shí)從服務(wù)器上獲取內(nèi)容到本地,修改了本地內(nèi)容,此時(shí)想把本地修改的內(nèi)容提交到服務(wù)器上;但發(fā)現(xiàn)服務(wù)器上的版本已經(jīng)變?yōu)镚了,此時(shí)就需要先執(zhí)行Git rebase,將服務(wù)器上的最新版本合并到本地。例如

      用下面兩幅圖解釋會(huì)比較清楚一些,rebase命令執(zhí)行后,實(shí)際上是將分支點(diǎn)從C移到了G,這樣分支也就具有了從C到G的功能

      3.14. Git rese

      庫(kù)的逆轉(zhuǎn)與恢復(fù)除了用來(lái)進(jìn)行一些廢棄的研發(fā)代碼的重置外,還有一個(gè)重要的作用。比如我們從遠(yuǎn)程clone了一個(gè)代碼庫(kù),在本地開(kāi)發(fā)后,準(zhǔn)備提交回遠(yuǎn)程。但是本地代碼庫(kù)在開(kāi)發(fā)時(shí),有功能性的commit,也有出于備份目的的commit等等??傊?,commit的日志中有大量無(wú)用log,我們并不想把這些 log在提交回遠(yuǎn)程時(shí)也提交到庫(kù)中。 因此,就要用到git reset

      git reset的概念比較復(fù)雜。它的命令形式:git reset [–mixed | –soft | –hard] [<commit-ish>

      命令的選項(xiàng)

      –mixed 這個(gè)是默認(rèn)的選項(xiàng)。如git reset [–mixed] dev^(dev^的定義可以參見(jiàn)2.6.5)。它的作用僅是重置分支狀態(tài)到dev1^, 但是卻不改變?nèi)魏喂ぷ魑募膬?nèi)容。即,從dev1^到dev1的所有文件變化都保留了,但是dev1^到dev1之間的所有commit日志都被清除了, 而且,發(fā)生變化的文件內(nèi)容也沒(méi)有通過(guò)git add標(biāo)識(shí),如果您要重新commit,還需要對(duì)變化的文件做一次git add。 這樣,commit后,就得到了一份非常干凈的提交記錄。 (回退了index和倉(cāng)庫(kù)中的內(nèi)容

      –soft相當(dāng)于做了git reset –mixed,后,又對(duì)變化的文件做了git add。如果用了該選項(xiàng), 就可以直接commit了。(回退了倉(cāng)庫(kù)中的內(nèi)容

      –hard這個(gè)命令就會(huì)導(dǎo)致所有信息的回退, 包括文件內(nèi)容。 一般只有在重置廢棄代碼時(shí),才用它。 執(zhí)行后,文件內(nèi)容也無(wú)法恢復(fù)回來(lái)了。(回退了工作目錄、index和倉(cāng)庫(kù)中的內(nèi)容

      例如

      切換到使用的分支上

      git reset HEAD^ 回退第一個(gè)記

      git reset HEAD~2 回退第二個(gè)記

      如果想把工作目錄下的文件也回退,則使用git reset – – hard HEAD^ 回退第一個(gè)記

      git reset – – hard HEAD~2 回退第二個(gè)記

      還可以使用如下方法

      將當(dāng)前的工作目錄完全回滾到指定的版本號(hào),假設(shè)如下圖,我們有A-G五次提交的版本,其中C的版本號(hào)是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執(zhí)行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結(jié)果就只剩下了A-C三個(gè)提交的版

      3.15. Git rever

      還原某次對(duì)版本的修改,例如:git revert commit_id (其中commit_id為commit代碼時(shí)生成的一個(gè)唯一表示的字符串

      例如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執(zhí)行此操作,則還原上一次commit的操作

      3.16. Git confi

      利用這個(gè)命令可以新增、更改Git的各種設(shè)置,例如 “git config branch.master.remote origin” 就將master的遠(yuǎn)程版本庫(kù)設(shè)置為別名叫做origin版本庫(kù)

      3.17. Git sho

      顯示對(duì)象的不同類型

      3.18. Git ta

      創(chuàng)建、列出、刪除或者驗(yàn)證一個(gè)標(biāo)簽對(duì)象(使用GPG簽名的)

      可以將某個(gè)具體的版本打上一個(gè)標(biāo)簽,這樣就不需要記憶復(fù)雜的版本號(hào)哈希值字符串了,例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來(lái)標(biāo)記這個(gè)被你還原的版本,那么以后你想查看該版本時(shí),就可以使用 revert_version標(biāo)簽名,而不是哈希值了

      4. Git服務(wù)器操作命令(與服務(wù)器交

      4.1. Git clon

      取出服務(wù)器的倉(cāng)庫(kù)的代碼到本地建立的目錄中(與服務(wù)器交互

      通過(guò)git clone獲取遠(yuǎn)端git庫(kù)后,.git/config中的開(kāi)發(fā)者信息不會(huì)被一起clone過(guò)來(lái)。仍然需要為本地庫(kù)的.git/config文件添加開(kāi)發(fā)者信息。此外,開(kāi)發(fā)者還需要自己添加 . gitignore文件

      通過(guò)git clone獲取的遠(yuǎn)端git庫(kù),只包含了遠(yuǎn)端git庫(kù)的當(dāng)前工作分支。如果想獲取其它分支信息,需要使用 “git branch –r” 來(lái)查看, 如果需要將遠(yuǎn)程的其它分支代碼也獲取過(guò)來(lái),可以使用命令 “ git checkout -b 本地分支名 遠(yuǎn)程分支名”,其中,遠(yuǎn)程分支名為 “git branch –r” 所列出的分支名, 一般是諸如“origin/分支名”的樣子。如果本地分支名已經(jīng)存在, 則不需要“-b”參數(shù)

      例如

      4.2. Git pul

      從服務(wù)器的倉(cāng)庫(kù)中獲取代碼,和本地代碼合并。(與服務(wù)器交互,從服務(wù)器上下載最新代碼,等同于: Git fetch + Git merge

      從其它的版本庫(kù)(既可以是遠(yuǎn)程的也可以是本地的)將代碼更新到本地,例如:“git pull origin master ”就是將origin這個(gè)版本庫(kù)的代碼更新到本地的master主分支

      git pull可以從任意一個(gè)git庫(kù)獲取某個(gè)分支的內(nèi)容。用法如下

      git pull username@ipaddr:遠(yuǎn)端repository名遠(yuǎn)端分支名 本地分支名。這條命令將從遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名獲取到本地git庫(kù)的一個(gè)本地分支中。其中,如果不寫本地分支名,則默認(rèn)pull到本地當(dāng)前分支

      需要注意的是,git pull也可以用來(lái)合并分支。 和git merge的作用相同。 因此,如果你的本地分支已經(jīng)有內(nèi)容,則git pull會(huì)合并這些文件,如果有沖突會(huì)報(bào)警

      例如

      4.3. Git push

      將本地commit的代碼更新到遠(yuǎn)程版本庫(kù)中,例如 “git push origin”就會(huì)將本地的代碼更新到名為orgin的遠(yuǎn)程版本庫(kù)中

      git push和git pull正好想反,是將本地某個(gè)分支的內(nèi)容提交到遠(yuǎn)端某個(gè)分支上。用法: git pushusername@ipaddr:遠(yuǎn)端repository名本地分支名 遠(yuǎn)端分支名。這條命令將本地git庫(kù)的一個(gè)本地分支push到遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名中

      需要格外注意的是,git push好像不會(huì)自動(dòng)合并文件。因此,如果git push時(shí),發(fā)生了沖突,就會(huì)被后push的文件內(nèi)容強(qiáng)行覆蓋,而且沒(méi)有什么提示。 這在合作開(kāi)發(fā)時(shí)是很危險(xiǎn)的事情

      例如

      4.4. Git fetc

      從服務(wù)器的倉(cāng)庫(kù)中下載代碼。(與服務(wù)器交互,從服務(wù)器上下載最新代碼

      相當(dāng)于從遠(yuǎn)程獲取最新版本到本地,不會(huì)自動(dòng)merge,比Git pull更安全些

      使用此方法來(lái)獲取服務(wù)器上的更新

      例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為服務(wù)器上的分支名),則是獲取上次使用git fetch命令時(shí)從服務(wù)器上下載的代碼;如果先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務(wù)器上獲取最新的更新信息,然后從服務(wù)器上下載最新的代碼。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成。。。)h?:。。。

      ??

      ??:。。:。)l?:。。)e互)。。g。w。g))t?本:錄錄錄錄;:))):]。t?。:e))支:2)。支:支d錄。2012-22:)史)別。名支r名。名,名支D上。。。支。。。;;:。述h)。v。es。碼ghdhh。h。。支。)gg)dd)hh)hh名上支t。d。f。f))v。e。?w?g:)。1。g。。s)。。。。t))):。m))):。d。。。t命令)令lp。。較e.e:。制ml"名置項(xiàng)?。。;。成Git概念
      1.1. Git庫(kù)中由三部分組成
      Git 倉(cāng)庫(kù)就是那個(gè).git 目錄,其中存放的是我們所提交的文檔索引內(nèi)容,Git 可基于文檔索引內(nèi)容對(duì)其所管理的文檔進(jìn)行內(nèi)容追蹤,從而實(shí)現(xiàn)文檔的版本控制。.git目錄位于工作目錄內(nèi)。
      1) 工作目錄:用戶本地的目錄;
      2) Index(索引):將工作目錄下所有文件(包含子目錄)生成快照,存放到一個(gè)臨時(shí)的存儲(chǔ)區(qū)域,Git 稱該區(qū)域?yàn)樗饕?
      3) 倉(cāng)庫(kù):將索引通過(guò)commit命令提交至倉(cāng)庫(kù)中,每一次提交都意味著版本在進(jìn)行一次更新。
      詳細(xì)介紹的git使用
      1.2. 使用Git時(shí)的初始化事項(xiàng)
      1.2.1. Git初始化配置
      1) 配置使用git倉(cāng)庫(kù)的人員姓名
      git config –global user.name "Your Name Comes Here"
      2) 配置使用git倉(cāng)庫(kù)的人員email
      git config –global user.email you@yourdomain.example.com
      1.2.2. Git文檔忽略機(jī)制
      工作目錄中有一些文件是不希望接受Git 管理的,譬如程序編譯時(shí)生成的中間文件等等。Git 提供了文檔忽略機(jī)制,可以將工作目錄中不希望接受Git 管理的文檔信息寫到同一目錄下的.gitignore 文件中。
      例如:工作目錄下有個(gè)zh目錄,如果不想把它加入到Git管理中,則執(zhí)行:
      echo “zh” &gt; .gitignore
      git add .
      有關(guān)gitignore 文件的諸多細(xì)節(jié)知識(shí)可閱讀其使用手冊(cè):man gitignore
      1.3. Git與Repo的比較
      Git操作一般對(duì)應(yīng)一個(gè)倉(cāng)庫(kù),而Repo操作一般對(duì)應(yīng)一個(gè)項(xiàng)目,即一個(gè)項(xiàng)目會(huì)由若干倉(cāng)庫(kù)組成。
      例如,在操作整個(gè)Recket項(xiàng)目時(shí)使用Repo,而操作其中的某個(gè)倉(cāng)庫(kù)時(shí)使用Git。在包含隱藏目錄.git的目錄下執(zhí)行g(shù)it操作。

      2. Git help
      Git help 獲取git基本命令
      (如果要知道某個(gè)特定命令的使用方法,例如:使用Git help clone,來(lái)獲取git clone的使用方法)

      3. Git本地操作基本命令
      3.1. Git init
      或者使用git init-db。
      創(chuàng)建一個(gè)空的Git庫(kù)。在當(dāng)前目錄中產(chǎn)生一個(gè).git 的子目錄。以后,所有的文件變化信息都會(huì)保存到這個(gè)目錄下,而不像CVS那樣,會(huì)在每個(gè)目錄和子目錄下都創(chuàng)建一個(gè)CVS目錄。
      在.git目錄下有一個(gè)config文件,可以修改其中的配置信息。
      3.2. Git add
      將當(dāng)前工作目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的一步。
      可以遞歸添加,即如果后面跟的是一個(gè)目錄作為參數(shù),則會(huì)遞歸添加整個(gè)目錄中的所有子目錄和文件。例如:
      git add dir1 ( 添加dir1這個(gè)目錄,目錄下的所有文件都被加入 )
      Git add f1 f2 ( 添加f1,f2文件)
      git add . ( 添加當(dāng)前目錄下的所有文件和子目錄 )
      3.3. Git rm
      從當(dāng)前的工作目錄中和索引中刪除文件。
      可以遞歸刪除,即如果后面跟的是一個(gè)目錄做為參數(shù),則會(huì)遞歸刪除整個(gè)目錄中的所有子目錄和文件。例如:
      git rm –r * (進(jìn)入某個(gè)目錄中,執(zhí)行此語(yǔ)句,會(huì)刪除該目錄下的所有文件和子目錄)
      git rm f1 (刪除文件f1,包含本地目錄和index中的此文件記錄)
      git rm –ached f1 (刪除文件f1,不會(huì)刪除本地目錄文件,只刪除index中的文件記錄;將已經(jīng)git add的文件remove到cache中,這樣commit的時(shí)候不會(huì)提交這個(gè)文件, 適用于一下子添加了很多文件, 卻又想排除其中個(gè)別幾個(gè)文件的情況.)
      3.4. Git commit
      提交當(dāng)前工作目錄的修改內(nèi)容。
      直接調(diào)用git commit命令,會(huì)提示填寫注釋。通過(guò)如下方式在命令行就填寫提交注釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注釋必須不能為空,否則就會(huì)提交失敗。
      git commit還有一個(gè) -a的參數(shù),可以將那些沒(méi)有通過(guò)git add標(biāo)識(shí)的變化一并強(qiáng)行提交,但是不建議使用這種方式。
      每一次提交,git就會(huì)為全局代碼建立一個(gè)唯一的commit標(biāo)識(shí)代碼,用戶可以通過(guò)git reset命令恢復(fù)到任意一次提交時(shí)的代碼。
      git commit –-amend –m “message” (在一個(gè)commit id上不斷修改提交的內(nèi)容)
      3.5. Git status
      查看版本庫(kù)的狀態(tài)??梢缘弥男┪募l(fā)生了變化,哪些文件還沒(méi)有添加到git庫(kù)中等等。 建議每次commit前都要通過(guò)該命令確認(rèn)庫(kù)狀態(tài)。
      最常見(jiàn)的誤操作是, 修改了一個(gè)文件, 沒(méi)有調(diào)用git add通知git庫(kù)該文件已經(jīng)發(fā)生了變化就直接調(diào)用commit操作, 從而導(dǎo)致該文件并沒(méi)有真正的提交。這時(shí)如果開(kāi)發(fā)者以為已經(jīng)提交了該文件,就繼續(xù)修改甚至刪除這個(gè)文件,那么修改的內(nèi)容就沒(méi)有通過(guò)版本管理起來(lái)。如果每次在 提交前,使用git status查看一下,就可以發(fā)現(xiàn)這種錯(cuò)誤。因此,如果調(diào)用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發(fā)生了變化,但是卻沒(méi)有通過(guò)git add標(biāo)識(shí)的文件。
      3.6. Git log
      查看歷史日志,包含每次的版本變化。每次版本變化對(duì)應(yīng)一個(gè)commit id。
      Git log -1
      -1的意思是只顯示一個(gè)commit,如果想顯示5個(gè),就-5。不指定的話,git log會(huì)從該commit一直往后顯示。
      Git log –stat –summary (顯示每次版本的詳細(xì)變化)
      在項(xiàng)目日志信息中,每條日志的首行(就是那一串字符)為版本更新提交所進(jìn)行的命名,我們可以將該命名理解為項(xiàng)目版本號(hào)。項(xiàng)目版本號(hào)應(yīng)該是唯一的,默認(rèn)由 Git 自動(dòng)生成,用以標(biāo)示項(xiàng)目的某一次更新。如果我們將項(xiàng)目版本號(hào)用作git-show 命令的參數(shù),即可查看該次項(xiàng)目版本的更新細(xì)節(jié)。例如:
      1) Git log
      詳細(xì)介紹的git使用
      2)Git show
      詳細(xì)介紹的git使用
      實(shí)際上,上述命令并非是真正的進(jìn)行版本號(hào)自定義,只是制造了一個(gè)tag對(duì)象而已,這在進(jìn)行項(xiàng)目版本對(duì)外發(fā)布時(shí)比較有用。
      3.7. Git merge
      把服務(wù)器上下載下來(lái)的代碼和本地代碼合并。或者進(jìn)行分支合并。
      例如:當(dāng)前在master分支上,若想將分支dev上的合并到master上,則git merge dev
      注意:git merge nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支合并到本地分支上)
      git rebase nov/eclair_eocket (是將服務(wù)器git庫(kù)的eclair_eocket分支映射到本地的一個(gè)臨時(shí)分支上,然后將本地分支上的變化合并到這個(gè)臨時(shí)分支,然后再用這個(gè)臨時(shí)分支初始化本地分支)
      3.8. Git diff
      把本地的代碼和index中的代碼進(jìn)行比較,或者是把index中的代碼和本地倉(cāng)庫(kù)中的代碼進(jìn)行比較。
      1) Git diff
      比較工作目錄和Index中的代碼。
      2) Git diff – – cached
      比較index和本地倉(cāng)庫(kù)中的代碼。
      3.9. Git checkout
      3.9.1. 切換到分支
      1) 創(chuàng)建一個(gè)新分支,并切換到該分支上
      Git checkout –b 新分支名
      2)切換到某個(gè)已經(jīng)建立的本地分支local_branch
      Git checkout local_branch
      (使用cat .git/HEAD后,顯示refs:refs/heads/ local_branch)
      3) 切換到服務(wù)器上的某個(gè)分支remote_branch
      Git checkout remote_branch
      (遠(yuǎn)程分支remote_branch可以通過(guò) git branch –r 列出)
      4) 切換到某個(gè)commit id
      Git checkout commit_id
      (使用cat .git/HEAD后,顯示commit_id)
      5) 切換到某個(gè)tag
      Git checkout tag
      (使用cat .git/HEAD后,顯示tag)
      注意: 除了1)和2)外,其余三種都只是切換到了一個(gè)臨時(shí)的( no branch )狀態(tài) (this head is detached),這時(shí)用 git branch 可以看到處于(no branch)上, cat .git/HEAD 看到指向相應(yīng)的commit id。 這個(gè)(no branch)只是臨時(shí)存在的,并不是一個(gè)真正建立的branch。 如果此時(shí)執(zhí)行2),則這個(gè)(no branch)就自動(dòng)消失了;如果執(zhí)行1), 則創(chuàng)建新分支 new branch,并把這個(gè)(no branch)掛到這個(gè)新分支上,此時(shí)cat .git/refs/heads/new_branch 可以看到已經(jīng)指向了剛才那個(gè)commit id。
      3.9.2. 用已有分支初始化新分支
      執(zhí)行下面的命令,在切換到某個(gè)已經(jīng)建立的local branch或者某個(gè)remote branch或者某個(gè)commit id 或者某個(gè)tag的同時(shí),創(chuàng)建新分支new_branch,并且掛到這個(gè)新分支上。
      1) 切換到某個(gè)已經(jīng)建立的本地分支local_branch,并且使用此分支初始化一個(gè)新分支new_branch。
      git checkout –b new_branch local_branch
      2) 切換到某個(gè)遠(yuǎn)程分支remote_branch,并且用此分支初始化一個(gè)新分支new_branch。
      Git checkout –b new_branch remote_branch
      3) 切換到某個(gè)commit id,并建立新分支new_branch
      Git checkout –b new_branch commit_id
      4) 切換到某個(gè)tag,并建立新分支new_branch
      Git checkout –b new_branch tag
      3.9.3. 還原代碼
      例如 “git checkout app/model/user.rb” 就會(huì)將user.rb文件從上一個(gè)已提交的版本中更新回來(lái),未提交的工作目錄中的內(nèi)容全部會(huì)被覆蓋。

      3.10. Git-ls-files
      查看當(dāng)前的git庫(kù)中有那些文件。
      3.11. Git mv
      重命名一個(gè)文件、目錄或者鏈接。
      例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1.c)
      3.12. Git branch
      3.12.1. 總述
      在 git 版本庫(kù)中創(chuàng)建分支的成本幾乎為零,所以,不必吝嗇多創(chuàng)建幾個(gè)分支。當(dāng)?shù)谝淮螆?zhí)行g(shù)it init時(shí),系統(tǒng)就會(huì)創(chuàng)建一個(gè)名為“master”的分支。 而其它分支則通過(guò)手工創(chuàng)建。
      下面列舉一些常見(jiàn)的分支策略:
      創(chuàng)建一個(gè)屬于自己的個(gè)人工作分支,以避免對(duì)主分支 master 造成太多的干擾,也方便與他人交流協(xié)作;
      當(dāng)進(jìn)行高風(fēng)險(xiǎn)的工作時(shí),創(chuàng)建一個(gè)試驗(yàn)性的分支;
      合并別人的工作的時(shí)候,最好是創(chuàng)建一個(gè)臨時(shí)的分支用來(lái)合并,合并完成后再“fetch”到自己的分支。
      對(duì)分支進(jìn)行增、刪、查等操作。
      注意:分支信息一般在.git/refs/目錄下,其中heads目錄下為本地分支,remotes為對(duì)應(yīng)服務(wù)器上的分支,tags為標(biāo)簽。
      3.12.2. 查看分支
      git branch 列出本地git庫(kù)中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當(dāng)前分支。
      git branch –r 列出服務(wù)器git庫(kù)的所有分支。
      (可以繼續(xù)使用命令 “ git checkout -b 本地分支名 服務(wù)器分支名”來(lái)獲取服務(wù)器上某個(gè)分支的代碼文件)。
      3.12.3. 查看當(dāng)前在哪個(gè)分支上
      cat .git/HEAD
      3.12.4. 創(chuàng)建一個(gè)分支
      1) git branch 分支名
      雖然創(chuàng)建了分支,但是不會(huì)將當(dāng)前工作分支切換到新創(chuàng)建的分支上,因此,還需要命令“git checkout 分支名” 來(lái)切換,
      2) git checout –b 分支名
      不但創(chuàng)建了分支,還將當(dāng)前工作分支切換到了該分支上。
      3.12.5. 切換到某個(gè)分支:git checkout 分支名
      切換到主分支:git checkout master
      3.12.6. 刪除分支
      git branch –D 分支名
      注意: 刪除后,發(fā)生在該分支的所有變化都無(wú)法恢復(fù)。強(qiáng)制刪除此分支。
      3.12.7. 比較兩個(gè)分支上的文件的區(qū)別
      git diff master 分支名 (比較主分支和另一個(gè)分支的區(qū)別)
      3.12.8. 查看分支歷史
      git-show-branch (查看當(dāng)前分支的提交注釋及信息)
      git-show-branch -all(查看所有分支的提交注釋及信息)例如:
      * [dev] d2
      ! [master] m2

      * [dev] d2
      * [dev^] d1
      * [dev~2] d0
      *+ [master] m2
      在上述例子中, “–”之上的兩行表示有兩個(gè)分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “–”之下的幾行表示了分支演化的歷史,其中 dev表示發(fā)生在dev分支上的最后一次提交,dev^表示發(fā)生在dev分支上的倒數(shù)第二次提交。dev~2表示發(fā)生在dev分支上的倒數(shù)第三次提交。
      3.12.9. 查看當(dāng)前分支的操作記錄
      git whatchanged
      3.12.10. 合并分支
      法一:
      git merge “注釋” 合并的目標(biāo)分支 合并的來(lái)源分支
      如果合并有沖突,git會(huì)有提示。
      例如:git checkout master (切換到master分支)
      git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master dev~2
      法二:
      git pull 合并的目標(biāo)分支 合并的來(lái)源分支
      例如: git checkout master (切換到master分支)
      git pull . dev~2(合并當(dāng)前分支和dev~2分支)
      3.13. Git rebase
      一般在將服務(wù)器最新內(nèi)容合并到本地時(shí)使用,例如:在版本C時(shí)從服務(wù)器上獲取內(nèi)容到本地,修改了本地內(nèi)容,此時(shí)想把本地修改的內(nèi)容提交到服務(wù)器上;但發(fā)現(xiàn)服務(wù)器上的版本已經(jīng)變?yōu)镚了,此時(shí)就需要先執(zhí)行Git rebase,將服務(wù)器上的最新版本合并到本地。例如:
      用下面兩幅圖解釋會(huì)比較清楚一些,rebase命令執(zhí)行后,實(shí)際上是將分支點(diǎn)從C移到了G,這樣分支也就具有了從C到G的功能。
      詳細(xì)介紹的git使用
      3.14. Git reset
      庫(kù)的逆轉(zhuǎn)與恢復(fù)除了用來(lái)進(jìn)行一些廢棄的研發(fā)代碼的重置外,還有一個(gè)重要的作用。比如我們從遠(yuǎn)程clone了一個(gè)代碼庫(kù),在本地開(kāi)發(fā)后,準(zhǔn)備提交回遠(yuǎn)程。但是本地代碼庫(kù)在開(kāi)發(fā)時(shí),有功能性的commit,也有出于備份目的的commit等等??傊?,commit的日志中有大量無(wú)用log,我們并不想把這些 log在提交回遠(yuǎn)程時(shí)也提交到庫(kù)中。 因此,就要用到git reset。
      git reset的概念比較復(fù)雜。它的命令形式:git reset [–mixed | –soft | –hard] [<commit-ish>]
      命令的選項(xiàng):
      –mixed 這個(gè)是默認(rèn)的選項(xiàng)。如git reset [–mixed] dev^(dev^的定義可以參見(jiàn)2.6.5)。它的作用僅是重置分支狀態(tài)到dev1^, 但是卻不改變?nèi)魏喂ぷ魑募膬?nèi)容。即,從dev1^到dev1的所有文件變化都保留了,但是dev1^到dev1之間的所有commit日志都被清除了, 而且,發(fā)生變化的文件內(nèi)容也沒(méi)有通過(guò)git add標(biāo)識(shí),如果您要重新commit,還需要對(duì)變化的文件做一次git add。 這樣,commit后,就得到了一份非常干凈的提交記錄。 (回退了index和倉(cāng)庫(kù)中的內(nèi)容)
      –soft相當(dāng)于做了git reset –mixed,后,又對(duì)變化的文件做了git add。如果用了該選項(xiàng), 就可以直接commit了。(回退了倉(cāng)庫(kù)中的內(nèi)容)
      –hard這個(gè)命令就會(huì)導(dǎo)致所有信息的回退, 包括文件內(nèi)容。 一般只有在重置廢棄代碼時(shí),才用它。 執(zhí)行后,文件內(nèi)容也無(wú)法恢復(fù)回來(lái)了。(回退了工作目錄、index和倉(cāng)庫(kù)中的內(nèi)容)
      例如:
      切換到使用的分支上;
      git reset HEAD^ 回退第一個(gè)記錄
      git reset HEAD~2 回退第二個(gè)記錄
      如果想把工作目錄下的文件也回退,則使用git reset – – hard HEAD^ 回退第一個(gè)記錄
      git reset – – hard HEAD~2 回退第二個(gè)記錄
      還可以使用如下方法:
      將當(dāng)前的工作目錄完全回滾到指定的版本號(hào),假設(shè)如下圖,我們有A-G五次提交的版本,其中C的版本號(hào)是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執(zhí)行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結(jié)果就只剩下了A-C三個(gè)提交的版本
      詳細(xì)介紹的git使用
      3.15. Git revert
      還原某次對(duì)版本的修改,例如:git revert commit_id (其中commit_id為commit代碼時(shí)生成的一個(gè)唯一表示的字符串)
      例如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執(zhí)行此操作,則還原上一次commit的操作)
      3.16. Git config
      利用這個(gè)命令可以新增、更改Git的各種設(shè)置,例如 “git config branch.master.remote origin” 就將master的遠(yuǎn)程版本庫(kù)設(shè)置為別名叫做origin版本庫(kù)。
      3.17. Git show
      顯示對(duì)象的不同類型。
      3.18. Git tag
      創(chuàng)建、列出、刪除或者驗(yàn)證一個(gè)標(biāo)簽對(duì)象(使用GPG簽名的)。
      可以將某個(gè)具體的版本打上一個(gè)標(biāo)簽,這樣就不需要記憶復(fù)雜的版本號(hào)哈希值字符串了,例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來(lái)標(biāo)記這個(gè)被你還原的版本,那么以后你想查看該版本時(shí),就可以使用 revert_version標(biāo)簽名,而不是哈希值了。

      4. Git服務(wù)器操作命令(與服務(wù)器交互)
      4.1. Git clone
      取出服務(wù)器的倉(cāng)庫(kù)的代碼到本地建立的目錄中(與服務(wù)器交互)
      通過(guò)git clone獲取遠(yuǎn)端git庫(kù)后,.git/config中的開(kāi)發(fā)者信息不會(huì)被一起clone過(guò)來(lái)。仍然需要為本地庫(kù)的.git/config文件添加開(kāi)發(fā)者信息。此外,開(kāi)發(fā)者還需要自己添加 . gitignore文件。
      通過(guò)git clone獲取的遠(yuǎn)端git庫(kù),只包含了遠(yuǎn)端git庫(kù)的當(dāng)前工作分支。如果想獲取其它分支信息,需要使用 “git branch –r” 來(lái)查看, 如果需要將遠(yuǎn)程的其它分支代碼也獲取過(guò)來(lái),可以使用命令 “ git checkout -b 本地分支名 遠(yuǎn)程分支名”,其中,遠(yuǎn)程分支名為 “git branch –r” 所列出的分支名, 一般是諸如“origin/分支名”的樣子。如果本地分支名已經(jīng)存在, 則不需要“-b”參數(shù)。
      例如:
      詳細(xì)介紹的git使用
      4.2. Git pull
      從服務(wù)器的倉(cāng)庫(kù)中獲取代碼,和本地代碼合并。(與服務(wù)器交互,從服務(wù)器上下載最新代碼,等同于: Git fetch + Git merge)
      從其它的版本庫(kù)(既可以是遠(yuǎn)程的也可以是本地的)將代碼更新到本地,例如:“git pull origin master ”就是將origin這個(gè)版本庫(kù)的代碼更新到本地的master主分支。
      git pull可以從任意一個(gè)git庫(kù)獲取某個(gè)分支的內(nèi)容。用法如下:
      git pull username@ipaddr:遠(yuǎn)端repository名遠(yuǎn)端分支名 本地分支名。這條命令將從遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名獲取到本地git庫(kù)的一個(gè)本地分支中。其中,如果不寫本地分支名,則默認(rèn)pull到本地當(dāng)前分支。
      需要注意的是,git pull也可以用來(lái)合并分支。 和git merge的作用相同。 因此,如果你的本地分支已經(jīng)有內(nèi)容,則git pull會(huì)合并這些文件,如果有沖突會(huì)報(bào)警。
      例如:
      詳細(xì)介紹的git使用

      詳細(xì)介紹的git使用

      詳細(xì)介紹的git使用

      詳細(xì)介紹的git使用
      4.3. Git push
      將本地commit的代碼更新到遠(yuǎn)程版本庫(kù)中,例如 “git push origin”就會(huì)將本地的代碼更新到名為orgin的遠(yuǎn)程版本庫(kù)中。
      git push和git pull正好想反,是將本地某個(gè)分支的內(nèi)容提交到遠(yuǎn)端某個(gè)分支上。用法: git pushusername@ipaddr:遠(yuǎn)端repository名本地分支名 遠(yuǎn)端分支名。這條命令將本地git庫(kù)的一個(gè)本地分支push到遠(yuǎn)端git庫(kù)的遠(yuǎn)端分支名中。
      需要格外注意的是,git push好像不會(huì)自動(dòng)合并文件。因此,如果git push時(shí),發(fā)生了沖突,就會(huì)被后push的文件內(nèi)容強(qiáng)行覆蓋,而且沒(méi)有什么提示。 這在合作開(kāi)發(fā)時(shí)是很危險(xiǎn)的事情。
      例如:
      詳細(xì)介紹的git使用
      4.4. Git fetch
      從服務(wù)器的倉(cāng)庫(kù)中下載代碼。(與服務(wù)器交互,從服務(wù)器上下載最新代碼)
      相當(dāng)于從遠(yuǎn)程獲取最新版本到本地,不會(huì)自動(dòng)merge,比Git pull更安全些。
      使用此方法來(lái)獲取服務(wù)器上的更新。
      例如:如果使用git checkout nov/eclair_rocket (nov/eclair_rocket為服務(wù)器上的分支名),則是獲取上次使用git fetch命令時(shí)從服務(wù)器上下載的代碼;如果先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務(wù)器上獲取最新的更新信息,然后從服務(wù)器上下載最新的代碼。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)