<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    afrag  
    記錄學習和成長的歷程
    日歷
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567
    統計
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10159
    • 排名 - 2380

    最新評論

    閱讀排行榜

    評論排行榜

     

    轉發自 道法術器的博客文章——Git教程


    1 Git是什么

    Git是一個分布式的版本控制系統。

    注意上面的”分布式的“這個限定詞,這一點是Git和CVS,VSN等其他版本控制系統最大的分別。

    集中式版本控制系統最大的毛病就是必須聯網才能夠工作,也就是各個客戶端必須連接到中央倉庫才能夠工作。

    分布式的版本控制系統中,不必有中央倉庫,每個人的電腦上都有一個完整的版本庫。我們可以在自己的電腦上修改、提交。如果兩個人需要交換修改的代碼,則需要將自己的修改推送給對方。

    在實際的應用中,為了方便一個團隊之間交換代碼修改,我們還是有一個中央倉庫。注意這個倉庫是提供便利的,并不是沒有它就不行(雖然會很不方便)。

    這個教程的主要目的是讓大家了解使用Git進行版本管理的一些基本操作和邏輯,讓大家對Git的使用有一個基本的了解。如果想要詳細了解每個命令的用法,或者要了解一些“高級”的命令,建議大家還是去看看Git的手冊。

    2. 創建本地倉庫

    關于Git的安裝,這里就不講了,網上有很多文章,大家根據自己的系統,找一篇文章照著做就可以了。這里主要講解Git的一些概念和操作。

    前面已經說過,Git是一個分布式的版本控制系統,每個人的電腦上都有一個完整的版本庫,我們把這個版本庫稱為本地倉庫。所有其他的倉庫,無論是同事電腦上的,還是中央服務器的,我們都稱為遠程倉庫。

    創建本地倉庫有兩種方式,第一種是我們從零開始創建,第二種是從遠程倉庫克隆一份。

    我們可以把版本倉庫理解為一個目錄,其中保存了我們所有讓git管理的文件。Git能夠跟蹤這些文件的修改、刪除,能夠追蹤這些文件的歷史,并且可以還原。

    2.1 從頭開始創建本地倉庫

    從頭開始創建本地倉庫非常簡單。

    1. 選擇你想要創建版本倉庫的地方,創建一個空的目錄。
    2. 進入該目錄,在命令行中執行git init命令,把這個目錄變成Git可以管理的版本倉庫。
    3. 把文件添加到Git倉庫中,一共需要三步:
      • 把文件放到Git倉庫的目錄中,無論是新創建一個文件,還是從其他地方copy一個文件。也可以放在子目錄中
      • 運行git add <filepath>,告訴Git把文件添加到倉庫中。
      • 使用git commit命令,告訴Git把改變提交到倉庫。

    2.2 從遠程倉庫克隆

    相比從頭開始創建本地倉庫,我們做得更多的是從遠程倉庫克隆一份。理論上來說遠程倉庫可以是任何一臺電腦上的倉庫,但是通常來說,我們會在github,或自己搭建的git服務器上創建中央倉庫,團隊中的所有成員都從該倉庫上克隆,并在后續將自己的修改上傳上去,或者從中央倉庫讀取其他同事的修改。因此我們這樣只講怎樣中央倉庫克隆到本地倉庫。

    1. 創建本機的ssh-key,在類linux系統上,只需要運行ssh-keygen命令就可以了。
    2. 將ssh-key的公鑰id_rsa.pub上傳到github或者Git服務器上,具體的步驟要參考你們是要的Git服務器是哪一個。
    3. 執行命令git clone <版本庫的網址> [本地目錄名]來創建本地倉庫。如果不指定目錄,則會在當前目錄下創建一個目錄,名字與遠程版本庫的名字相同。

    上面的命令中,版本庫的網址中是可以帶上協議、用戶名等信息的。Git支持http(s),ssh,git,ftp(s),本地文件協議等不同的協議。

    3 使用本地倉庫進行版本管理

    3.1 工作區和暫存區

    為了能夠更好的使用本地倉庫進行版本管理,我們先了解一下工作區和暫存區的概念。

    無論我們是從遠程倉庫克隆,還是使用git init命令新建一個本地倉庫,最終在本地倉庫的目錄中,都有一個隱藏的子目錄.git

    本地倉庫目錄是我們的工作區,我們要管理的文件都在這個目錄中。但是.git目錄不是工作區,這個是版本庫。我們不要手動去修改這個目錄中的內容。

    在這個版本庫中,保存了很多的東西,其中最重要的是暫存區,以及分支。關于分支的概念,我們以后再解釋。目前來說,我們也只有一個分支,也就是Git自動為我們創建的master分區。還有一個指向master分區的指針,叫做HEAD。

    前面我們已經提到過,在添加一個文件到Git本地倉庫中的時候,需要先執行git add命令,然后執行git commit命令。其中git add命令就是將變化的代碼從工作區拷貝到暫存區。 git commit則是將代碼從暫存區提交到版本庫。一旦提交后,暫存區會被清空。

    所以,我們其實可以執行多次git add之后,執行一次git commit,一次性的將多次修改的結果進行提交。

    可以使用git status來查看有哪些修改沒有add到暫存區,有哪些修改在暫存區中,沒有提交到版本庫。

    3.2 提交版本和查看歷史

    我們修改了一個或多個文件之后,可以使用git addgit commit命令將修改提交到版本庫。在使用git commit命令時,可以使用-m選項來添加備注。該命令會得到類似下面的返回:

    1
    2
    3
    $ git commit -m "Fixed the type mistake in readme.txt"
    [master 0db896a] Fixed the type mistake in readme.txt
    1 file changed, 1 insertion(+), 1 deletion(-)

    這個命令返回的信息中,包含了提交的分支,本次提交自動生成的版本號(commit id),輸入的備注,以及修改內容的統計信息。 注意這里的版本號可能不是完整的版本號,而只是版本號的前幾位

    我們可以看到,Git的版本號是一個用十六進制表示的隨機數字,這是為了避免各自在本地數據庫中提交時版本號的沖突。

    Git會記錄下我們所有的版本歷史,可以使用git log命令來查看。

    3.3 版本回退

    版本回退是版本管理系統最基本的功能。如果不能回退,要這系統何用。

    要回退,首先需要知道回退到哪個版本。可以使用git log命令來查看版本歷史信息。然后使用git rest --hard <版本號>來進行回退。這里的版本號不需要輸全,只需要輸入前面幾位,能夠唯一確認一個版本就可以了。

    使用git log的時候,我們看到的會是一堆密密麻麻的信息。如果我們使用圖形化的Git工具,就能夠很直觀的看到Git是將所有的提交按照時間順序串成了一條線,在這個時間線上每一個點就是一次提交,每一次提交都有很多的信息,比如提交人是誰,版本號是多少,備注信息是什么。

    這下就體現了提交的時候使用備注的好處了,我們可以通過備注知道每一次修改的原因和內容,這樣才知道需要回退到哪個版本。

    如果我們從今天的版本回退到了昨天的版本,還能不能回到今天的版本呢?可以的,但是前提要是你還記得今天的版本的版本號。如果我們前面的窗口沒有關閉,可以從git log命令的輸出中找到今天的版本號。如果已經關閉了,則可以重新使用git reflog命令查看我們執行的每一條命令。這樣就可以使用git rest恢復到今天的版本了。

    3.4 管理修改

    前面講過了工作區和暫存區。因此Git相比其他的版本管理系統多了一層。這一層有什么作用呢?

    我們在提交的時候,提交的是暫存區中的內容,而不是工作區中的內容。因此,我們在修改的時候,可以多次將中間代碼添加到暫存區。我們既不需要產生大量的中間版本號和提交記錄,也可以保證不會因為后續的修改弄丟了前面的代碼。我們可以大膽的試錯,發現不合適了,很容易回滾到前一個版本。

    我們可以使用git checkout -- <file>來撤銷工作區的修改。這個時候,如果暫存區中有還沒有提交的修改,那么會使用暫存區中的內容覆蓋工作區中的內容。如果暫存區中的修改都已經提交了,那么會用版本庫中的內容覆蓋工作區中的內容。 注意--不能省略,省略了就變成切換分支的命令了。

    當然,刪除文件也是一種修改。一般我們把文件從Git的目錄中刪除之后,Git會檢測到,并且使用git status命令能夠看到。這個時候,如果確實要刪除文件,可以使用git rm <file>來告訴暫存區我們要刪除這文件,然后用git commit命令提交修改,從版本庫中刪除文件。

    如果是誤刪除的,可以使用git checkout -- <file>命令從版本庫中恢復文件。

    4 分支管理

    前面我們提到了,從git log可以看到我們所有的提交的歷史記錄,并且按照先后順序串成了一條線,這條線就是一個“分支”。只不過我們現在只有一個分支,就是創建本地倉庫時,默認為我們創建一個master分支,通常稱為主分支。
    這個分支目前的情況如下面的示意圖:

    分支允許我們創建另外一條”路徑“,同時管理兩個版本的代碼。例如,我們完成了1.0版本,進入2.0版本的開發。但是我們同時需要進行1.0版本的維護,修復bug。這個時候,我們就可以同時維護1.0分支和2.0分支。

    4.1 創建與合并分支

    分支就是提交記錄組成的一個時間線,因此一個分支可以表示如下:

    master分支示意圖

    分支master指向該分支中的最后一次提交。然后Git還會用HEAD指向master,表明當前的分支是master分支。每次提交,master都會向前移動一步,一直指向最新的提交,master分支的時間線也越來越長。

    master分支示意圖

    如果我們需要創建一個新的分支,例如從當前最新提交創建一個dev分支,那么其實只是創建了一個名為dev的指針,指向最新的提交,同時將HEAD修改為指向dev。使用的命令是git branch dev 和 git checkout dev,得到的結果如下圖所示:

    master分支示意圖

    因此,在Git中創建分支非常的快,因為只是創建一個指針,然后修改做一個指針。
    我們可以使用git branch命令來查看當前的分支,該命令會列出所有的分支,并在當前使用的分支前使用*來標注。

    從現在開始,所有的提交操作都是針對dev分支了,因此,如果做了一次新的提交,dev會向前移動一步,但是master指針不變,如下圖:

    master分支示意圖

    這個時候,要合并分支也很容易,只需要先使用git checkout master命令切換到master分支,然后在master分支中執行git merge dev來講dev合并到當前分支就可以了。實際Git要做的只是將master指針指向最新的提交就可以了(這種合并叫做fast-forward,快速向前。當然并不是所有的合并都這么簡單,我們后面會講到)。如下圖所示:

    master分支示意圖

    當一個分支完成了歷史使命的時候,我們可以將其刪除。例如,如果我們要刪除dev分支,只需要執行git branch -d dev就可以了。刪除后就只剩下master分支了。

    4.2 解決分支之間的沖突

    前面介紹的合并分支是最簡單的一種情況,當然現實世界通常不會這么簡單。現實中常見的情況時在兩個分支上我們都有提交,如下圖所示:

    master分支示意圖

    這個時候,如果我們執行git merge dev命令,就無法執行fast-forward合并,Git會試圖把各自的修改合并起來。如果在dev分支上和在master分支上沒有修改相同的文件,Git能夠自動進行合并。如果有修改相同的文件,Git就處理不了,會告訴我們有沖突,需要我們手動解決沖突之后再提交。 使用git status命令可以看到沖突的文件。

    如果我們打開沖突的文件,會看到類似下面的內容:

    1
    2
    3
    4
    5
    6
    ......
    <<<<<<< HEAD
    HEAD中的內容(當前分支中的內容)
    ==========
    dev分支中的內容。
    >>>>>>> dev

    對于每一個沖突,Git中會用<<<<<<<,=======,>>>>>>>來標記不同分支中的內容。我們需要將這一段修改為合適的內容,并再次提交。如下圖所示:

    master分支示意圖

    5 通過遠程倉庫合作

    一個團隊中有多個開發人員,他們一起協助來完成軟件開發的工作。因此,不可能大家都只在自己的本地倉庫中修修改改。通常來說,我們會配置一個”中央倉庫“,大家都把自己的本地倉庫中的代碼要提交到中央倉庫。

    5.1 日常的工作流程

    在軟件開發過程中,我們首先是從中央倉庫下載代碼到本地倉庫,這個操作在前面的第2.2節中已經描述過了。

    有了本地倉庫之后,日常的工作流程通常上:

    1. 從中央倉庫拉取最新的代碼。
    2. 根據開發任務,在工作區中修改和測試代碼。
    3. 將代碼提交到本地倉庫。
    4. 重復2和3,直到任務開發和測試完成。
    5. 將代碼推送到中央倉庫。

    5.2 從中央倉庫拉取代碼

    從中央倉庫拉取代碼,使用的是git pull命令。 git pull的時候,會試圖自動合并本地與遠程之間的沖突,如果無法自動合并,則需要手動解決沖突。解決的方式和我們前面第4.2節中說過的方法一樣。

    還有一種情況,是從中央倉庫抓取一個新的分支。我們使用git clone命令從中央倉庫克隆的時候,獲取的是master分支。這個時候,中央倉庫就是我們的遠程倉庫,默認的名稱是origin。我們可以使用git remote -v來查看遠程倉庫的詳細信息。

    如果要從中央倉庫獲取一個新的分支,比如dev分支,則需要先執行git checkout -b <本地分支名稱> <遠程庫名稱>/<遠程分支名稱> 命令來獲取新的分支。

    5.3 推送分支到中央倉庫

    我們在本地做的修改,需要上傳到中央倉庫,使用的是git push <遠程庫名稱> <分支名稱>命令。這個過程被稱為推送。

    如果從上次下載代碼到本次推送之間,遠程倉庫上的代碼沒有變化,那么本次推送就沒有問題。但是通常來說,在團隊合作的時候,在這段時間內會有其他人推送了新的代碼到中央倉庫。這個時候使用git push命令就會報錯,并且會提示我們使用git pull獲取最新的代碼,合并代碼后(無論是自動還是手動)再推送。

    6 其他

    6.1 標簽管理

    在Git中,每一次提交都有一個版本號,但是這個版本號對人類很不友好。沒有任何含義,并且又長又難記。我們在日常的交流中無法使用這個版本號。

    這種情況下,引入了tag的功能。Tag就是一個標簽,我們可以在重要的提交版本上添加一個tag,這個tag其實就是指向這一次提交的版本。我們可以給tag賦予有意義的名稱,例如V1.0這樣的,這樣方便我們日常的交流,和將來的查找。

    在Git中打標簽非常簡單,執行git tag <tagname>就可以了。(我們暫時不討論分支,后續的分支管理中在討論。)

    執行上面的命令的時候,默認是將標簽打在分支的最后一次提交上。如果要將標簽打在其他的提交上,可以使用git tag <tagname> <版本號>的方式來執行命令。

    可以使用git tag命令來查看所有的標簽,使用git show <tagname>來查看指定標簽的信息。

    我們創建的標簽都是在本地,如果需要將標簽推送到遠程倉庫,則可以使用git push <遠程倉庫名> <標簽名>命令來推送。也可以一次性的將所有標簽推送到遠程,只需要使用命令git push <遠程倉庫名> --tags命令。

    標簽是不能移動和修改的,但是可以刪除。因此,如果標簽打錯了,修改的方式就是刪除錯誤的標簽,重新創建正確的標簽。git tag -d <name>就是用來刪除指定名稱的tag的命令。

    如果標簽已經被推送到了遠程倉庫,則需要先刪除本地標簽,然后使用如下形式的push命令來刪除遠程倉庫中的標簽。

    git push <遠程倉庫名> :refs/tags/<標簽名>

    6.2 git stash操作

    有些時候,我們在工作的中途,會接到一些緊急的任務,比如生產環境的bug修復。這個時候我們手頭的工作才做了一半,既不能提交,也不能丟棄。但是我們又需要切換到另外的分支中來處理緊急任務,該怎么辦?
    這個時候就可以用到git stash操作了。

    git stash命令會將工作區的修改“隱藏”起來。如下例所示:

    1
    2
    3
    $git stash
    Saved working directory and index state WIP on master: 3793459 add new line in readme.txt
    HEAD is now at 3793459 add new line in readme.txt

    這個命令會將工作區中的修改創建一個存根,并保存到堆棧中。我們可以使用git stash list命令來查看堆棧中的存根。這個時候我們再用git status命令來查看的話,就會發現在工作區中沒有新的修改。這個時候我們就可以切換分支,完成緊急任務。

    當緊急任務完成之后,我們在切換回原來的分支,這個時候可以使用git stash pop ,可以從堆棧中彈出修改并應用到工作區,這樣我們就可以繼續以前的工作了。

    6.3 git配置

    • 配置用戶信息: 使用命令git config --global user.name="<用戶名>"來配置用戶的名字。使用命令git config --global user.name="<郵箱地址>"來配置用戶的email地址。這兩個命令配置的是本機的全局配置。

    • 忽略特殊的文件:在有些時候,我們希望不要提交工作區中的某些文件,比如java編譯時生成的class文件等。我們可以將不希望提交的文件的名稱放在Git工作區的根目錄下的.gitignore文件中,Git就會忽略這些文件。該文件中可以使用通配符。

    posted on 2020-07-23 08:15 afrag 閱讀(74) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 一本色道久久综合亚洲精品| 国产色爽女小说免费看| 日韩va亚洲va欧洲va国产| 猫咪免费人成在线网站| 亚洲AV中文无码乱人伦在线视色 | 91精品视频免费| 4480yy私人影院亚洲| 99re视频精品全部免费| 亚洲视频在线观看不卡| 1000部拍拍拍18勿入免费凤凰福利 | 亚洲天天做日日做天天看 | 久久99精品国产免费观看| 亚洲AV午夜成人影院老师机影院| a国产成人免费视频| 久久亚洲AV无码精品色午夜麻豆 | 四虎影视精品永久免费| 另类专区另类专区亚洲| 亚洲国产专区一区| 国产精品免费观看调教网| 亚洲人成人77777网站不卡| 美女黄网站人色视频免费国产 | 激情婷婷成人亚洲综合| 亚洲精品无码av天堂| 3344在线看片免费| 亚洲乱码一区av春药高潮| 国外成人免费高清激情视频| 边摸边吃奶边做爽免费视频99| 亚洲精品乱码久久久久久久久久久久 | 国产精品成人免费观看| 亚洲精品人成在线观看| 女人张腿给男人桶视频免费版| 大片免费观看92在线视频线视频| 国产成人精品日本亚洲网站| 亚洲视频免费在线播放| 看亚洲a级一级毛片| 久久精品国产99精品国产亚洲性色| 在线视频观看免费视频18| 特色特黄a毛片高清免费观看| 亚洲图片在线观看| 免费国产高清视频| 99久久免费看国产精品|