Git初階:入門(mén)&常用命令
- 講師:×××
課程內(nèi)容:
- 介紹版本控制以及Git
- Git基本概念以及工作流
- Git部分常見(jiàn)問(wèn)題
- Git常用命令
- Git開(kāi)發(fā)示例
1 / 版本控制以及Git
git:分布式版本控制系統(tǒng)遥巴,進(jìn)行版本控制

每個(gè)版本存儲(chǔ)完整的文件快照
如SVN厢漩,存儲(chǔ)每個(gè)文件的變化疫铜,效率低
- Git保存的是快照岖研,SVN保存的是文件的變化.
- Git幾乎所有的操作都可以在本地完成,SVN需要與服務(wù)器通訊以獲得其他版本的文件.
- Git對(duì)文件內(nèi)容使用SHA-1 hash生成提交版本號(hào),可以保證文件內(nèi)容的完整性,而SVN使用遞增的編號(hào)作為版本號(hào).
2 / Git工作流
GIT的三種狀態(tài)
- 已修改(modified) → 工作區(qū)
↓ add ↓ - 已暫存(staged) → 暫存區(qū)
↓ commit ↓ - 已提交(commited) → 本地倉(cāng)庫(kù)
fetch↑↓push
遠(yuǎn)程倉(cāng)庫(kù)
GIT的三個(gè)區(qū)域

一般開(kāi)發(fā)流程
- 創(chuàng)建倉(cāng)庫(kù)/從遠(yuǎn)程倉(cāng)庫(kù)克隆
- 創(chuàng)建并切換到特性分支
- 創(chuàng)建/修改文件
- 提交工作區(qū)文件到暫存區(qū)
- 提交暫存區(qū)文件到本地倉(cāng)庫(kù)
- 切換到主干分支
- 合并特性分支到主干分支
- 推送本地倉(cāng)庫(kù)到遠(yuǎn)程倉(cāng)庫(kù)
git開(kāi)發(fā)示例
git clone git@github.com:wanlonghub/FirstProject.git 克隆遠(yuǎn)程代碼庫(kù)
git branch 查看當(dāng)前分支
git checkouyt -b dev3 新建并切換到dev3分支
vim newfile 新建文件
git status 查看文件狀態(tài)
git add newfile 增加文件到暫存區(qū)
git commit -m "new files" 將文件由暫存區(qū)增加到本地倉(cāng)庫(kù)
git push -u origin dev3 將本地分之推送到遠(yuǎn)程服務(wù)器
git diff 查看不同分支的區(qū)別
git merge origin master 合并分支
gitlab開(kāi)發(fā)示例
推送過(guò)程免密碼:由http連接方式切換到SSH鏈接方式,增加SSH-KEY者春,即增加本地ssh公鑰到gitlab中。
ssh-keygen
gitignore:忽略提交文件
如果有一些文件/目錄不想提交到git羡榴,可以通過(guò)編輯.gitignore文件進(jìn)行設(shè)置碧查。
例如:不提交 logs下的所有文件/目錄
vim .gitignore
編輯:忽略下列文件
# kdiff3 ignore
*.orig
# maven ignore
target/
# eclipse ignore
.settings/
.project
.classpath
# idea ignore
.idea/
*.ipr
*.iml
*.iws
# temp ignore
*.log
*.cache
*.diff
*.patch
*.tmp
3 / Git常用命令
init
clone
remote
status
log
reflog
config
add
commit
fetch
pull
push
rm
stash
branch
checkout
merge
diff
reset
revert
rebase
cherry-pickinit
創(chuàng)建一個(gè)空的本地倉(cāng)庫(kù)或者重新初始化一個(gè)已經(jīng)存在的倉(cāng)庫(kù);會(huì)生成一些默認(rèn)文件校仑。clone
克隆遠(yuǎn)程倉(cāng)庫(kù)到本地目錄忠售。克隆到本地倉(cāng)庫(kù)的分支名默認(rèn)為origin迄沫。
-
remote
管理相關(guān)的遠(yuǎn)程倉(cāng)庫(kù)。push/pull都和這個(gè)遠(yuǎn)程倉(cāng)庫(kù)相關(guān)羊瘩。git remote add origin <項(xiàng)目地址> 將本地項(xiàng)目與遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián) git remote 查看已經(jīng)關(guān)聯(lián)的遠(yuǎn)程倉(cāng)庫(kù) git remote -v 查看已經(jīng)關(guān)聯(lián)的遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息 git remote --help 查看幫助文檔 比如查看到:git remote rename <old> <new> git remote origin origin2 將origin重命名為origin2
**status **
顯示工作區(qū)域的狀態(tài)
- **log **
(只)記錄提交日志泰佳,查看分支的提交歷史盼砍;同時(shí)存在本地和遠(yuǎn)程倉(cāng)庫(kù)
- **reflog **
記錄所有(是所有的)分支的所有操作,只存在于本地倉(cāng)庫(kù)逝她;在不同的分支下執(zhí)行浇坐,看到的是不同分支下的操作日志。
-
config
修改Git配置信息
git config --add user.name "zhang3" 增加用戶(hù)名
git config --add user.email "zhang3@163.com" 增加用戶(hù)郵箱
git config -e 查看配置信息
help的例子
通過(guò) git config --help查閱到:
可以看到:
命令參數(shù) --remove-section
格式:git config [--local|--global|--system] --remove-section section
使用這個(gè)命令黔宛,不僅可以刪除一個(gè)沒(méi)有內(nèi)容的section近刘,而且即使該section下面有內(nèi)容,也會(huì)一起刪除掉
比如我們來(lái)刪除這樣一個(gè)配置:
首先增加一個(gè)配置 dog
git config --local dog.name "dog1"
git config --local dog.email "dog1.email"
git config -e 查看是否添加完成
執(zhí)行:
git config --local --remove-section dog
發(fā)現(xiàn)成功移除臀晃。
**add **
工作區(qū)提交到暫存區(qū)**commit **
暫存區(qū)提交到本地倉(cāng)庫(kù)**fetch **
拉取遠(yuǎn)程倉(cāng)庫(kù)到本地倉(cāng)庫(kù)觉渴,見(jiàn)pull。**merge **
合并分支徽惋,見(jiàn)pull案淋。
用git merge處理沖突
沖突:不同倉(cāng)庫(kù)向遠(yuǎn)程倉(cāng)庫(kù)push代碼,一些被同時(shí)修改的文件將產(chǎn)生沖突:選哪個(gè)合并到遠(yuǎn)程分支险绘?
此時(shí)git提示pull踢京,pull后提示沖突,自動(dòng)合并失敗隆圆。
git merge遇到?jīng)_突可以怎么做:
(1) 修改沖突再提交
(2) git merge --abort取消沖突合并漱挚,回到合并前的狀態(tài)
(3) git status查看工作區(qū)狀態(tài),根據(jù)提示一步一步來(lái)
vim沖突文件:
采用一方的,再push蹬屹,
-
**pull **
拉取遠(yuǎn)程倉(cāng)庫(kù)到本地倉(cāng)庫(kù)并合并到本地分支(git fetch + git merge侣背,兩個(gè)命令的組合)使用fectch:將遠(yuǎn)程的branch2分支拉取到本地origin/branch2分支,但不會(huì)影響本地branch2
分支慨默;使用merge:講本地origin/branch2分支合并到本地branch2分支贩耐;
使用pull:相當(dāng)于先執(zhí)行fectch,在執(zhí)行merge厦取。
- **push **
將本地倉(cāng)庫(kù)的內(nèi)容推送到遠(yuǎn)程倉(cāng)庫(kù)
如果本地分支與遠(yuǎn)程分支不對(duì)應(yīng)潮太,git并不知道要將本地分支推送到遠(yuǎn)程的哪一個(gè)分支上,因此通過(guò)下面的命令建立本地分支與遠(yuǎn)程分支之間的關(guān)系虾攻,將二者綁定铡买,從而每次推送時(shí)都有一個(gè)對(duì)應(yīng)關(guān)系。
將本地branch2分支設(shè)置為追蹤來(lái)自遠(yuǎn)程分支origin的分支霎箍,本地分支branch2與遠(yuǎn)程分支origin建立起了綁定關(guān)系
git push -u origin branch2
- **rm **
- stash
-
branch
管理分支git branch 列出當(dāng)前分支 git branch <分支名> 新建分支 git branch -d <分支名> 刪除分支 git branch -v 查看分支詳細(xì)信息
**checkout **
切換分支或還原文件
git checkout <分支名> 切換分支
git checkout -b <分支名> 創(chuàng)建分支并切換
還原文件
(1)還原成暫存區(qū)的內(nèi)容
git checkout -- <文件名>
(2)還原成某個(gè)版本的內(nèi)容
git checkout <版本號(hào)> <文件名>
(3)還原成前x次提交
HEAD:表示當(dāng)前提交
HEAD~:表示前一次提交
HEAD~x:表示前x次提交
git checkout HEAD~ <文件名> 還原成前一次提交
-
**diff **
顯示不同提交 / 不同工作區(qū)域 / 不同分支之間的差別不同工作區(qū)域之間: git diff 如果沒(méi)有顯示奇钞,表示沒(méi)有差別 git diff --cahcaed 對(duì)比暫存區(qū)和本地倉(cāng)庫(kù)之間的差異;如果沒(méi)有差異則也不會(huì)任何print 不同提交之間: git diff <log中的提交hash1> <log中的提交hash2> 例子: git log 查看提交日志
git diff 2d8629e3d589 2bd281970f1aef4
比較不同分支之間的差別
git diff master branch
-
**reset **
重置HEAD到指定的狀態(tài)git reset --mixed HEAD~ 將本地倉(cāng)庫(kù)上一個(gè)版本的內(nèi)容拷貝到暫存區(qū)景埃,而不修改工作區(qū)的內(nèi)容 git reset --hard HEAD~ 將本地倉(cāng)庫(kù)上一個(gè)版本的內(nèi)容拷貝到暫存區(qū)和工作區(qū)媒至;刪除不可逆,要謹(jǐn)慎操作 git reset --soft HEAD~ 將HEAD指向上一個(gè)提交
多選題:如何將當(dāng)前提交指向上一次提交谷徙,并僅僅覆蓋暫存區(qū)的內(nèi)容:
A. git reset --hard HEAD~
B. git reste HEAD~
C. git reset --mixed HEAD~
D. git reset --softed HEAD~
(BC)
-
**revert **
撤銷(xiāo)一些已經(jīng)存在的提交git revert <版本號(hào)> 拒啰,將被當(dāng)做一次單獨(dú)的提交
rebase
用于把一個(gè)分支的修改合并到當(dāng)前分支cherry-pick
用于把某次提交的內(nèi)容合并到當(dāng)前分支