Git【入門】這一篇就夠了

前言

Git【入門】這一篇就夠了

歡迎關注公衆號,白嫖原創PDF,也可以催更,微信搜:JavaPub,回覆:【666】

Git 在生產工作中是使用頻率很高的工具,但我發現很多文章只是對它做了簡單的提交命令說明,真正遇到 版本衝突文件丟失 等問題又定位不到原因,浪費大量時間。本篇文章較長,但都是在實際項目中用到的點。

閱讀本文大概需要6分鐘

1.版本控制

1.1.什麼是版本控制

版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。除了項目,你可以對任何類型的文件進行版本控制。

1.2.爲什麼版本控制

採用版本控制系統(VCS)是個明智的選擇。 有了它就可以將某個文件回溯到之前的狀態,甚至將整個項目都回退到過去某個時間點的狀態,可以比較文件的變化細節,查出最後是誰修改了哪個地方,從而找出導致怪異問題出現的原因,又是誰在何時報告了某個功能缺陷等等。 使用版本控制系統就算你對項目刪除、修改錯誤,這也沒有關係,你也照樣可以很容易地就恢復到原先的樣子。但額外增加的工作量卻微乎其微。

1.3.本地版本控制

許多人習慣用複製整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。 這麼做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。而且不利於團隊協作。
爲了解決這個問題,人們很久以前就開發了許多種本地版本控制系統,大多都是採用某種簡單的數據庫來記錄文件的歷次更新差異。圖片來源 Git 官網。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VaOie3Fy-1593163259795)(https://static01.imgkr.com/temp/0290a168494d45e78ac618547785a09a.png)]

其中最流行的一種叫做 RCS,現今許多計算機系統上都還看得到它的蹤影。 甚至在流行的 Mac OS X 系統上安裝了開發者工具包之後,也可以使用 rcs 命令。 它的工作原理是在硬盤上保存補丁集(補丁是指文件修訂前後的變化);通過應用所有的補丁,可以重新計算出各個版本的文件內容。

1.2.集中化的版本控制

接下來人們又遇到一個問題,如何讓在不同系統上的開發者協同工作? 於是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。 諸如 CVS、Subversion(SVN) 以及 Perforce 等。
集中化的版本控制系統是單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。多年以來,這已成爲版本控制系統的標準做法。如圖(來源 Git 官網):

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gB5jAkgx-1593163259802)(https://static01.imgkr.com/temp/9b50cae4ff91436faf2a4ce66e9372cd.png)]

相對本地版本管理,集中化的版本控制每個人都可以在一定程度上看到項目中的其他人正在做些什麼。 而管理員也可以輕鬆掌控每個開發者的權限,並且管理一個 CVCS 要遠比在各個客戶端上維護本地數據庫來得輕鬆容易。

它也有如下詬病:

  1. 單點故障
    如果宕機,誰都無法提交更新,也就無法協同工作。 如果中心數據庫所在的磁盤發生損壞,又沒有做恰當備份,毫無疑問將丟失所有數據——包括項目的整個變更歷史,只剩下人們在各自機器上保留的單獨快照。

  2. 需要聯網
    爲什麼需要聯網?集中化的版本控制系統 倉庫集中在一臺服務器,也就受到服務器網絡環境的影響。

1.2.分佈式版本控制

於是分佈式版本控制系統(Distributed Version Control System,簡稱 DVCS)面世了。 Git 就是典型的分佈式版本控制。還有 MercurialBazaar 以及 Darcs 等。

客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這麼一來,任何一處協同工作用的服務器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢復。 因爲每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。圖片來源 Git 官網。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ORRy1qEU-1593163259804)(https://static01.imgkr.com/temp/1093734883a94b9ca524fe3765997873.png)]

分佈式版本控制系統的優勢不單是不必聯網這麼簡單,後面我們還會看到 Git 極其強大的分支管理等功能。

2.認識 Git

2.1.Git 簡史

2002 年,Linux 內核開源項目整個項目組啓用一個專有的分佈式版本控制系統 BitKeeper 來管理和維護代碼。到了 2005 年,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關係結束,他們收回了 Linux 內核社區免費使用 BitKeeper 的權力。 這就迫使 Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基於使用 BitKeeper 時的經驗教訓,開發出自己的版本系統。

2.2.Git 與其他版本控制系統區別

集中式的缺點:集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快。

  1. 分佈式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因爲版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫。

比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

  1. 和集中式版本控制系統相比,分佈式版本控制系統的安全性要高很多,因爲每個人電腦裏都有完整的版本庫。

某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法幹活了。

在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。

2.2.1.Git 和其他版本控制系統的存儲區別

Git的存儲方式是 快照技術 ,而其他版本控制系統的存儲基本上都是 增量存儲。以下圖片來自網絡。

2.2.1.1.快照技術

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iUqlWxYF-1593163259808)(https://static01.imgkr.com/temp/552da6c37c8444a7891da729ffcfc8a9.png)]

Git在每次 git add 即將內容添加到 緩存區 時會進行一次快照,快照 就像給當時的整個目錄及文件照了一張相,在任何時候通過快照就能將目錄及文件恢復到發起快照點的狀態。Git 是這樣生成快照的,對於沒有變化的文件,會生成一個引用指向原文件的位置以節省空間提高效率,對於變化了的文件則將整個文件存儲。git每個版本存儲的是一個快照。

2.2.1.2.增量存儲

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YwdgU57E-1593163259811)(https://static01.imgkr.com/temp/d37764af6543482688e61867634c1724.png)]

所謂 增量存儲 ,指的是除了第一個版本存儲的是每個文件的完整內容,之後的版本存儲的是每個文件相對於上一個版本對應文件的變化的內容。

2.3.Git 三種文件狀態

Git 在未進行 commit 操作之前,存在三種狀態:Untracked filesChanges not staged for commitChanges to be committed ,每種狀態之間可以隨意進行互相轉換。瞭解這三種狀態各自所對應的不同情況,能夠幫助你方便有效的使用 Git 來管理項目。

在 Git 中,文件狀態是個非常重要的概念。

爲了更清楚的說明 文件狀態 的概念,使用網絡上三張圖片。

  • 初始化一個項目,也就是將項目所在目錄納入Git的管理之下。假設項目目錄爲hello_world,初始化之後,在目錄下新建README.txt文件,接着,使用“git status”查看文件狀態,如圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jOANJp4E-1593163259813)(https://static01.imgkr.com/temp/2c73b205df274321b4afa96b4c6b27f7.png)]

  • 可以看到,Git友好的標示出README.txt爲“Untracked files”,並且提示使用“git add …”的命令將文件包含到待提交清單中。按照提示,使用“git add README.txt”命令,然後,使用“git status”查看文件狀態,如圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EREM9oi2-1593163259815)(https://static01.imgkr.com/temp/5421dbfba2844975b01a930fd5a5818c.png)]

  • 文件README.txt狀態變成了“Changes to be committed”,也就是說README.txt在暫存區域生成了快照,等待被提交。正如Git所提示的那樣,通過“git rm --cached README.txt”命令,可以將文件狀態還原爲未暫存狀態,即回到“Untracked files”文件狀態。現在,README.txt已經可以被提交到git目錄中了,但是暫時不提交。打開README.txt,向其中加些內容,保存之後,用“git status”查看,返回如圖信息:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AyQcZ5w1-1593163259819)(https://static01.imgkr.com/temp/603089354e0542ca922b0741432c7608.png)]

可以看到,除了之前的“Changes to be committed”狀態,現在又多了一條“Changes not staged for commit”狀態,表明文件已經修改,但是還沒有放入暫存區域,也就是沒生成快照。如果現在進行commit操作,只是將修改之前的文件快照提交到了git目錄,一定記住:只有暫存區域的文件(即:文件狀態爲“Changes to be committed”)纔會被提交。正如提示,通過“git add README.txt”命令將已修改文件更新到暫存區域中,如果想撤銷修改,可以使用“git checkout – README.txt”命令。

3.Git 安裝

3.1.Linux 安裝

  • Centos/RedHat 安裝

$ yum install curl-devel expat-devel gettext-devel
openssl-devel zlib-devel

$ yum -y install git-core

$ git --version
git version 1.7.1

Linux 的其他版本系統需要其他方式安裝。

3.2.Windows 安裝

直接在官網下載。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QUvRilvv-1593163259820)(https://static01.imgkr.com/temp/cf9c3ce193d4460fa7bb454362b4cba6.png)]

另一種是在 Github ,搜索 GitHub for Windows 項目。

4.Git 快速入門

4.1.獲取倉庫

  • 第一種:

新建一個存項目文件夾,在 git bash 執行 git init ,項目文件夾下出現 .git 的子目錄。

  • 第二種

從遠程代碼倉庫拉去一個現有的:git clone [url] 也可以自定義本地倉庫名字 git clone [url] dirName

4.2.完整一次的提交流程

進入 Git 項目目錄

cd /myProject

提交所有修改到暫存區

git add .

提交暫存區修改內容到本地倉庫

git commit -m “提交描述”

推送到遠程倉庫

git push

現在就可以拉去 JavaPub 的遠程倉庫了。

4.3.提交說明

  • 忽略文件配置:.gitignore 文件
  • 移除文件git rm filename(從暫存區移除,然後提交)
  • 查看文件狀態git status

4.4.推送到遠程倉庫

  • 推送到遠程倉庫:git push origin master 推送到遠程 master 分支

  • 如果沒有遠程倉庫,現在想讓本地和遠程倉庫關聯,
    如下命令添加:git remote add origin <server> ,比如我們要讓本地的一個倉庫和 Github 上創建的一個倉庫關聯可以這樣 git remote add origin https://github.com/Rodert/test.git

現在就可以將項目推送到遠程倉庫了。

4.5.提交歷史

有時我們需要查詢以前的提交歷史,使用命令 git log

只看某人提交記錄

git log --author=bob

4.6.撤銷操作

有時你提交過代碼之後,發現一個地方改錯了,你下次提交時不想保留上一次的記錄;或者你上一次的 commit message的描述有誤,這時候你可以使用接下來的這個命令:git commit --amend

git commit --amend

取消上一步操作,如 git addgit commit 之後。

git reset filename

4.7.分支

分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是默認的。在其他分支上進行開發,完成後再將它們合併到主分支上。

不同的版本或系統模塊並行開發時,我們一般會單獨建立一個分支進行開發,最後再合併到主分支。

  • 新建本地分支

git branch test

  • 切換到 test 分支

git checkout test

也可以合併上面倆步,git checkout -b feature_x

  • 切換到 master 分支

git checkout master

  • 合併分支 (可能有衝突)

git merge test

  • 把新建的分支刪掉

git branch -d test

  • 另外,也可以把分支推送到遠程倉庫 git push <遠程主機名> <本地分支名>:<遠程分支名>

git push origin test:test

聲明:參考來源互聯網,有任何爭議可以留言。站在前人的肩上,我們才能看的更遠。

本教程純手打,致力於最實用教程,不需要什麼獎勵,只希望多多轉發支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章