實戰必備:Git 入門級教程
- 帶你快速理解git
- 介紹一下Git 的由來
- 集中式和分布式版本控制系統區別
- 安裝git
- 一次完整的git使用過程
- 分支管理
帶你快速理解git
學完后能立刻上手的Git教程!圖片有沒有想過把每次修改的代碼內容都記錄下來,防止改錯了需要回退,也方便查看每次修改了什么;有沒有想過一個代碼需要多人操作,多人切換修改后能立刻生成一份新的代碼,讓開發效率更高。那就一起來了解一下git吧,讓你不再手動管理文檔了!
版本控制系統有很多,但是git最出名,為什么呢?像CVS和SVN這種集中式的版本控制系統,它們不但速度慢,而且必須聯網才能使用。
介紹一下Git 的由來
隨著Linux的不斷壯大,其代碼的管理遇到了難題,于是,Linux的締造者 Linus Torvalds,選用了分布式版本控制系統 BitKeeper 來管理和維護代碼。但是,后來由于一些不太美好的原因,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了 Linux 內核社區BitKeeper 的權力。Linux 開源社區(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時的經驗教訓,使用C開發出了自己的分布式版本系統git,而且做了很多改進。不得不說很牛!!
集中式和分布式版本控制系統區別
集中式版本控制系統,版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。
分布式版本控制系統實質上是根本沒有“中央服務器”這一說的,每個人的電腦上都是一個完整的版本庫(可以稱為本地倉庫),這樣,你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上。分布式版本控制系統通常也有一臺充當“中央服務器”的電腦(這里其實就是遠程倉庫),但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
安裝git
Linux上安裝:
兩種方法
一是采用yum來安裝git,可以參考下面的步驟:
1.安裝yum
- yum install git
若出現是否下載,點擊yes
2.驗證安裝是否成功
- git --version
出現版本號,說明安裝成功 git是默認安裝在/usr/libexec/git-core目錄下,可輸入cd指令來查看安裝的信息
二是采用源碼編譯的方式安裝,這種安裝方法的好處就是方便控制安裝的版本
1.先從https://github.com/git/git/releases上下載源碼,在這里我們可以找到所有git已發布的版本,我們選擇最新版的tar.gz包。
最近最新的版本是v2.30.0
下載命令為:
- wget https://github.com/git/git/archive/v2.30.0.tar.gz
解壓
- tar -zxvf git-2.22.0.tar.gz
使用cd命令進入解壓后的文件夾
安裝編譯所需要的依賴
- yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
耐心等待安裝完成,中途出現提示的時候輸入y并按回車。
安裝編譯源碼所需依賴的時候,yum自動幫你安裝了git,這時候你需要先卸載這個舊版的git。
- yum -y remove git
編譯git源碼
- make prefix=/usr/local/git all
安裝git至/usr/local/git路徑
- make prefix=/usr/local/git install
配置環境變量
- vi /etc/profile
- 在底部加上
- export PATH=$PATH:/usr/local/git/bin
( 輸入 :wq! 保存修改)
刷新環境變量
- source /etc/profile
查看Git是否安裝完成
- git --version
Mac上安裝:
兩種方法
一是安裝homebrew,然后通過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/。
第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你需要運行Xcode,選擇菜單“Xcode”->“Preferences”,在彈出窗口中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了。
Windows上安裝:
從Git官網直接下載安裝程序,然后按默認選項安裝即可。
安裝完成后,在開始菜單里找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功!或者是右擊看到下面這幾個圖標:
圖片
一般習慣于用git bash here
最后一步設置標識,輸入下面的命令:
- $ git config --global user.name "Your Name"
- $ git config --global user.email "email@example.com"
注意git config --global參數,有了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然你也可以對某個倉庫指定的不同的用戶名和郵箱。
現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。
先來理解幾個基本概念
上面這幅圖中展示了git的基本使用流程,大致可以分為以下四個區域:
workspace:工作區
平時開發時,改動代碼的地方,也就是每次有新的需求下來,直接在該區域修改代碼,該區域的代碼最新。
index/stage:暫存區
工作區有一個隱藏目錄.git,這個不算工作區,而是 Git 的版本庫(包括暫存區和對象區)。
當你完成某個需求或功能后需要提交到遠程倉庫,那么第一步就是通過git add先提交到暫存區,被git管理。
.git目錄下的暫存區(index文件)會記錄git add添加文件的相關信息(文件名、大小、timestamp...),不保存文件實體, 通過id指向每個文件實體。暫存區標記了你當前工作區中,哪些內容是被git管理的。
repository:本地倉庫
git commit可以同步index中的內容到本地倉庫。
本地倉庫保存了對象被提交過的各個版本,比起工作區和暫存區的內容,它要更舊一些。
remote:遠程倉庫
git push 可以同步本地倉庫中的內容到遠程倉庫。
一次完整的git使用過程
1、創建或獲取版本庫
- 創建版本庫
選擇一個文件目錄,然后右擊打開git bash命令行窗口,執行下述命令初始化一個本地倉庫:
- git init
該命令將創建一個名為 .git 的目錄,這個目錄是git來跟蹤管理版本的,沒事千萬不要手動亂改這個目錄里面的文件,否則,會把git倉庫給破壞了。
- 獲取遠程倉庫至本地倉庫
ps:遠程倉庫的建立會再補充的 選擇一個文件目錄,然后右擊打開git bash命令行窗口,從一個服務器上克隆一個git遠程倉庫:
- git clone [url]
2、記錄每次更新到版本庫
如果是創建的版本庫,此時,工作區中還是沒有文件的,可以直接在工作區中新增并修改;如果是獲取的版本庫,直接修改在工作區的內容就好了。
改動好之后,可執行下述幾個命令:
檢測當前文件狀態 :
- $ 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: readme.txt
- no changes added to commit (use "git add" and/or "git commit -a")
”Changes not staged for commit“說明該文件 readme.txt被修改了但并不在暫存區。
把更改的內容添加到暫存區:
- git add [filename](針對特定文件)
- git add *(所有文件)
- git add *.txt(支持通配符,所有 .txt 文件)
此時,暫存區的內容和工作區的內容一致。
忽略文件:
執行add操作時,有些文件是不想要放到暫存區,就可以使用下面的方法忽略掉:
- 使用命令:touch .gitignore 創建.gitignore文件
- 在文件中寫入需要忽略的文件
- 例如,寫入appName/src/test/* 表示忽略掉了appName項目下的test文件夾下的所有文件
提交更新:
現在最新的代碼在暫存區,現在需要將其放到本地倉庫中,采用下述的命令:
- git commit -m "代碼提交信息"
注意:每次準備提交前,先用 git status 看下,是不是都已暫存起來了,然后再運行提交命令。
跳過使用暫存區域提交更新的方式:
仔細想一想,修改的內容在暫存區中,我們好像也沒有做過什么操作,那為什么不選擇直接提交到本地倉庫呢?稍后解答~,先說一下跳過使用暫存區域而提交更新的命令:
- git commit -a -m "代碼提交信息"。
git commit 加上 -a 選項,git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟。
git暫存區存在的意義:
會有這個疑惑的,請先問問自己,使用git時候是否是所有的修改一次全部提交,根本沒有考慮到修改的多個內容是和多個功能有關的,而每一個功能應該單獨做成一次提交,這樣可以保證提交歷史的清晰。否則,當你想要回滾歷史的時候,你會無所適從,根本分不清每個版本包含了哪些功能,修復了哪些bug。
而暫存區的作用就是為了可以選擇性提交,比如你在開發B功能的時候,發現A功能還存在Bug,這時候就需要先修復A中的Bug,然后先提交A中的Bug修復后的內容,然后再提交B的。這樣就可以使提交版本歷史記錄的更清晰,方便回滾。而提交是原子性操作,文件的選擇就交于暫存區去做,每一次提交都是一個完整的功能開發,保證commit的干凈,降低commit的粒度。
查看工作區和版本庫里面最新版本的區別:
- git diff HEAD -- [filename]
移除文件:
有時候需要先從暫存區移除某文件,然后提交更新本地倉庫。移除命令如下:
- git rm [filename]
對文件重命名:
- git mv README.*** README
- (這個命令相當于 mv README.*** README、git rm README.***、git add README 這三條命令的集合)
(這個命令相當于 mv README.*** README、git rm README.***、git add README 這三條命令的集合)
查看提交歷史:
在提交了若干更新,又或者克隆了某個項目之后,也許想回顧下提交歷史。完成這個任務最簡單而又有效的工具是 git log 命令。git log 會按提交時間列出所有的更新,最近的更新排在最上面。加上--pretty=oneline后輸出的信息就不會那么多。
- $ git log
- commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
- Author: Michael Liao <askxuefeng@gmail.com>
- Date: Fri May 18 21:06:15 2018 +0800
- append GPL
- commit e475afc93c209a690c39c13a46716e8fa000c366
- Author: Michael Liao <askxuefeng@gmail.com>
- Date: Fri May 18 21:03:36 2018 +0800
- add distributed
- commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
- Author: Michael Liao <askxuefeng@gmail.com>
- Date: Fri May 18 20:59:18 2018 +0800
- wrote a readme file
- $ git log --pretty=oneline
- 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
- e475afc93c209a690c39c13a46716e8fa000c366 add distributed
- eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
版本回退:
- git reset --hard HEAD^ 回退到上一版本
- git reset --hard HEAD^^ 回退到上上版本
- git reset --hard HEAD~100 回退到前100個版本
- git reset --hard [版本號] 回退到固定版本號
- git reflog 記錄每一次的命令(可以查看版本號)
推送本地的改動到遠程倉庫,使本地倉庫和遠程倉庫一致
如果還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:
- ·git remote add origin <url>
如果已經關聯了遠程倉庫,可以使用下述命令看一下遠程倉庫是哪個:
- git remote -v
然后將本地的改動提交到遠程倉庫:
- git push origin [分支]
如此你就能夠將你的改動推送到所添加的服務器上去了。
分支管理
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是“默認的”分支。在其他分支上進行開發,完成后再將它們合并到主分支上。我們通常在開發新功能、修復一個緊急 bug 等時候會選擇創建分支。單分支開發好還是多分支開發好,還是要看具體場景來說。
一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。
- 創建一個分支dev
- git branch dev
- git branch 后面不加分支的名字就是查看當前的分支
- 切換當前分支到 dev
- git checkout dev
- 創建并切換分支
- git checkout -b dev (兩條命令的合寫)
- 切換到主分支
- git checkout master
- 合并dev分支到master(可能會有沖突)
- git merge dev
那沖突該怎么解決呢?
首先通過git status命令查看一下沖突的文件,然后使用cat [文件名]查看該文件內是那幾行的代碼出現了沖突,git是用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,其中<<
- 把剛新建的分支刪掉
- git branch -d dev
- 將分支推送到遠端倉庫(推送成功后其他人可見):
- git push origin [分支名]
這里可能會存在push失敗的情況,那很可能就是因為你的另一個小伙伴和你修改了同一個文件的代碼并且他push完成了,而你本次push的文件與遠程倉庫中現有的該文件產生了沖突,那需要先pull一下,再push:
- git pull
- ps: 如果失敗了,根據提示,執行 git pull --set-upstream-to=origin/<branch> <branch>
- 就是說讓你指定本地分支和遠程分支的鏈接