-- blog:http://blog.csdn.net/flyingcys
--QQ:294102238
git是目前世界上使用最廣泛的分佈式版本控制系統,由大名鼎鼎的Linus花了兩週時間寫成,同時在2008年使用給git作爲唯一版本庫格式託管平臺gitHub網站上線,已有衆多知名開源項目遷移至github。
git是分佈式版本控制系統,與之對應的是集中式版本控制。分佈式和集中式最大的不同,分佈式並不是提取最新版本的文件快照,而是把代碼倉庫完整的克隆下來。每一次克隆操作都是對代碼倉庫的完整備份。所以,如果代碼倉庫的服務器發生故障,都可以用任何一個本地鏡像倉庫恢復,整個項目的歷史記錄都不會丟失。同時Git擁有完善的分支管理系統,可以指定與多個遠程代碼倉庫交互協作開發。
git已經成爲軟件開發者必須會的技能之一,正確熟練的使用git對團隊合作、提高工作效率都是有很大幫助的。很多公司包括硬件工程師都必須要熟練使用git,何況軟件工程師呢!
基於git的託管平臺除了github還有很多,國內免費也有很多,如碼雲中國(https://gitee.com);Coding(https://coding.net),國內的git平臺下載速度都比較快,也支持一定數量的免費私有項目。
同時git擁有GitHub for Desktop、Source Tree等衆多優秀且功能強大的圖形化客戶端工具。不過本篇主要講解git命令行操作,因爲只有在命令行模式下才能瞭解學習git的所有命令,這樣操作GUI工具也不會存在困難。同時我推薦在熟練使用git後可通過命令行與GUI配合使用的方式提高工作效率。
git項目分爲三個工作區域:工作目錄、暫存區域、本地倉庫及git倉庫。其中:
- Workspace:工作目錄,存放從git倉庫的壓縮數據庫中提取出來的文件,存放在本地磁盤上可修改。
- Index:暫存區域,存放的是一個文件,保存了下次將要提交的文件列表信息。
- Repository:本地倉庫,
- Remote:遠程倉庫,是Git用來保存項目的元數據和對象數據的地方。
git基本工作流程:
1. 在工作目錄中修改文件
2. 暫時文件,將文件的快照放入暫存區域。
3. 提交更新,找到暫時區域的文件,將快照永久性的存儲到git倉庫目錄
一、Git安裝與配置
1) 安裝:
Ubuntu系統默認沒有安裝Git,可通過sudo apt-get install git安裝。
Windows下有很多支持Git的圖形化工具,推薦安裝SourceTree。
2) git配置:
git的配置文件爲.gitconfig,它可以在用戶主目錄下,用於全局配置;也可以在項目的目錄下,用於項目配置。所有操作如果添加了--global就是對全局配置文件操作;不加--global同時在項目目錄下操作就是操作項目配置文件。
- 查看git配置信息:git config [--global] --list
- 編輯git配置文件:git config -e [--global]
- 修改git默認編輯器:git config [--global] core.editor vi
- 長期存儲密碼:git config [-- global] credential.helper store
- 查看所有賬戶git config --get-all user.name
- 設置用戶名:git config [--global] user.name
- 設置郵箱:git config [--global] user.email
二、基本操作
1. git init
初始化本地倉庫,在當前目錄下生成.git目錄,該目錄爲倉庫,而當前目錄爲工作空間。
2. 查看信息
- 查看本地文件夾所有修改的文件
git status
- 查看當前分支的版本歷史
git log
- 查看暫存區與工作區的差異
git diff
3. git add
- 添加指定文件到暫存區:
git add <file1> <file2> ...
- 添加指定目錄到暫存區:
git add <dir>
- 添加當前目錄下的所有文件:
git add .
4. git rm
- 刪除工作區文件,且將這次刪除放入暫存區
git rm <file1> <file2> ...
- 停止跟蹤指定文件,但該文件會保留在工作區
git rm --cached <file>
5. git commit
- 提交暫存區的文件到本地倉庫
git commit -m “commit log”
- 提交暫存區的指定文件到本地倉庫
git commit <file1> <file2> ... -m “commit log”
- 提交工作區自上次commit之後的變化至倉庫區,無需git add
git commit -a
- 提交時顯示所有修改信息
git commit -v
6. git clone
- 從遠程主機克隆一個版本庫,該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。
git clone <版本庫網站>
- 示例:git clone https://github.com/espressif/ESP8266_RTOS_SDK
- 如需指定不同的目錄名,可以將目錄名作爲git clone命令的第二個參數。
git clone <版本庫網址> <本地目錄名>
- 示例:git clone https://github.com/espressif/ESP8266_RTOS_SDK esp8266
- 在clone版本庫的時候,使用的遠程主機自動被命名爲origin,如需使用其他主機名需使用-o選項。
git clone -o <主機名> <版本庫地址>
- 示例:git clone -o esp https://github.com/espressif/ESP8266_RTOS_SDK
- 克隆指定分支:
git clone -b <分支名> <版本庫地址>
- 示例:git clone -b 1.4.x https://github.com/espressif/ESP8266_RTOS_SDK
- 如果git倉庫有子模塊,可通過克隆命令一次拉取全部子模塊。
git clone --recursive <版本庫地址>。
- 示例:ESP32的SDK內有很多第三方開源組件作爲子模塊,如果不拉取全部,將導致有些功能無法正常編譯。git clone --recursive https://github.com/espressif/esp-idf
7. git remote
git要求每個遠程主機都必須指定一個主機名,git remote命令就用於管理主機名。
- 列出已經存在的所有遠程主機:
git remote
- 查看遠程主機的網址:
git remote -v
- 示例:當前有1臺主機,主機名爲origin
git remote -v
origin https://github.com/espressif/ESP8266_RTOS_SDK (fetch)
origin https://github.com/espressif/ESP8266_RTOS_SDK (push)
- 添加遠程主機:
git remote add <主機名> <網址>
- 示例:git remote add origin https://github.com/espressif/ESP8266_RTOS_SDK
- 刪除遠程主機:
git remote rm <主機名>
- 示例:git remote rm origin
- 更改遠程主機名:
git remote rename
- 示例:git remote rename origin esp
8. git pull
git pull用於拉取遠程主機某個分支的更新,再與本地的指定分支合併。
l git push <遠程主機名> <本地分支名>:<本地分支名>
u 示例:拉取origin主機的dev分支,與本地的master分支合併。git pull origin dev:master。如遠程分支是與當前分支合併,則冒號後面的部分可以省略。
git會自動在本地分支與遠程分支之間建立一種追蹤關注。在git clone的時候,所有本地分支默認與遠程主機的同名分支建立追蹤關係,也就是本地的master分支自動追蹤origin/master分支。
l 如當前分支與遠程分支存在追蹤關係,可省略遠程分支名
示例:git pull origin
l 如當前分支只有一個追蹤分支,可省略遠程主機名
示例:git pull
9. git push
git push用於將本地分支更新,推送至遠程主機,操作與git pull類同。
l git push <遠程主機名> <本地分支名>:<遠程分支名>
l 如果當前分支與多個主機存在追蹤關係,可以使用-u選項指定一個默認主機,這樣後面就不需要加任何參數直接使用git push。git push -u origin master。將本地的master分支推送到origin主機,同事指定origin爲默認主機。
l 強制推送當前分支到遠程倉庫,即使有衝突;該指令要慎用。
git push <遠程主機名> --force
l 推送所有分支到遠程倉庫
git push <遠程主機名> --all
10. git branch
分支管理在git裏是很有用的的一個功能。
l 列出所有本地分支
git branch
l 列出所有遠程分支
git branch -r
l 列出所有本地和遠程分支
git branch -a
l 新建分支,但不切換至新建的分支
git branch <branch name>
l 新建分支,同時切換至新建的分支
git checkout -b <brach name>
l 拉取遠程分支並創建本地分支
git check -b <local branch name> origin/<remote branch name>
l 切換到指定分支
git checkout <branch name>
l 刪除分支
git branch -d <branch name>
l 強制刪除分支
git branch -D <branch name>
l 刪除遠程分支
git push --delete origin <branch name>
l 合併指定分支到當前分支
git merge <branch name>
11. 文件恢復、重置
分別使用git checkout 、git reset指令,使用這些操作後,很多修改的文件將被取消,需慎用。
l 恢復暫存區的指定文件到工作區
git checkout <file>
l 恢復指定commit的指定文件到工作區
git checkout <commit id> <file>
l 恢復暫存區的所有文件到工作區
git checkout .
l 重置暫存區的指定文件,與上一次commit保持一致,但工作區不變
git reset <commit id>
l 重置暫存區與工作區,與上一次commit保持一致
git reset --hard
1. git tag
l 列出所有tag
git tag
l 新建一個tag
git tag <tag name>
l 刪除本地tag
git tag -d <tag name>
l 刪除遠程tag
git push origin :refs/tags/<tag name>
l 查看tag信息
git show <tag name>
l 提交指定tag
git push origin <tag name>
l 提交所有tag
git push origin --tags
一、實戰流程:
1. 新建倉庫
1) 初始化本地倉庫:git init
2) 添加文件至暫存區:
l 添加指定文件:git add README.md
l 添加所有文件:git add .
3) 提交至本地倉庫:
git commit -m “first commit”
4) 添加遠程主機:
git remote add origin https://github.com/espressif/ESP8266_RTOS_SDK
5) 提交至遠程主機origin的master分支下:git push -u origin master,並建立跟蹤關係。以後提交更新可以直接使用git push。
2. 已存在倉庫
1) 克隆:git clone https://github.com/espressif/ESP8266_RTOS_SDK
2) 查看本地文件更新狀態:git status
3) 查看更新日誌:git log
4) 拉取更新:git pull