(一)git的一些名詞介紹:
- Workspace(工作區(qū)):程序員進(jìn)行開發(fā)改動的地方,平常我們開發(fā)就是拷貝遠(yuǎn)程倉庫中的一個分支,基于該分支進(jìn)行開發(fā)。在開發(fā)過程中就是對工作區(qū)的操作。
- Index / Stage(暫存區(qū)):暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中,哪些內(nèi)容是被git管理的。通過
git add添加文件的相關(guān)信息(文件名、大小、timestamp...),可以使用git status查看暫存區(qū)的狀態(tài) - Repository(倉庫區(qū)或本地倉庫):
git commit后同步index的目錄樹到本地倉庫,保存了對象被提交 過的各個版本,比起工作區(qū)和暫存區(qū)的內(nèi)容,它要更舊一些 - Remote(遠(yuǎn)程倉庫):遠(yuǎn)程倉庫的內(nèi)容可能被分布在多個地點的處于協(xié)作關(guān)系的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內(nèi)容是最舊的。
(二)git命令:
1.git pull和git pull --rebase的區(qū)別
使用下面的關(guān)系區(qū)別這兩個操作:
-
git pull=git fetch+git merge -
git pull --rebase=git fetch+git rebase
git merge操作會生成一個新的節(jié)點,之前的提交分開顯示。而git rebase操作不會生成新的節(jié)點,是將兩個分支融合成一個線性的提交。PS.如果你想要一個干凈的,沒有merge commit的線性歷史樹,那么你應(yīng)該選擇git rebase
如果你想保留完整的歷史記錄,并且想要避免重寫commit history的風(fēng)險,你應(yīng)該選擇使用git merge
2.git rebase和git merge的區(qū)別
-
marge特點:自動創(chuàng)建一個新的commit如果合并的時候遇到?jīng)_突,僅需要修改后重新commit- 優(yōu)點:記錄了真實的
commit情況,包括每個分支的詳情 - 缺點:因為每次merge會自動產(chǎn)生一個
merge commit,所以在使用一些git 的GUI tools,特別是commit比較頻繁時,看到分支很雜亂
- 優(yōu)點:記錄了真實的
-
rebase特點:會合并之前的commit歷史- 優(yōu)點:得到更簡潔的項目歷史,去掉了
merge commit - 缺點:如果合并出現(xiàn)代碼問題不容易定位,因為re-write了history
- 優(yōu)點:得到更簡潔的項目歷史,去掉了
參考鏈接:git rebase 和 git merge 的區(qū)別
3.git revert和git reset區(qū)別
-
git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。 -
git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應(yīng)該還會被引入,產(chǎn)生很多沖突。
3. git提交命令操作
正常操作流程:
git add .git commit -m '備注'git pull --rebase- 沒有沖突的話,直接
git push,提交完成 - 有沖突的話,解決沖突,然后
git add .git rebase --continue-
git log查看是否拉下來代碼 - 最后
git push
分支操作:
- 1.在本地dev上
git pull - 2.
git checkout -b fenzhi創(chuàng)建分支 - 3.然后在本地寫完代碼后,
git add . - 4.
git commit -m 'update' - 5.然后切換到dev分支上
git checkout dev - 6.然后拉取新代碼
git pull - 7.合并本地分支
git merge fenzhi - 8.沒有沖突的話,直接
git push提交完成 - 9.有沖突的話,修改沖突,然后
git add .
git commit --amend #(增補提交,會使用與當(dāng)前提交節(jié)點相同的父節(jié)點進(jìn)行一次新的提交,舊的提交將會被取消。)
git push
暫存操作:
reset的內(nèi)容還需要,比如測試時可以重復(fù)用一個commit(之前提交的內(nèi)容再reset再提交):
git reset --soft ef1739b2fe2e3598ad78232fc5bd5662888cbd00
Git add .(看有沒有修改內(nèi)容)
Git commit
Git push -f
之前提交的內(nèi)容不需要了,回退到某個節(jié)點:
Git reset —hard commited
Git push -f
stash具體操作:
Git add .
Git stash #儲藏(stash)工作區(qū)相對暫存區(qū)更改的文件
Git rebase branch
Git stash pop
Git add .
Git commit
Git push
Git add .
Git stash
Git rebase branch
有沖突——git add .
Git commit
Git push
其他操作:
git checkout . #不需要的代碼舍棄
git rebase --abort #(rebase進(jìn)程中有問題時,可以中斷進(jìn)程,回到拉取代碼前的狀態(tài))
git checkout -D 'fenzhi' #刪除分支
git config --global credential.helper store #在項目進(jìn)行過程中,可以通過 git 配置來記住密碼
git rebase -i HEAD~3 //倒推三個commit
git reset commitID --soft/hard //git回退
git describe 命令顯示離當(dāng)前提交最近的標(biāo)簽(可查看[git describe](https://www.yiibai.com/git/git_describe.html)命令)
4.遠(yuǎn)程倉庫:
#列出所有的遠(yuǎn)程倉庫
$ git remote -v
origin /Users/nferzhuang/test/server/a.git (fetch)
origin /Users/nferzhuang/test/server/a.git (push)
#列出遠(yuǎn)程倉庫 origin 的詳細(xì)信息
git remote show origin
#添加遠(yuǎn)程倉庫并命名為 origin
git remote add origin <git-repo>
#修改遠(yuǎn)程倉庫的地址
git remote set-url origin <git-repo>
如果你使用不到配置不同的fetch和push,則在使用git remote的時候不加-v參數(shù)
參考鏈接:關(guān)于git的一些相關(guān)remote操作
5.git配置
-
husky:git命令hook專用配置 -
lint-staged: 可以定制在特定的git階段執(zhí)行特定的命令
-
Lint-staged幫助你在暫存文件的時候能夠讓錯誤格式代碼不會提交到你分支
為什么使用
Lint-staged?
- 因為提交代碼前的檢查是最后一個管控代碼質(zhì)量的一個環(huán)節(jié),所以在提交代碼之前進(jìn)行
lint檢查意義重大。這樣可以確保沒有錯誤的語法和代碼樣式被提交到倉庫上。但是在整個項目上執(zhí)行Lint進(jìn)程會很低效,所以最好的做法就是檢查那個被改動的文件。而Lint-staged就是做這個的。 - 根據(jù)上面我們提供的生態(tài)圈依賴包,在
package.json中配置該字段:
"lint-staged": {
"**/*.{tsx,ts}": [ // 這里的文件后綴可以修改成自己需要的文件后綴
"prettier-eslint --write",
"git add"
]
}
- 與
Husky結(jié)合使用
為了讓
lint-staged可以在change被staged之前執(zhí)行,我們這時候需要借助git的鉤子功能,而提供鉤子功能的社區(qū)解決方案就是husky,該工具提供了git在多個階段前執(zhí)行的操作,比如我們這次要在預(yù)提交的時候進(jìn)行Lint檢查,配置如下:
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
}
(三)git拓展
1..gitignore文件中是上傳文件時即使有修改也默認(rèn)不上傳的文件
#添加本項目的忽略文件
vim .gitignore
#添加本項目的忽略文件并不把此文件納入版本管理
vim .git/info/exclude
文件中的內(nèi)容:
ad.DS_Store
node_modules/
dist/
npm-debug.log
yarn-error.log
.idea
.DS_Store
output
dist.zi
2.可以在本地建立一個全局的git=>commit的template文件,這樣在每次git commit時都沿用同一個前綴,用作區(qū)分提交是 研發(fā)還是修改bug,不用每次都看git commit -m '備注' 備注中的內(nèi)容
3.git命令大全:Git Cheat Sheet (包含git的一些有用的小技巧)
git remote -v //列出所有的遠(yuǎn)程倉庫
git stash //儲藏(stash)工作區(qū)相對暫存區(qū)更改的文件
git stash apply //恢復(fù)最后一次儲藏的文件
git remote remove <遠(yuǎn)程地址> //刪除遠(yuǎn)程倉庫
4. ShellJS
5. minimist輕量級的命令行參數(shù)解析引擎
(四)ssh配置
參考鏈接:
最常見的 Git 問題和操作清單匯總
ssh-keygen
1.檢查電腦是否已經(jīng)有 SSH key
$ cd ~/.ssh
$ ls
id_rsa #私鑰
id_rsa.pub #公鑰
known_hosts
2.如果沒有那就開始生成,設(shè)置全局的user.name與user.email
git config --list # 查看是否設(shè)置了user.name與user.email,沒有的話,去設(shè)置
#設(shè)置全局的user.name與user.email
git config --global user.name "XX"
git config --global user.email "XX"
3.創(chuàng)建一個 SSH key
輸入ssh-keygen(或ssh-keygen -t rsa -C "email")
$ ssh-keygen #用來生成ssh公鑰認(rèn)證所需的公鑰和私鑰文件。
#ssh秘鑰登錄特點:1.安全;2.免輸密碼。
#對于安全級別較高的服務(wù)器,建議配好ssh登錄后禁掉密碼登錄。
#缺點:略繁瑣。如果你的只是臨時登錄一次,那么還是密碼吧。
$ ssh-keygen -t rsa -b 1024 -f yourkeyname -C "備注"
# -t rsa:采用rsa加密方式,t=type
# -b :采用長度1024bit的密鑰對,b=bits,最長4096,不過沒啥必要
# -f :生成文件名,f=output_keyfiles
#-C :備注,C=comment
#更多參數(shù)可運行 man ssh-keygen
4.生成之后獲取公鑰內(nèi)容,輸入cat ~/.ssh/id_rsa.pub 即可, 復(fù)制ssh-rsa 一直到 .local這一整段內(nèi)容
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@agadorlaptop.local
- 打開 GitLab 或者 GitHub,點擊頭像,找到設(shè)置頁
- 左側(cè)找到 SSH keys 按鈕并點擊,輸入剛剛復(fù)制的公鑰即可
(五) git網(wǎng)站:
- git - 簡易指南
- 在線git練習(xí):learnGit
本文參考的文章鏈接:
一篇文章,教你學(xué)會Git
一些 實用的 git 小技巧