前言
lucifer先後在兩間企業進行嵌入式軟件方面的開發和維護,他們軟件的版本控制都是用svn,每次關鍵時刻你想查看某份軟件的更新日記時,打開log的加載速度實在不敢恭維。後來打聽幾位就業於其他企業的同學用的版本控制軟件時,做android或裸框架的linux項目軟件的版本維護均爲git,然後我就參考廖雪峯的git教程(網址在本文末)產出此篇學習筆記。
第一章 git安裝和創建版本庫
1. 安裝git
從網絡下載和安裝:
sudo apt-get install git
設置將來所有倉庫的個人信息:
$ git config --global user.name "name"
$ git config --global user.email "[email protected]"
2. 創建版本庫
初始化當前目錄作爲倉庫:
git init
指定文件納入倉庫的管理:
$ git add <file>
$ git commit -m "xxx"
- 移除git對文件的版本管控:
git rm <file>
- 加入暫存區操作的擴展:
- 暫存所有變化:
git add -A
- 暫存修改(modified)和被刪除(deleted)文件,不包括新文件(new):
git add -u
- 暫存新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件:
git add .
第二章 時光機穿梭
查看倉庫狀態:
git status
查看文件差異的內容:
git diff <HEAD -- file>
(忽略文件權限差異:git config core.filemode false
)查看提交的記錄:
git log <--pretty=oneline>
查看被管控的文件:
git ls-files
相對當前版本進行回退:
git reset --hard HEAD^
注:“^”的個數表示向後回退版本的個數
切換到任意版本:
git reset --hard <commit-id>
查看版本變更歷史:
git reflog
重要概念:工作區,版本庫=暫存區+分支
理解Git是如何跟蹤修改的,每次修改,如果不add到暫存區,那就不會加入到commit中。
- 撤銷文件的更改:
- ① 暫存區中的修改內容回退到工作區:
git reset HEAD <file>
- ② 丟棄工作區的修改(實爲覆蓋目標文件):
git checkout -- <file>
;丟棄所有:git checkout .
(除新增文件外) - 生成補丁和打補丁:
- ① 目標版本工程文件夾內生成補丁:
git diff <老版本commit-id> <新版本commit-id> > xxx.patch
;若兩個版本間差異存在二進制文件,如添加了bmp圖片時,git diff <old-id> <new-id> --binary > xxx.patch
- ② 老版本工程文件夾內打補丁:
git apply xxx.patch
第三章 遠程倉庫
- 將github作爲遠程庫:
- ① 創建SSH key:
ssh-keygen -t rsa -C "[email protected]"
- ② 登錄github,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容.
1. 添加遠程庫
- 將本地庫關聯遠程倉庫:
$ git remote add origin git@github.com:<用戶名>/<倉庫名>.git
| |
本地庫給遠程庫起名 在github上創建時填的倉庫名
刪除與遠程庫的關聯:
git remote rm origin
第一次往遠程庫推送:
$ git push -u origin master
|
本地庫主分支默認名
- 後續推送更新到遠程庫:
git push origin <branch>
2. 從遠程庫克隆到本地
- 項目從零開始時:
- ① 創建遠程庫;
- ② 克隆到本地:
git clone <addr>
。
ssh協議克隆github的倉庫:
$ git clone git@github.com:<用戶名>/<倉庫名>.git
Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。
第四章 分支管理
1. 創建與合併分支:
查看分支:
git branch
創建分支:
git branch <name>
切換分支:
git checkout <name>
創建+切換分支:
git checkout -b <name>
合併某分支到當前分支:
git merge <name>
刪除分支:
git branch -d <name>
注:HEAD指向的是當前分支,master是主分支的默認名
2. 解決分支衝突
不同分支修改同一位置時,“快速合併”會產生衝突,在衝突位置會有指示。解決衝突後,再提交,合併完成。
顯示分支合併圖:
$ git log --graph --pretty=oneline --abbrev-commit
| |
簡化顯示 commit的SHA1只顯示7位
3. 分支管理策略
a. 禁用Fast forward合併分支
git merge <name>
會用fast forward模式,刪除分支後,會丟掉分支信息。強制禁用Fast forward模式,git就會在merge時生成一個新的commit,分支歷史上可以看出分支信息。
禁用fast forward模式的合併:
$ git merge --no-ff -m "xxx" <brach name>
b. 分支管理
master分支應該是非常穩定的,僅用來發布新版本,平時不能在上面幹活;
一般在dev分支幹活,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;
每個人都在dev分支上幹活,每個人都有自己的分支,特定時候再往dev分支合併自己的更新。
4. bug分支
① 修復bug時,創建新的bug分支進行修復,然後合併,最後刪除;
②保存工作現場(未commit的更改):
$ git stash
③查看已經保存的工作現場:
$ git stash list
④恢復工作現場:
第一種 先恢復,再刪掉:
$ git stash apply stash@{n}
$ git stash drop stash@{n}
第二種 恢復+刪除:
$ git stash pop
5. 強行刪除分支
開發一個新feature,最好新建一個分支;
丟棄一個沒有被合併過的分支,強行刪除:
$ git branch -D <name>
6. 多人協作
a. 推送分支
$ git push origin <branch-name>
master分支:主分支,時刻與遠程同步;
dev分支:開發分支,團隊所有成員都需要在上面工作,也需要與遠程同步;
bug分支:只用於在本地修復bug,就沒必要推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
feature分支:是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。
b. 抓取分支
① 從遠程庫克隆下來;
② 在本地只能看到master
分支,需在遠程庫的其它分支工作時,創建遠程origin/dev
分支到本地:
$ git checkout -b <branch> origin/<branch>
③提交更新給本地庫,推送到遠程庫。
c. 合併遠程庫的更新到本地
查看遠程庫信息:
git remote -v
建立本地分支和遠程分支的關聯:
git branch --set-upstream <branch-name> origin/<branch-name>
合併遠程庫關聯的分支下來:
git pull origin <branch-name>
注:如果合併有衝突,則解決衝突,並在本地提交;再推送成功。
第五章 標籤管理
1. 創建標籤
查看所有標籤:
git tag
給HEAD貼標籤:
git tag <tagname>
對特定commit id貼標籤,並附帶信息:
git tag -a <tagname> -m "xxx..." <commit-id>
用PGP簽名貼標籤:
git tag -s <tagname> -m "xxx..." <commit-id>
通過標籤看commit內容:
git show <tagname>
2. 操作標籤
推送本地標籤到遠程庫:
git push origin <tagname>
推送所有標籤:
git push origin --tags
刪除本地標籤:
git tag -d <tagname>
刪除遠程庫的標籤:①先刪除本地標籤;②
git push origin :refs/tags/<tagname>
第六章 使用gitHub
山寨別人的倉庫到自己用戶裏:
Fork
給作者發送修改請求:
New pull request
第七章 自定義git
- 配置git交互的內容具有顏色:
$ git config --global color.ui true
1. 忽略特殊文件
① 在Git工作區的根目錄下創建一個特殊的.gitignore
文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。現成的配置文件:https://github.com/github/gitignore
② 把.gitignore
文件也提交到git。
注:強制添加一個已經寫入配置文件的文件:
git add -f <file-name>