git教程
git簡介
git是一個(gè)開源的分布式版本控制系統(tǒng)禀梳,用于敏捷高效的處理任何大小的項(xiàng)目。
git工作流程相關(guān)概念
首先要理解git是如何工作的闭专,我們先要理解git工作區(qū)洒嗤,暫存區(qū)御板,版本庫的概念。
工作目錄:就是你在電腦里當(dāng)前工作的環(huán)境目錄虚吟。
暫存區(qū)域:英文叫stage, 或index寸认。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)稍味。
git倉庫:工作區(qū)有一個(gè)隱藏目錄.git废麻,這個(gè)不算工作區(qū),而是Git的版本庫模庐。
git工作流程
1.在工作目錄中修改文件烛愧。
2.暫存文件,將文件的快照放入暫存區(qū)域掂碱。
3.提交更新怜姿,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到git倉庫目錄疼燥。
這里針對(duì)的git操作分別為:git add fileName 或者git add *沧卢,這是git工作的第一步,將工作目錄中的變化添加到緩存區(qū),相當(dāng)于形成下一次將要提交的快照醉者。
然后通過git commit -m "cms框架搭建"完成第二步但狭,將文件的快照提交到暫存區(qū)域,也就是實(shí)際提交改動(dòng)撬即,此時(shí)你的結(jié)果已經(jīng)提交到head立磁,指向你最后一次提交的結(jié)果。
最后通過git push origin cms將暫存區(qū)的文件剥槐,更新到遠(yuǎn)程的git倉庫中唱歧。
git基本操作
1.查看遠(yuǎn)程分支
git branch -a
2.創(chuàng)建分支
git branch branchName.比如:創(chuàng)建cms分支,git branch cms
3.刪除分支(本地)
git branch -d branchName.比如:刪除cms分支粒竖,git branch -d cms
4.刪除分支(遠(yuǎn)程)
git push origin --delete branchName.比如:刪除遠(yuǎn)程cms分支, git push origin --delete branchName.
5.切換分支
git checkout branchName
6.合并分支到當(dāng)前分支
git merge branchName颅崩,比如把cms分支合并到當(dāng)前分支(加入為agent),那么一定要注意更新本地分支蕊苗。
7.回滾日志沿后,回退
git reset --hard commit_id ,注意:git reset --hard是回退到當(dāng)前最新版本號(hào)岁歉。
8.根據(jù)版本號(hào)創(chuàng)建tag
git tag -a tag name versionid -m comments
9.提交tag到遠(yuǎn)程庫
git push origin --tag
10.獲取遠(yuǎn)程tag
git fetch origin tag tagname
11.刪除遠(yuǎn)程tag
git push origin --delete tag tagname
12.查看日志
git log
13.暫存當(dāng)前工作
多人協(xié)作時(shí)得运,當(dāng)你正在agent分支上編輯某文件A膝蜈,但你需要切換到另一個(gè)分支上去,此時(shí)你本地正在編輯的文件又不想編輯熔掺,這個(gè)時(shí)候饱搏,如果是git checkout cms是無法實(shí)現(xiàn)分支切換的。這時(shí)置逻,你需要git stash來暫存當(dāng)前正在進(jìn)行的工作推沸。然后切換到cms分支修改bug,但是記得你在cms分支修改完bug之后券坞,切換到agent分支時(shí)鬓催,一定要記得git stash pop,取消暫存的區(qū)域恨锚,然后才能接著編輯文件A宇驾。
14.放棄當(dāng)前修改
git fetch origin
git reset --hard origin/master
創(chuàng)建代碼倉庫
git init 創(chuàng)建一個(gè)新的git倉庫,它用來將已存在但還沒有版本控制的項(xiàng)目轉(zhuǎn)換成一個(gè)git倉庫猴伶,或者創(chuàng)建一個(gè)新的git倉庫课舍。執(zhí)行了這個(gè)命令之后,會(huì)在當(dāng)前的目錄下增加一個(gè).git文件夾他挎,這就是你的git倉庫筝尾,才開始記錄項(xiàng)目版本情況了。
git clone giturl 克隆項(xiàng)目办桨。
git高級(jí)—子項(xiàng)目操作
1.使用場景
基于公司的項(xiàng)目會(huì)越來越多筹淫,常常需要提取一個(gè)公共的類庫提供給多個(gè)項(xiàng)目使用,但是這個(gè)library怎么和git在一起方便管理呢呢撞?
我們需要解決下面幾個(gè)問題:
- 如何在git項(xiàng)目中導(dǎo)入library庫?
- library庫在其他的項(xiàng)目中被修改了可以更新到遠(yuǎn)程的代碼庫中?
- 其他項(xiàng)目如何獲取到library庫最新的提交?
- 如何在clone的時(shí)候能夠自動(dòng)導(dǎo)入library庫?
解決以上問題损姜,可以考慮使用git的 Submodule來解決。
2.什么是Submodule殊霞?
git Submodule 是一個(gè)很好的多項(xiàng)目使用共同類庫的工具薛匪,他允許類庫項(xiàng)目做為repository,子項(xiàng)目做為一個(gè)單獨(dú)的git項(xiàng)目存在父項(xiàng)目中,子項(xiàng)目可以有自己的獨(dú)立的commit脓鹃,push,pull古沥。而父項(xiàng)目以Submodule的形式包含子項(xiàng)目瘸右,父項(xiàng)目可以指定子項(xiàng)目header,父項(xiàng)目中會(huì)的提交信息包含Submodule的信息岩齿,再clone父項(xiàng)目的時(shí)候可以把Submodule初始化太颤。
3.在項(xiàng)目中使用Submodule
使用git命令可以直接添加Submodule:
git submodule add <repo> <destpath>
git submodule add git@github.com:jjz/pod-library.git pod-library
使用 git status命令可以看到
git status
On branch master
Changes to be committed:
new file: .gitmodules
new file: pod-library
可以看到多了兩個(gè)需要提交的文件:.gitmodules和 pod-library
.gitmodules 內(nèi)容包含Submodule的主要信息,指定reposirory,指定路徑:
[submodule "pod-library"]
path = pod-library
url = git@github.com:jjz/pod-library.git
可以看到記錄了子項(xiàng)目的目錄和子項(xiàng)目的git地址信息盹沈。
pod-libray內(nèi)容只保護(hù)子項(xiàng)目的commit id龄章,就能指定到對(duì)于的git header上,例如:
Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5
4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5就是子項(xiàng)目的commit id吃谣,父項(xiàng)目的git并不會(huì)記錄Submodule的文件變動(dòng),它是按照commit git指定Submodule的git header做裙。
另外,這兩個(gè)文件都需要提交到父項(xiàng)目的git中岗憋。
還可以這樣使用命令添加Submodule
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
4.修改Submodule
首先需要確認(rèn)有對(duì)Submodule的commit權(quán)限。
進(jìn)入Submodule目錄里面:
cd pod-library/
修改其中的一個(gè)文件看下文件的可以用git status查看變動(dòng):
git status
modified: pod-library/UseAFHTTP.h
提交Submodule的更改內(nèi)容:
git commit -a -m'test submodule'
然后push 到遠(yuǎn)程服務(wù)器:
git push
然后再回到父目錄,提交Submodule在父項(xiàng)目中的變動(dòng):
cd ..
然后看一下父目錄有啥變化:
git status
modified: pod-library (new commits)
可以看到pod-library中已經(jīng)變更為Submodule最新的commit id:
Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
需要把Submodule的變動(dòng)信息推送到父項(xiàng)目的遠(yuǎn)程服務(wù)器:
git commit -m'update submodule'
git push
這樣就把子模塊的變更信息以及子模塊的變更信息提交到遠(yuǎn)程服務(wù)器了锚贱,從遠(yuǎn)程服務(wù)器上更新下來的內(nèi)容就是最新提交的內(nèi)容了仔戈。
總之一句話,提交的時(shí)候先提交到子項(xiàng)目拧廊,然后再提交到父項(xiàng)目中监徘。
5.更新Submodule
有兩種方式:一種是父目錄下直接更新,一種是先更新子目錄吧碾,再更新父目錄凰盔。
- 父目錄直接更新
git submodule foreach git pull - 子目錄下更新
>cd pod-library
git pull
>cd ..
git pull
可以看到在Submodule的目錄中,使用git和單獨(dú)的一個(gè)項(xiàng)目是一樣的,注意更新Submodule的時(shí)候如果有新的commit id產(chǎn)生,需要在父項(xiàng)目產(chǎn)生一個(gè)新的提交倦春,pod-libray文件中的 Subproject commit會(huì)變?yōu)樽钚碌腸ommit id户敬。
6.clone Submodule
clone Submodule有兩種方式 一種是采用遞歸的方式clone整個(gè)項(xiàng)目,一種是clone父項(xiàng)目溅漾,再更新子項(xiàng)目山叮。
- 采用遞歸參數(shù) --recursive
git clone git@github.com:jjz/pod-project.git --recursive
輸出結(jié)果:
loning into 'pod-project'...
remote: Counting objects: 57, done.
remote: Compressing objects: 100% (45/45), done.
remote: Total 57 (delta 13), reused 49 (delta 8), pack-reused 0
Receiving objects: 100% (57/57), 18.79 KiB | 0 bytes/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
Submodule 'pod-library' (git@github.com:jjz/pod-library.git) registered for path 'pod-library'
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
Resolving deltas: 100% (8/8), done.
Checking connectivity... done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c
可以看到init Submodule 會(huì)自動(dòng)被clone下來。
-
先clone父項(xiàng)目添履,再初始化子項(xiàng)目submodule
git clone git@github.com:jjz/pod-project.gitcd pod-project
初始化submodule
git submodule init
更新submodule
git submodule update
運(yùn)行結(jié)果:
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
Resolving deltas: 100% (8/8), done.
Checking connectivity... done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'
7.刪除Submodule
git 并不支持直接刪除Submodule,而是需要手動(dòng)刪除對(duì)應(yīng)的文件:
cd pod-projectgit rm --cached pod-library rm -rf pod-library rm .gitmodules 更改git的配置文件config: vim .git/config
可以看到Submodule的配置信息:
[submodule "pod-library"]
url = git@github.com:jjz/pod-library.git
刪除submodule相關(guān)的內(nèi)容,然后提交到遠(yuǎn)程服務(wù)器:
git commit -a -m 'remove pod-library submodule'