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

        一起來看看史上最詳細(xì)Git使用教程

        一起來看看史上最詳細(xì)Git使用教程

        Git是世界上最先進(jìn)的分布式版本控制系統(tǒng),克隆一個(gè)項(xiàng)目的速度非常快

        每個(gè)開發(fā)都可以從master上克隆一個(gè)本地版本庫,就算沒有網(wǎng)絡(luò),也可以提交代碼到本地倉庫、查看log、創(chuàng)建項(xiàng)目分支等等

        每個(gè)版本庫都可以創(chuàng)建無限個(gè)分支,分支是個(gè)完整的目錄,且這個(gè)目錄擁有完整的實(shí)際文件

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

        一、安裝

        網(wǎng)上搜一下安裝教程,這里就不介紹了

        安裝完成后,在開始菜單里找到“Git”->“Git Bash”,彈一個(gè)類似命令行窗口的東西,就說明Git安裝成功

        接著需要設(shè)置一下機(jī)器信息,這臺(tái)機(jī)器上的所有Git倉庫都會(huì)使用這個(gè)配置

        $ git config --global user.name "username" $ git config --global user.email "email@example.com"

        二、創(chuàng)建版本庫

        1、創(chuàng)建一個(gè)空目錄(最好不要包含中文)

        $ mkdir mymenu $ cd mymenu $ pwd /Users/hxk/mymenu

        pwd命令顯示當(dāng)前目錄

        2、初始化倉庫

        git init命令把這個(gè)目錄變成git可以管理的倉庫

        $ git init Initialized empty Git repository in /Users/hxk/mymenu/.git/

        初始化了一個(gè)空的倉庫,目錄下多了.git目錄

        系統(tǒng)自動(dòng)創(chuàng)建了唯一一個(gè)master分支

        版本控制系統(tǒng)只能跟蹤文本文件的改動(dòng),且編碼方式是utf-8

        三、文件的基本操作

        創(chuàng)建一個(gè)test.txt文件,內(nèi)容如下:

        Hello World

        1、添加文件到倉庫

        $ git add readme.txt

        2、提交文件到倉庫

        $ git commit -m "a new file"

        -m后面輸入的是本次提交的說明,提交成功后會(huì)顯示:

        1 file changed:1個(gè)文件被改動(dòng)(我們新添加的readme.txt文件);

        2 insertions:插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)。

        為什么Git添加文件需要add,commit一共兩步呢?因?yàn)?code>commit可以一次提交很多文件,所以你可以多次add不同的文件

        $ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."

        如果提交的備注寫錯(cuò)了,可以用以下命令修改剛剛提交的備注

        $ git commit --amend

        3、修改文件

        將test.txt文件修改如下:

        Hello World ABC

        提交

        $ git add test.txt $ git commit -m "append ABC"

        每次commit都會(huì)生成一個(gè)“快照”

        4、查看歷史記錄

        $ git log commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: hxk <hxk@gmail.com> Date:   Fri July 20 21:06:15 2018 +0800      append ABC  commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: hxk <hxk@gmail.com> Date:   Fri July 20 20:59:18 2018 +0800      a new file

        git log顯示最近到最遠(yuǎn)的提交日志,我們可以看到兩次提交,最后一次是append ABC

        git的版本號(hào)是用SHA1計(jì)算出來的一個(gè)16進(jìn)制數(shù)

        如果嫌輸出信息太多,可以加上–pretty=oneline

        $ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append ABC eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 a new file

        5、回退歷史版本

        $ git reset

        首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,也就是最新的提交1094adb...,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過來,所以寫成HEAD~100

        回退上一版本

        $ git reset --hard HEAD^ HEAD is now at eaadf4e a new file

        這時(shí)再次查看歷史版本

        $ git log commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: hxk <hxk@gmail.com> Date:   Fri July 20 20:59:18 2018 +0800      a new file

        之前那個(gè)版本已經(jīng)看不到了,這時(shí)如果想回到之前那個(gè)版本,需要知道版本號(hào),git內(nèi)部有個(gè)指向當(dāng)前版本的head指針,將指針從當(dāng)前版本指回去,所以git回退版本特別快

        $ git reset --hard 1094adb7

        6、查看歷史命令

        要是不記得剛才的版本號(hào)了,可以使用以下命令:

        $ git reflog

        7、查看狀態(tài)

        $ git status

        四、工作區(qū)和暫存區(qū)

        Git和SVN的一個(gè)不同之處就是有暫存區(qū)的概念

        名詞解釋:

        工作區(qū)(Working Directory):指的是在電腦里能看到的目錄,比如mymenu文件夾就是一個(gè)工作區(qū)

        版本庫(Repository):.git目錄,Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD

        git add是把需要提交的文件添加到暫存區(qū)

        一起來看看史上最詳細(xì)Git使用教程

        git commit是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支

        ————————-測(cè)試一下————————–

        在工作區(qū)新增一個(gè)testfile文本文件

        先用git status查看一下狀態(tài):

        $ git status On branch master Changes not staged for commit:   (use "git add <file>..." to update what will be committed)   (use "git checkout -- <file>..." to discard changes in working directory)      modified:   test.txt  Untracked files:   (use "git add <file>..." to include in what will be committed)      testfile  no changes added to commit (use "git add" and/or "git commit -a")

        Git非常清楚地告訴我們,test.txt被修改了,而testfile還從來沒有被添加過,所以它的狀態(tài)是Untracked

        將testfile提交后再查看狀態(tài)

        $ git status On branch master Changes to be committed:   (use "git reset HEAD <file>..." to unstage)      new file:   testfile     modified:   test.txt

        提交后沒有對(duì)工作區(qū)進(jìn)行修改的話,查看狀態(tài),工作區(qū)是干凈的

        $ git status On branch master nothing to commit, working tree clean

        ——————————-測(cè)試結(jié)束————————————

        五、修改

        1、管理修改

        那么,為什么說git比svn優(yōu)秀呢?因?yàn)間it跟蹤并管理的是修改,而不是文件

        修改test.txt文件內(nèi)容,添加一行

        $ cat test.txt Hello World ABC This is the second line

        然后添加文件

        $ git add test.txt

        再次修改test.txt

        $ cat test.txt Hello World ABC This is the second line This is the third line

        提交

        $ git commit -m "test add lines"

        這時(shí)我們發(fā)現(xiàn),第二次的修改未提交,這是為什么呢?

        第一次修改–>git add–>第二次修改–>git commit

        add將工作區(qū)的修改存入暫存區(qū),但是第二次修改并未存入暫存區(qū),git commit只負(fù)責(zé)把暫存區(qū)的修改提交,所以正確的順序應(yīng)該是:

        第一次修改 –> git add –> 第二次修改 –> git add –> git commit

        提交后,查看工作區(qū)和版本庫里面最新版本的區(qū)別:

        $ git diff HEAD -- test.txt

        2、撤銷修改

        1)丟棄工作區(qū)的修改 git checkout -- file(--很重要,沒有--,就變成了“切換到另一個(gè)分支”的命令

        $ git checkout -- test.txt

        命令git checkout -- test.txt意思就是,把test.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:

        一種是test.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);

        一種是test.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

        總之,就是讓這個(gè)文件回到最近一次git commitgit add時(shí)的狀態(tài)。

        2)把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū) git reset HEAD <file>

        $ git reset HEAD test.txt Unstaged changes after reset: M    test.txt

        git reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時(shí),表示最新的版本。

        3、刪除文件

        工作區(qū)中刪除文件

        $ rm test.txt

        一是要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit

        $ git rm test.txt $ git commit -m "remove test.txt"

        二是刪錯(cuò)了,因?yàn)榘姹編炖镞€有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:

        $ git checkout -- test.txt

        git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”。

        PS: 手動(dòng)刪除文件,然后使用git rm <file>和git add<file>效果是一樣的。

        六、分支管理

        1、創(chuàng)建與合并分支

        每次提交,Git都把它們串成一條時(shí)間線,這條時(shí)間線就是一個(gè)分支。截止到目前,只有一條時(shí)間線,在Git里,這個(gè)分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。

        一開始的時(shí)候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):

        一起來看看史上最詳細(xì)Git使用教程

        每次提交,master分支都會(huì)向前移動(dòng)一步,這樣,隨著你不斷提交,master分支的線也越來越長。

        當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),Git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:

        一起來看看史上最詳細(xì)Git使用教程

        你看,Git創(chuàng)建一個(gè)分支很快,因?yàn)槌嗽黾右粋€(gè)dev指針,改改HEAD的指向,工作區(qū)的文件都沒有任何變化!

        不過,從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后,dev指針往前移動(dòng)一步,而master指針不變:

        一起來看看史上最詳細(xì)Git使用教程

        假如我們?cè)?code>dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最簡(jiǎn)單的方法,就是直接把master指向dev的當(dāng)前提交,就完成了合并:

        一起來看看史上最詳細(xì)Git使用教程

        所以Git合并分支也很快!就改改指針,工作區(qū)內(nèi)容也不變!

        合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:

        一起來看看史上最詳細(xì)Git使用教程

        ————————————測(cè)試開始—————————————————

        1)創(chuàng)建分支 git branch <name>

        切換分支 git checkout <name>

        首先,我們創(chuàng)建dev分支,然后切換到dev分支:

        $ git checkout -b dev Switched to a new branch 'dev'

        git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:

        $ git branch dev $ git checkout dev Switched to branch 'dev'

        2)查看分支 git branch

        然后,用git branch命令查看當(dāng)前分支:

        $ git branch * dev   master

        git branch命令會(huì)列出所有分支,當(dāng)前分支前面會(huì)標(biāo)一個(gè)*號(hào)。

        然后,我們就可以在dev分支上正常提交,比如對(duì)test.txt做個(gè)修改,再提交,dev分支的工作完成后,我們就可以切換回master分支:

        $ git checkout master Switched to branch 'master'

        切換回master分支后,再查看一個(gè)test.txt文件,剛才添加的內(nèi)容不見了!因?yàn)槟莻€(gè)提交是在dev分支上,而master分支此刻的提交點(diǎn)并沒有變:

        一起來看看史上最詳細(xì)Git使用教程

        3)合并某個(gè)分支到當(dāng)前分支 git merge <name>

        現(xiàn)在,我們把dev分支的工作成果合并到master分支上:

        $ git merge dev

        git merge命令用于合并指定分支到當(dāng)前分支。合并后,再查看test.txt的內(nèi)容,就可以看到,和dev分支的最新提交是完全一樣的。

        4)刪除分支 git branch -d <name>

        合并完成后,就可以放心地刪除dev分支了:

        $ git branch -d dev Deleted branch dev (was b17d20e).

        刪除后,查看branch,就只剩下master分支了:

        $ git branch * master

        因?yàn)閯?chuàng)建、合并和刪除分支非常快,所以Git鼓勵(lì)你使用分支完成某個(gè)任務(wù),合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

        2、解決沖突

        創(chuàng)建一個(gè)新的分支feature1

        $ git checkout -b feature1 Switched to a new branch 'feature1'

        將test.txt修改了一下,加上“AND Simple”,在feature1分支上提交

        Hello World ABC This is the second line AND Simple

        切換到master分支

        $ git checkout master

        在master分支上,將test.txt的最后一行加上“& Simple”,提交:

        Hello World ABC This is the second line & Simple

        當(dāng)兩個(gè)分支都分別有了新的提交,如下圖所示:

        一起來看看史上最詳細(xì)Git使用教程

        這種情況下無法進(jìn)行快速合并,只能試圖把各自的修改合并起來,這樣有可能會(huì)造成沖突:

        $ git merge feature1 Auto-merging test.txt CONFLICT (content): Merge conflict in test.txt Automatic merge failed; fix conflicts and then commit the result.

        這時(shí)我們必須手動(dòng)解決沖突后再提交,git status可以查看沖突的文件:

        $ git status On branch master Your branch is ahead of 'origin/master' by 2 commits.   (use "git push" to publish your local commits)  You have unmerged paths.   (fix conflicts and run "git commit")   (use "git merge --abort" to abort the merge)  Unmerged paths:   (use "git add <file>..." to mark resolution)      both modified:   test.txt  no changes added to commit (use "git add" and/or "git commit -a")

        查看test.txt文件的內(nèi)容:

        Hello World ABC <<<<<<< HEAD This is the second line & Simple ======= This is the second line AND Simple >>>>>>> feature1

        Git用<<<<<<<=======>>>>>>>標(biāo)記出不同分支的內(nèi)容,我們修改如下后保存:

        This is the second line and Simple

        再提交

        $ git add test.txt  $ git commit -m "conflict fixed" [master cf810e4] conflict fixed

        現(xiàn)在,master分支和feature1分支變成了下圖所示:

        一起來看看史上最詳細(xì)Git使用教程

        用git log –graph –pretty=oneline –abbrev-commit可以看到分支的合并情況,包括分支合并圖(–graph)、一行顯示(–pretty=oneline)、提交校驗(yàn)碼縮略(–abbrev-commit)顯示:

        $ git log --graph --pretty=oneline --abbrev-commit *   cf810e4 (HEAD -> master) conflict fixed |   | * 14096d0 (feature1) AND simple * | 5dc6824 & simple |/   * b17d20e branch test * d46f35e (origin/master) remove test.txt * b84166e add test.txt * 519219b git tracks changes * e43a48b understand how stage works * 1094adb append ABC * eaadf4e a new file

        最后,刪除feature1分支:

        $ git branch -d feature1 Deleted branch feature1 (was 14096d0).

        3、分支管理策略

        通常,合并分支時(shí),Git會(huì)用快速合并模式(Fast forward),但這種模式下,刪除分支后,會(huì)丟掉分支信息。

        如果用普通合并模式,從分支歷史上就可以看出分支信息。

        那么,如何使用普通合并模式呢?我們可以用–no-ff參數(shù)

        $ git merge --no-ff -m "merge with no-ff" dev

        不使用Fast forward模式,merge后就像這樣:如下圖所示:

        一起來看看史上最詳細(xì)Git使用教程

        分支策略

        master分支是最穩(wěn)定的,只能用于發(fā)布新版本,平時(shí)不能在上面進(jìn)行開發(fā),要在新建的分支上進(jìn)行開發(fā),比如dev,這時(shí)dev是不穩(wěn)定的,到產(chǎn)品1.0發(fā)布時(shí),將dev分支和master分支合并,在master分支上發(fā)布1.0版本。

        所以團(tuán)隊(duì)合作的分支看起來就像這張圖一樣:

        一起來看看史上最詳細(xì)Git使用教程

        4、bug分支

        修復(fù)bug時(shí),我們會(huì)創(chuàng)建一個(gè)bug分支進(jìn)行修復(fù),修復(fù)完合并,刪除分支。

        如果手頭上有未完成的工作,先把工作現(xiàn)場(chǎng)git stash一下:

        $ git stash Saved working directory and index state WIP on dev: f52c633 add merge

        查看下工作區(qū)是否干凈

        $ git status

        等bug修復(fù)完分支刪除后,我們先查看下stash

        $ git stash list stash@{0}: WIP on dev: f52c633 add merge

        恢復(fù)工作現(xiàn)場(chǎng)

        1)用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來刪除

        可以多次stash,恢復(fù)指定的stash;

        $ git stash apply stash@{0}

        2)用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了:

        $ git stash pop

        5、Feature分支

        開發(fā)一個(gè)新功能,需要新建一個(gè)分支。

        如果這個(gè)功能還未合并就要取消,要使用-D強(qiáng)行刪除

        $ git branch -D 分支名

        6、多人協(xié)作

        當(dāng)你從遠(yuǎn)程克隆時(shí),git自動(dòng)把本地master分支和遠(yuǎn)程master分支對(duì)應(yīng)起來,遠(yuǎn)程倉庫默認(rèn)名為origin

        1)查看遠(yuǎn)程庫的信息

        $ git remote

        查看遠(yuǎn)程庫的詳細(xì)信息

        $ git remote -v

        2)推送分支

        將本地master分支推送到遠(yuǎn)程庫

        如果不推送到遠(yuǎn)程,本地分支對(duì)于其它人就是不可見的

        $ git push origin master

        3)抓取分支

        如果本地分支推送到遠(yuǎn)程庫的文件有沖突,推送失敗,我們就得先從遠(yuǎn)程庫中抓取最新的提交合并到本地,解決沖突再提交。

        $ git pull

        如果git pull報(bào)錯(cuò):沒有指定本地分支與遠(yuǎn)程分支的鏈接,我們就要手動(dòng)設(shè)置一下

        git branch --set-upstream-to=origin/<遠(yuǎn)程分支名> 本地分支名

        4)Rebase

        rebase操作可以把本地未push的分叉提交歷史整理成直線;

        目的是使得我們?cè)诓榭礆v史提交的變化時(shí)更容易,因?yàn)榉植娴奶峤恍枰綄?duì)比。

        $ git rebase

        和merge的對(duì)比示意圖如下:

        merge–>

        一起來看看史上最詳細(xì)Git使用教程

        rebase–>

        一起來看看史上最詳細(xì)Git使用教程

        七、標(biāo)簽管理

        切換到需要打標(biāo)簽的分支上

        1)新建一個(gè)標(biāo)簽(默認(rèn)為HEAD,也可以指定一個(gè)commit id)

        創(chuàng)建帶有說明的標(biāo)簽,用-a指定標(biāo)簽名,-m指定說明文字

        $ git tag <標(biāo)簽名> $ git tag <標(biāo)簽名> <commit id> $ git tag -a <標(biāo)簽名> -m "備注"

        2)查看標(biāo)簽

        標(biāo)簽不是按時(shí)間順序列出,而是按字母排序的。

        git tag查看所有標(biāo)簽,用git show 標(biāo)簽名查看指定的某個(gè)標(biāo)簽信息

        $ git tag $ git show <標(biāo)簽名>

        PS:標(biāo)簽總是和某個(gè)commit掛鉤。如果這個(gè)commit既出現(xiàn)在master分支,又出現(xiàn)在dev分支,那么在這兩個(gè)分支上都可以看到這個(gè)標(biāo)簽。

        3)刪除標(biāo)簽

        創(chuàng)建的標(biāo)簽都只存儲(chǔ)在本地,不會(huì)自動(dòng)推送到遠(yuǎn)程,所以打錯(cuò)的標(biāo)簽可以在本地安全刪除;

        $ git tag -d <標(biāo)簽名>

        如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程,要先從本地刪除,再從遠(yuǎn)程刪除

        $ git tag -d <標(biāo)簽名> $ git push origin :refs/tags/<標(biāo)簽名>

        4)推送標(biāo)簽到遠(yuǎn)程

        推送某個(gè)標(biāo)簽到遠(yuǎn)程 git push origin <tagname>

        推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽 git push origin --tags

        $ git push origin <標(biāo)簽名> $ git push origin --tags

        以上。

        To be continued…

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 亚洲AV无码成人精品区狼人影院| 精品人妻无码专区中文字幕 | 亚洲精品国偷自产在线| 欧美成人精品高清视频在线观看 | 国产精品一区12p| 九九久久精品国产| 国产福利精品一区二区| 成人国产精品免费视频| 91麻豆精品国产自产在线观看亚洲| 国产精品免费观看| 免费精品一区二区三区第35| 国产精品无打码在线播放| 国产精品视频第一区二区三区| 日本精品一区二区三区在线视频| 亚洲精品无码MV在线观看| 国产精品欧美久久久久天天影视| 精品国偷自产在线视频| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品无码一区二区三区电影| 亚洲精品成人久久久| 国产在线精品一区免费香蕉| 欧美亚洲精品在线| 国产精品国产三级国产专播| 精品综合久久久久久888蜜芽| 99re这里只有精品6| 亚洲精品一品区二品区三品区| 国产精品无码一区二区在线观一| 欧美精品亚洲精品日韩| 99久久婷婷免费国产综合精品| 精品国产a∨无码一区二区三区| 99精品欧美一区二区三区| 老子影院午夜精品无码| 日韩精品视频一区二区三区| 久久精品国产免费一区| 国产成人精品无码播放| 精品国产一区AV天美传媒| 亚洲AV成人精品网站在线播放| www亚洲欲色成人久久精品| 亚洲级αV无码毛片久久精品| 久久久久久国产精品美女| 精品97国产免费人成视频|