Git入門看這一篇就夠了!
目錄:

版本控制介紹
什么是版本控制
為什么要版本控制
本地版本控制系統
集中化的版本控制系統
分布式版本控制系統
認識 Git
Git 簡史
Git 與其他版本管理系統的主要區別
Git 的三種狀態
Git 使用快速入門
獲取 Git 倉庫
記錄每次更新到倉庫
推送改動到遠程倉庫
遠程倉庫的移除與重命名
查看提交歷史
撤銷操作
分支
推薦閱讀
版本控制
什么是版本控制
版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。 除了項目源代碼,你可以對任何類型的文件進行版本控制。
為什么要版本控制
有了它你就可以將某個文件回溯到之前的狀態,甚至將整個項目都回退到過去某個時間點的狀態,你可以比較文件的變化細節,查出最后是誰修改了哪個地方,從而找出導致怪異問題出現的原因,又是誰在何時報告了某個功能缺陷等等。
本地版本控制系統
許多人習慣用復制整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。 這么做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。
為了解決這個問題,人們很久以前就開發了許多種本地版本控制系統,大多都是采用某種簡單的數據庫來記錄文件的歷次更新差異。下圖來源于Git官網。
集中化的版本控制系統
接下來人們又遇到一個問題,如何讓在不同系統上的開發者協同工作? 于是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。
集中化的版本控制系統都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。下圖來源于Git官網。
這么做雖然解決了本地版本控制系統無法讓在不同系統上的開發者協同工作的詬病,但也還是存在下面的問題:
?單點故障:中央服務器宕機,則其他人無法使用;如果中心數據庫磁盤損壞有沒有進行備份,你將丟失所有數據。本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。?必須聯網才能工作:受網絡狀況、帶寬影響。
分布式版本控制系統
于是分布式版本控制系統(Distributed Version Control System,簡稱 DVCS)面世了。 Git 就是一個典型的分布式版本控制系統。
這類系統,客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這么一來,任何一處協同工作用的服務器發生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復。 因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。下圖來源于Git官網。
分布式版本控制系統可以不用聯網就可以工作,因為每個人的電腦上都是完整的版本庫,當你修改了某個文件后,你只需要將自己的修改推送給別人就可以了。但是,在實際使用分布式版本控制系統的時候,很少會直接進行推送修改,而是使用一臺充當“中央服務器”的東西。這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
分布式版本控制系統的優勢不單是不必聯網這么簡單,后面我們還會看到 Git 極其強大的分支管理等功能。
認識 Git
Git 簡史
Linux 內核項目組當時使用分布式版本控制系統 BitKeeper 來管理和維護代碼。但是,后來開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了 Linux 內核社區免費使用 BitKeeper 的權力。 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經驗教訓,開發出自己的版本系統,而且對新的版本控制系統做了很多改進。
Git 與其他版本管理系統的主要區別
Git 在保存和對待各種信息的時候與其它版本控制系統有很大差異,盡管操作起來的命令形式非常相近,理解這些差異將有助于防止你使用中的困惑。
下面我們主要說一個關于 Git 其他版本管理系統的主要差別:對待數據的方式。
Git采用的是直接記錄快照的方式,而非差異比較。我后面會詳細介紹這兩種方式的差別。
大部分版本控制系統(CVS、Subversion、Perforce、Bazaar 等等)都是以文件變更列表的方式存儲信息,這類系統將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異。
具體原理如下圖所示,理解起來其實很簡單,每個我們對提交更新一個文件之后,系統記錄都會記錄這個文件做了哪些更新,以增量符號Δ(Delta)表示。下圖來源于Git官網。
我們怎樣才能得到一個文件的最終版本呢?
很簡單,高中數學的基本知識,我們只需要將這些原文件和這些增加進行相加就行了。
這種方式有什么問題呢?
比如我們的增量特別特別多的話,如果我們要得到最終的文件是不是會耗費時間和性能。
Git 不按照以上方式對待或保存數據。 反之,Git 更像是把數據看作是對小型文件系統的一組快照。 每次你提交更新,或在 Git 中保存項目狀態時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。 Git 對待數據更像是一個?快照流。下圖來源于Git官網。
Git 的三種狀態
Git 有三種狀態,你的文件可能處于其中之一:
?已提交(committed):數據已經安全的保存在本地數據庫中。?已修改(modified):已修改表示修改了文件,但還沒保存到數據庫中。?已暫存(staged):表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工作區域的概念:Git 倉庫(.git directoty) 、工作目錄(Working Directory)?以及?暫存區域(Staging Area)?。下圖來源于Git官網。
基本的 Git 工作流程如下:
?在工作目錄中修改文件。?暫存文件,將文件的快照放入暫存區域。?提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
Git 使用快速入門
獲取 Git 倉庫
有兩種取得 Git 項目倉庫的方法。
?在現有目錄中初始化倉庫: 進入項目目錄運行?git init?命令,該命令將創建一個名為?.git?的子目錄。?從一個服務器克隆一個現有的 Git 倉庫:?git clone [url]?自定義本地倉庫的名字:?git clone [url]?directoryname
記錄每次更新到倉庫
?檢測當前文件狀態?:?git status?提出更改(把它們添加到暫存區):git add filename?(針對特定文件)、git add *(所有文件)、git add *.txt(支持通配符,所有 .txt 文件)?忽略文件:.gitignore?文件?提交更新:?git commit -m "代碼提交信息"?(每次準備提交前,先用?git status?看下,是不是都已暫存起來了, 然后再運行提交命令?git commit)?跳過使用暫存區域更新的方式?:?git commit -a -m "代碼提交信息"。?git commit?加上?-a?選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過?git add?步驟。?移除文件?:git rm filename?(從暫存區域移除,然后提交。)?對文件重命名?:git mv README.md README(這個命令相當于mv README.md README、git rm README.md、git add README?這三條命令的集合)
推送改動到遠程倉庫
如果你還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:·git remote add origin
將這些改動提交到遠端倉庫:git push origin master?(可以把?master?換成你想要推送的任何分支)
如此你就能夠將你的改動推送到所添加的服務器上去了。
遠程倉庫的移除與重命名
?將 test 重命名位 test1:git remote rename test test1?移除遠程倉庫 test1:git remote rm test1
查看提交歷史
在提交了若干更新,又或者克隆了某個項目之后,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是?git log?命令。git log?會按提交時間列出所有的更新,最近的更新排在最上面。
可以添加一些參數來查看自己希望看到的內容:
只看某個人的提交記錄:
git?log?--author=bob
撤銷操作
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有?--amend?選項的提交命令嘗試重新提交:
git?commit?--amend
取消暫存的文件
git?reset?filename
撤消對文件的修改:
git?checkout?--?filename
假如你想丟棄你在本地的所有改動與提交,可以到服務器上獲取最新的版本歷史,并將你本地主分支指向它:
git?fetch?origingit?reset?--hard?origin/master
分支
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master?是“默認的”分支。在其他分支上進行開發,完成后再將它們合并到主分支上。
我們通常在開發新功能、修復一個緊急 bug 等等時候會選擇創建分支。單分支開發好還是多分支開發好,還是要看具體場景來說。
創建一個名字叫做 test 的分支
git?branch?test
切換當前分支到 test(當你切換分支的時候,Git 會重置你的工作目錄,使其看起來像回到了你在那個分支上最后一次提交的樣子。 Git 會自動添加、刪除、修改文件以確保此時你的工作目錄和這個分支最后一次提交時的樣子一模一樣)
git?checkout?test
你也可以直接這樣創建分支并切換過去(上面兩條命令的合寫)
git?checkout?-b?feature_x
切換到主分支
git?checkout?master
合并分支(可能會有沖突)
git?merge?test
把新建的分支刪掉
git?branch?-d?feature_x
將分支推送到遠端倉庫(推送成功后其他人可見):
git?push?origin
分布式 Git
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。