Git 流程圖
配置 Git:另外技術(shù)是不斷更新的。在此贈(zèng)送2020最新企業(yè)級(jí)別Vue3.0/Js/ES6/TS/React/node等實(shí)戰(zhàn)視頻教程,,想學(xué)的可進(jìn)裙 519293536 免費(fèi)獲取,,小白勿進(jìn)哦# 配置全局用戶 $ git config --global user.name "用戶名" $ git config --global user.email "git賬號(hào)" # 配置別名 $ git config --global alias.co checkout $ git config --global alias.ss status $ git config --global alias.cm commit $ git config --global alias.br branch $ git config --global alias.rg reflog # 這里只是美化 log 的輸出,實(shí)際使用時(shí)可以在 git lg 后面加命令參數(shù),,如: git lg -10 顯示最近10條提交 $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # 刪除全局配置 $ git config --global --unset alias.xxx $ git config --global --unset user.xxx復(fù)制代碼 查看 Git 信息# 查看系統(tǒng)配置 $ git config --list # 查看用戶配置 $ cat ~/.gitconfig # 查看當(dāng)前項(xiàng)目的 git 配置 $ cat .git/config # 查看暫存區(qū)的文件 $ git ls-files # 查看本地 git 命令歷史 $ git reflog # 查看所有 git 命令 $ git --help -a # 查看當(dāng)前 HEAD 指向 $ cat .git/HEAD # git 中 D 向下翻一行 F 向下翻頁(yè) B 向上翻頁(yè) Q 退出 # 查看提交歷史 $ git log --oneline --grep="關(guān)鍵字" --graph --all --author "username" --reverse -num -p --before= 1 day/1 week/1 "2019-06-06" --after= "2019-06-06" --stat --abbrev-commit --pretty=format:"xxx" # oneline -> 將日志記錄一行一行的顯示 # grep="關(guān)鍵字" -> 查找日志記錄中(commit提交時(shí)的注釋)與關(guān)鍵字有關(guān)的記錄 # graph -> 記錄圖形化顯示 ?。?! # all -> 將所有記錄都詳細(xì)的顯示出來(lái) # author "username" -> 查找這個(gè)作者提交的記錄 # reverse -> commit 提交記錄順序翻轉(zhuǎn) # before -> 查找規(guī)定的時(shí)間(如:1天/1周)之前的記錄 # num -> git log -10 顯示最近10次提交 ?。?! # stat -> 顯示每次更新的文件修改統(tǒng)計(jì)信息,,會(huì)列出具體文件列表 !??! # abbrev-commit -> 僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符 ?。,。?# pretty=format:"xxx" -> 可以定制要顯示的記錄格式 ?。,。?# p -> 顯示每次提交所引入的差異(按 補(bǔ)丁 的格式輸出)?。,。?fù)制代碼 git reflog
git log 點(diǎn)線圖
符號(hào)解釋: *表示一個(gè) commit |表示分支前進(jìn) /表示分叉 \表示合入 |/表示新分支復(fù)制代碼 Git 常用命令# 查看工作區(qū)和暫存區(qū)的狀態(tài) $ git status # 將工作區(qū)的文件提交到暫存區(qū) $ git add . # 提交到本地倉(cāng)庫(kù) $ git commit -m "本次提交說(shuō)明" # add和commit的合并,便捷寫法(未追蹤的文件無(wú)法直接提交到暫存區(qū)/本地倉(cāng)庫(kù)) $ git commit -am "本次提交說(shuō)明" # 將本地分支和遠(yuǎn)程分支進(jìn)行關(guān)聯(lián) $ git push -u origin branchName # 將本地倉(cāng)庫(kù)的文件推送到遠(yuǎn)程分支 $ git push # 拉取遠(yuǎn)程分支的代碼 $ git pull origin branchName # 合并分支 $ git merge branchName # 查看本地?fù)碛心男┓种?$ git branch # 查看所有分支(包括遠(yuǎn)程分支和本地分支) $ git branch -a # 切換分支 $ git checkout branchName # 臨時(shí)將工作區(qū)文件的修改保存至堆棧中 $ git stash # 將之前保存至堆棧中的文件取出來(lái) $ git stash pop復(fù)制代碼 Git 常用命令詳解add將工作區(qū)的文件添加到暫存區(qū) # 添加指定文件到暫存區(qū)(追蹤新增的指定文件) $ git add [file1] [file2] ... # 添加指定目錄到暫存區(qū),,包括子目錄 $ git add [dir] # 添加當(dāng)前目錄的所有文件到暫存區(qū)(追蹤所有新增的文件) $ git add . # 刪除工作區(qū)/暫存區(qū)的文件 $ git rm [file1] [file2] ... # 停止追蹤指定文件,,但該文件會(huì)保留在工作區(qū) $ git rm --cached [file] # 改名工作區(qū)/暫存區(qū)的文件 $ git mv [file-original] [file-renamed] # Git 2.0 以下版本 #只作用于文件的新增和修改 $ git add . #只作用于文件的修改和刪除 $ gti add -u #作用于文件的增刪改 $ git add -A # Git 2.0 版本 $ git add . 等價(jià)于 $ git add -A 復(fù)制代碼
status# 查看工作區(qū)和暫存區(qū)的狀態(tài) $ git status 復(fù)制代碼 commit# 將暫存區(qū)的文件提交到本地倉(cāng)庫(kù)并添加提交說(shuō)明 $ git commit -m "本次提交的說(shuō)明" # add 和 commit 的合并,,便捷寫法 # 和 git add -u 命令一樣,未跟蹤的文件是無(wú)法提交上去的 $ git commit -am "本次提交的說(shuō)明" # 跳過(guò)驗(yàn)證繼續(xù)提交 $ git commit --no-verify $ git commit -n # 編輯器會(huì)彈出上一次提交的信息,,可以在這里修改提交信息 $ git commit --amend # 修復(fù)提交,,同時(shí)修改提交信息 $ git commit --amend -m "本次提交的說(shuō)明" # 加入 --no-edit 標(biāo)記會(huì)修復(fù)提交但不修改提交信息,編輯器不會(huì)彈出上一次提交的信息 $ git commit --amend --no-edit復(fù)制代碼
push & pull
# 將本地倉(cāng)庫(kù)的文件推送到遠(yuǎn)程分支 # 如果遠(yuǎn)程倉(cāng)庫(kù)沒(méi)有這個(gè)分支,,會(huì)新建一個(gè)同名的遠(yuǎn)程分支 # 如果省略遠(yuǎn)程分支名,,則表示兩者同名 $ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名> $ git push origin branchname # 如果省略本地分支名,,則表示刪除指定的遠(yuǎn)程分支 # 因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支,。 $ git push origin :master # 等同于 $ git push origin --delete master # 建立當(dāng)前分支和遠(yuǎn)程分支的追蹤關(guān)系 $ git push -u origin master # 如果當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系 # 則可以省略分支和 -u $ git push # 不管是否存在對(duì)應(yīng)的遠(yuǎn)程分支,,將本地的所有分支都推送到遠(yuǎn)程主機(jī) $ git push --all origin # 拉取所有遠(yuǎn)程分支到本地鏡像倉(cāng)庫(kù)中 $ git pull # 拉取并合并項(xiàng)目其他人員的一個(gè)分支 $ git pull origin branchname # 等同于 fetch + merge $ git fetch origin branchName $ git merge origin/branchName # 如果遠(yuǎn)程主機(jī)的版本比本地版本更新,推送時(shí) Git 會(huì)報(bào)錯(cuò),,要求先在本地做 git pull 合并差異,, # 然后再推送到遠(yuǎn)程主機(jī)。這時(shí),,如果你一定要推送,,可以使用 –-force 選項(xiàng) # (盡量避免使用) $ git push --force origin | git push -f origin復(fù)制代碼 branch# 查看本地分支 $ git branch | git branch -l # 查看遠(yuǎn)程分支 $ git branch -r # 查看所有分支(本地分支+遠(yuǎn)程分支) $ git branch -a # 查看所有分支并帶上最新的提交信息 $ git branch -av # 查看本地分支對(duì)應(yīng)的遠(yuǎn)程分支 $ git branch -vv # 新建分支 # 在別的分支下新建一個(gè)分支,新分支會(huì)復(fù)制當(dāng)前分支的內(nèi)容 # 注意:如果當(dāng)前分支有修改,,但是沒(méi)有提交到倉(cāng)庫(kù),,此時(shí)修改的內(nèi)容是不會(huì)被復(fù)制到新分支的 $ git branch branchname # 切換分支(切換分支時(shí),本地工作區(qū),,倉(cāng)庫(kù)都會(huì)相應(yīng)切換到對(duì)應(yīng)分支的內(nèi)容) $ git checkout branchname # 創(chuàng)建一個(gè) aaa 分支,,并切換到該分支 (新建分支和切換分支的簡(jiǎn)寫) $ git checkout -b aaa # 可以看做是基于 master 分支創(chuàng)建一個(gè) aaa 分支,,并切換到該分支 $ git checkout -b aaa master # 新建一條空分支(詳情請(qǐng)看問(wèn)題列表) $ git checkout --orphan emptyBranchName $ git rm -rf . # 刪除本地分支,會(huì)阻止刪除包含未合并更改的分支 $ git brnach -d branchname # 強(qiáng)制刪除一個(gè)本地分支,,即使包含未合并更改的分支 $ git branch -D branchname # 刪除遠(yuǎn)程分支 # 推送一個(gè)空分支到遠(yuǎn)程分支,其實(shí)就相當(dāng)于刪除遠(yuǎn)程分支 $ git push origin :遠(yuǎn)程分支名 # 或者 $ git push origin --delete 遠(yuǎn)程分支名 # 修改當(dāng)前分支名 $ git branch -m branchname 復(fù)制代碼 merge 三種常用合并方法# 默認(rèn) fast-forward ,,HEAD 指針直接指向被合并的分支 $ git merge # 禁止快進(jìn)式合并 $ git merge --no-ff $ git merge --squash 復(fù)制代碼
rebasestash
使用場(chǎng)景: 當(dāng)你接到一個(gè)修復(fù)緊急 bug 的任務(wù)時(shí)候,,一般都是先創(chuàng)建一個(gè)新的 bug 分支來(lái)修復(fù)它,,然后合并,最后刪除。但是,,如果當(dāng)前你正在開(kāi)發(fā)功能中,,短時(shí)間還無(wú)法完成,無(wú)法直接提交到倉(cāng)庫(kù),,這時(shí)候可以先把當(dāng)前工作區(qū)的內(nèi)容 # 將所有未提交的修改(提交到暫存區(qū))保存至堆棧中 $ git stash # 給本次存儲(chǔ)加個(gè)備注,,以防時(shí)間久了忘了 $ git stash save "存儲(chǔ)" # 存儲(chǔ)未追蹤的文件 $ git stash -u # 查看存儲(chǔ)記錄 $ git stash list 在 Windows 上和 PowerShell 中,,需要加雙引號(hào) # 恢復(fù)后,stash 記錄并不刪除 $ git stash apply "stash@{index}" # 恢復(fù)的同時(shí)把 stash 記錄也刪了 $ git stash pop "stash@{index}" # 刪除 stash 記錄 $ git stash drop "stash@{index}" # 刪除所有存儲(chǔ)的進(jìn)度 $ git stash clear # 查看當(dāng)前記錄中修改了哪些文件 $ git stash show "stash@{index}" # 查看當(dāng)前記錄中修改了哪些文件的內(nèi)容 $ git stash show -p "stash@{index}" 復(fù)制代碼 diff# 查看工作區(qū)和暫存區(qū)單個(gè)文件的對(duì)比 $ git diff filename # 查看工作區(qū)和暫存區(qū)所有文件的對(duì)比 $ git diff # 查看工作區(qū)和暫存區(qū)所有文件的對(duì)比,,并顯示出所有有差異的文件列表 $ git diff --stat # 注意: # 1.你修改了某個(gè)文件,,但是沒(méi)有提交到暫存區(qū),這時(shí)候會(huì)有對(duì)比的內(nèi)容 # 一旦提交到暫存區(qū),,就不會(huì)有對(duì)比的內(nèi)容(因?yàn)闀捍鎱^(qū)已經(jīng)更新) # 2.如果你新建了一個(gè)文件,,但是沒(méi)有提交到暫存區(qū),這時(shí)候 diff 是沒(méi)有結(jié)果的 # 查看暫存區(qū)與上次提交到本地倉(cāng)庫(kù)的快照(即最新提交到本地倉(cāng)庫(kù)的快照)的對(duì)比 $ git diff --cached/--staged # 查看工作區(qū)與上次提交到本地倉(cāng)庫(kù)的快照(即最新提交到本地倉(cāng)庫(kù)的快照)的對(duì)比 $ git diff branchname # 查看工作區(qū)與 HEAD 指向(默認(rèn)當(dāng)前分支最新的提交)的對(duì)比 $ git diff HEAD # 查看兩個(gè)本地分支中某一個(gè)文件的對(duì)比 $ git diff branchname..branchname filename # 查看兩個(gè)本地分支所有的對(duì)比 $ git diff branchname..branchname # 查看遠(yuǎn)程分支和本地分支的對(duì)比 $ git diff origin/branchname..branchname # 查看遠(yuǎn)程分支和遠(yuǎn)程分支的對(duì)比 $ git diff origin/branchname..origin/branchname # 查看兩個(gè) commit 的對(duì)比 $ git diff commit1..commit2 復(fù)制代碼 remote# 查看所有遠(yuǎn)程主機(jī) $ git remote # 查看關(guān)聯(lián)的遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息 $ git remote -v # 刪除遠(yuǎn)程倉(cāng)庫(kù)的 “關(guān)聯(lián)” $ git remote rm projectname # 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)的 “關(guān)聯(lián)” $ git remote set-url origin <newurl>復(fù)制代碼 tag常用于發(fā)布版本 # 默認(rèn)在 HEAD 上創(chuàng)建一個(gè)標(biāo)簽 $ git tag v1.0 # 指定一個(gè) commit id 創(chuàng)建一個(gè)標(biāo)簽 $ git tag v0.9 f52c633 # 創(chuàng)建帶有說(shuō)明的標(biāo)簽,,用 -a 指定標(biāo)簽名,,-m 指定說(shuō)明文字 $ git tag -a v0.1 -m "version 0.1 released" # 查看所有標(biāo)簽 # 注意:標(biāo)簽不是按時(shí)間順序列出,而是按字母排序的,。 $ git tag # 查看單個(gè)標(biāo)簽具體信息 $ git show <tagname> # 推送一個(gè)本地標(biāo)簽 $ git push origin <tagname> # 推送全部未推送過(guò)的本地標(biāo)簽 $ git push origin --tags # 刪除本地標(biāo)簽 # 因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地,,不會(huì)自動(dòng)推送到遠(yuǎn)程。 # 所以,,打錯(cuò)的標(biāo)簽可以在本地安全刪除,。 $ git tag -d v0.1 # 刪除一個(gè)遠(yuǎn)程標(biāo)簽(先刪除本地 tag ,然后再刪除遠(yuǎn)程 tag) $ git push origin :refs/tags/<tagname>復(fù)制代碼 刪除文件# 刪除暫存區(qū)和工作區(qū)的文件 $ git rm filename # 只刪除暫存區(qū)的文件,,不會(huì)刪除工作區(qū)的文件 $ git rm --cached filename 復(fù)制代碼 如果在配置 .gitignore 文件之前就把某個(gè)文件上傳到遠(yuǎn)程倉(cāng)庫(kù)了,,這時(shí)候想把遠(yuǎn)程倉(cāng)庫(kù)中的該文件刪除,此時(shí)你配置 .gitignore 文件也沒(méi)有用,,因?yàn)樵撐募呀?jīng)被追蹤了,,但又不想在本地刪除該文件后再重新提交到遠(yuǎn)程倉(cāng)庫(kù),這時(shí)候可以使用 版本切換 & 重設(shè) & 撤銷
checkout 詳解# 恢復(fù)暫存區(qū)的指定文件到工作區(qū) $ git checkout <filename> # 恢復(fù)暫存區(qū)的所有文件到工作區(qū) $ git checkout . # 回滾到最近的一次提交 # 如果修改某些文件后,,沒(méi)有提交到暫存區(qū),此時(shí)的回滾是回滾到上一次提交 # 如果是已經(jīng)將修改的文件提交到倉(cāng)庫(kù)了,,這時(shí)再用這個(gè)命令回滾無(wú)效 # 因?yàn)榛貪L到的是之前自己修改后提交的版本 $ git checkout HEAD $ git checkout HEAD -- filename # 回滾到最近一次提交的上一個(gè)版本 $ git checkout HEAD^ # 回滾到最近一次提交的上2個(gè)版本 $ git checkout HEAD^^ # 切換分支,,在這里也可以看做是回到項(xiàng)目「當(dāng)前」?fàn)顟B(tài)的方式 $ git checkout <當(dāng)前你正在使用的分支> # 切換到某個(gè)指定的 commit 版本 $ git checkout <commit_id> # 切換指定 tag $ git checkout <tag>復(fù)制代碼
reset 詳解
# 從暫存區(qū)撤銷特定文件,但不改變工作區(qū),。它會(huì)取消這個(gè)文件的暫存,,而不覆蓋任何更改 $ git reset <fileName> # 重置暫存區(qū)最近的一次提交,但工作區(qū)的文件不變 $ git reset # 等價(jià)于 $ git reset HEAD (默認(rèn)) # 重置暫存區(qū)與工作區(qū),,回退到最近一次提交的版本內(nèi)容 $ git reset --hard # 重置暫存區(qū)與工作區(qū),,回退到最近一次提交的上一個(gè)版本 $ git reset --hard HEAD^ # 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),同時(shí)重置暫存區(qū),,但工作區(qū)不變 $ git reset <commit> # 等價(jià)于 $ git reset --mixed <commit> # 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),,但保持暫存區(qū)和工作區(qū)不變 $ git reset --soft <commit> # 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),同時(shí)重置暫存區(qū),、工作區(qū) $ git reset --hard <commit>復(fù)制代碼
我們可以用
revert 詳解# 生成一個(gè)撤銷最近的一次提交的新提交 $ git revert HEAD # 生成一個(gè)撤銷最近一次提交的上一次提交的新提交 $ git revert HEAD^ # 生成一個(gè)撤銷最近一次提交的上兩次提交的新提交 $ git revert HEAD^^ # 生成一個(gè)撤銷最近一次提交的上n次提交的新提交 $ git revert HEAD~num # 生成一個(gè)撤銷指定提交版本的新提交 $ git revert <commit_id> # 生成一個(gè)撤銷指定提交版本的新提交,執(zhí)行時(shí)不打開(kāi)默認(rèn)編輯器,,直接使用 Git 自動(dòng)生成的提交信息 $ git revert <commit_id> --no-edit復(fù)制代碼
撤銷(revert)應(yīng)該用在你想要在項(xiàng)目歷史中移除某個(gè)提交的時(shí)候,。比如說(shuō),你在追蹤一個(gè) bug,,然后你發(fā)現(xiàn)它是由一個(gè)提交造成的,,這時(shí)候撤銷就很有用。 撤銷(revert)被設(shè)計(jì)為撤銷公共提交的安全方式,,重設(shè)(reset)被設(shè)計(jì)為重設(shè)本地更改,。 因?yàn)閮蓚€(gè)命令的目的不同,它們的實(shí)現(xiàn)也不一樣:重設(shè)完全地移除了一堆更改,,而撤銷保留了原來(lái)的更改,,用一個(gè)新的提交來(lái)實(shí)現(xiàn)撤銷。千萬(wàn)不要用 發(fā)布一個(gè)提交之后,,你必須假設(shè)其他開(kāi)發(fā)者會(huì)依賴于它。移除一個(gè)其他團(tuán)隊(duì)成員在上面繼續(xù)開(kāi)發(fā)的提交在協(xié)作時(shí)會(huì)引發(fā)嚴(yán)重的問(wèn)題,。當(dāng)他們?cè)囍湍愕膫}(cāng)庫(kù)同步時(shí),,他們會(huì)發(fā)現(xiàn)項(xiàng)目歷史的一部分突然消失了。一旦你在重設(shè)之后又增加了新的提交,,Git 會(huì)認(rèn)為你的本地歷史已經(jīng)和 origin/master 分叉了,,同步你的倉(cāng)庫(kù)時(shí)的合并提交(merge commit)會(huì)使你的同事困惑。 cherry-pick將指定的提交 commit 應(yīng)用于當(dāng)前分支(可以用于恢復(fù)不小心撤銷(revert/reset)的提交) $ git cherry-pick <commit_id> $ git cherry-pick <commit_id> <commit_id> $ git cherry-pick <commit_id>^..<commit_id>復(fù)制代碼 git submodule 子模塊有種情況我們經(jīng)常會(huì)遇到:某個(gè)工作中的項(xiàng)目需要包含并使用另一個(gè)項(xiàng)目,。也許是第三方庫(kù),,或者你獨(dú)立開(kāi)發(fā)的,用于多個(gè)父項(xiàng)目的庫(kù),。 現(xiàn)在問(wèn)題來(lái)了:你想要把它們當(dāng)做兩個(gè)獨(dú)立的項(xiàng)目,,同時(shí)又想在一個(gè)項(xiàng)目中使用另一個(gè)。如果將另外一個(gè)項(xiàng)目中的代碼復(fù)制到自己的項(xiàng)目中,,那么你做的任何自定義修改都會(huì)使合并上游的改動(dòng)變得困難,。Git 通過(guò)子模塊來(lái)解決這個(gè)問(wèn)題,,允許你將一個(gè) Git 倉(cāng)庫(kù)作為另一個(gè) Git 倉(cāng)庫(kù)的子目錄,。 它能讓你將另一個(gè)倉(cāng)庫(kù)克隆到自己的項(xiàng)目中,同時(shí)還保持提交的獨(dú)立,。 # 在主項(xiàng)目中添加子項(xiàng)目,,URL 為子模塊的路徑,,path 為該子模塊存儲(chǔ)的目錄路徑 git submodule add [URL] [Path] # 克隆含有子項(xiàng)目的主項(xiàng)目 git clone [URL] # 當(dāng)你在克隆這樣的項(xiàng)目時(shí),默認(rèn)會(huì)包含該子項(xiàng)目的目錄,,但該目錄中還沒(méi)有任何文件 # 初始化本地配置文件 git submodule init # 從當(dāng)前項(xiàng)目中抓取所有數(shù)據(jù)并檢出父項(xiàng)目中列出的合適的提交 git submodule update # 等價(jià)于 git submodule init && git submodule update git submodule update --init # 自動(dòng)初始化并更新倉(cāng)庫(kù)中的每一個(gè)子模塊,, 包括可能存在的嵌套子模塊 git clone --recurse-submodules [URL]復(fù)制代碼 新建一個(gè) Git 項(xiàng)目的兩種方式1.本地新建好 Git 項(xiàng)目,然后關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)# 初始化一個(gè)Git倉(cāng)庫(kù) $ git init # 關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù) $ git remote add <name> <git-repo-url> # 例如 $ git remote add origin https://github.com/xxxxxx復(fù)制代碼 2.clone 遠(yuǎn)程倉(cāng)庫(kù)# 新建好遠(yuǎn)程倉(cāng)庫(kù),,然后 clone 到本地 $ git clone <git-repo-url> # 將遠(yuǎn)程倉(cāng)庫(kù)下載到(當(dāng)前 git bash 啟動(dòng)位置下面的)指定文件中,,如果沒(méi)有會(huì)自動(dòng)生成 $ git clone <git-repo-url> <project-name>復(fù)制代碼 Git 分支管理規(guī)范
預(yù)發(fā)布環(huán)境的作用: 預(yù)發(fā)布環(huán)境是正式發(fā)布前最后一次測(cè)試。因?yàn)樵谏贁?shù)情況下即使預(yù)發(fā)布通過(guò)了,,都不能保證正式生產(chǎn)環(huán)境可以100%不出問(wèn)題,;預(yù)發(fā)布環(huán)境的配置,數(shù)據(jù)庫(kù)等都是跟線上一樣,;有些公司的預(yù)發(fā)布環(huán)境數(shù)據(jù)庫(kù)是連接線上環(huán)境,,有些公司預(yù)發(fā)布環(huán)境是單獨(dú)的數(shù)據(jù)庫(kù);如果不設(shè)預(yù)發(fā)布環(huán)境,,如果開(kāi)發(fā)合并代碼有問(wèn)題,,會(huì)直接將問(wèn)題發(fā)布到線上,增加維護(hù)的成本,。 Git 鉤子
4.1 pre-commit
4.2 安裝 pre-commitnpm install pre-commit --save-dev復(fù)制代碼 4.3 配置腳本如果沒(méi)有在 "scripts": { "build": "tsc", "eslint": "eslint src --ext .ts", "eslint:fix": "eslint src --ext .ts --fix" }, //在提交代碼之前,先執(zhí)行 scripts 中的 eslint 命令 "pre-commit": [ "eslint" ]復(fù)制代碼 4.4 跳過(guò) pre-commit 繼續(xù)提交代碼# 跳過(guò)驗(yàn)證$ git commit --no-verify$ git commit -n復(fù)制代碼 更多鉤子:/book/zh/v2/… 常見(jiàn)問(wèn)題1,、拉取別人的遠(yuǎn)程分支合并后,,git 會(huì)存取這個(gè)拉取的記錄,如果你不小心刪了別人的上傳的文件,,這時(shí)候想要再拉取別人的分支是沒(méi)用的,,會(huì)顯示 already-up這時(shí)候可以回滾代碼,重新拉取,。 2,、以前有過(guò)這樣的經(jīng)歷:前后端、客戶端的代碼都存放在一個(gè) git 倉(cāng)庫(kù)中,在根目錄下各自新建項(xiàng)目目錄,。那么可以直接在自己的項(xiàng)目目錄下使用 git 提交代碼并且在各自的項(xiàng)目目錄下配置 .gitignore 文件,,不用在根目錄下配置 .gitignore 文件,,這樣就互不影響了3,、fatal:refusing to merge unrelated histories 拒絕合并不相關(guān)的歷史在 git 2.9.2 之后,不可以合并沒(méi)有相同結(jié)點(diǎn)的分支(分支之間自倉(cāng)庫(kù)建立后,,從來(lái)沒(méi)有過(guò)互相拉取合并),。如果需要合并兩個(gè)不同結(jié)點(diǎn)的分支,如下: $ git pull origin branchName --allow-unrelated-histories $ git merge branchName --allow-unrelated-histories復(fù)制代碼 這個(gè)功能是可以讓大家不要把倉(cāng)庫(kù)上傳錯(cuò)了,,如果會(huì)加上這個(gè)代碼,,那么就是自己確定了上傳。舊版本的 Git 很容易就把代碼傳錯(cuò)了,,現(xiàn)在可以看到,,如果上傳的不是之前的,那么就需要加代碼上傳,。 正常情況下,,都是先建立倉(cāng)庫(kù),然后切多個(gè)分支,,分支先去拉取合并主分支的內(nèi)容,,然后再各自開(kāi)發(fā), 如果建立倉(cāng)庫(kù)后,,各個(gè)分支沒(méi)有區(qū)拉取主分支的代碼,,之后各個(gè)分支之間想要合并時(shí)就會(huì)報(bào)錯(cuò)。 4,、合并分支時(shí)出現(xiàn)問(wèn)題,,想要解除合并狀態(tài)error: merge is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm <file>' hint: as appropriate to mark resolution and make a commit. fatal: Exiting because of an unresolved conflict.復(fù)制代碼 當(dāng)遠(yuǎn)程分支和本地分支發(fā)生沖突后,git 保持合并狀態(tài),,你如果沒(méi)有去解決完所有的沖突,,那么 git 會(huì)一直保持這個(gè)狀態(tài),你就無(wú)法再提交代碼,。只有先解除合并狀態(tài)后,,才能繼續(xù)提交。執(zhí)行命令前最好先備份一下,,有可能本地做的修改會(huì)被遠(yuǎn)程分支覆蓋掉,。 # 解除合并狀態(tài) $ git merge --abort 復(fù)制代碼 5、不小心把某些文件上傳到遠(yuǎn)程 git 倉(cāng)庫(kù)/想要?jiǎng)h除遠(yuǎn)程倉(cāng)庫(kù)中的文件# 刪除暫存區(qū)和工作區(qū)的文件 $ git rm filename # 只刪除暫存區(qū)的文件,,不會(huì)刪除工作區(qū)的文件 $ git rm --cached filename 復(fù)制代碼 如果在配置 .gitignore 文件之前就把某個(gè)文件上傳到遠(yuǎn)程倉(cāng)庫(kù)了,,這時(shí)候想把遠(yuǎn)程倉(cāng)庫(kù)中的該文件刪除,此時(shí)你配置 .gitignore 文件也沒(méi)有用,因?yàn)樵撐募呀?jīng)被追蹤了,,但又不想在本地刪除該文件后再重新提交到遠(yuǎn)程倉(cāng)庫(kù),,這時(shí)候可以使用 6、將本地新建的項(xiàng)目上傳到新建的遠(yuǎn)程倉(cāng)庫(kù)上之前沒(méi)有進(jìn)行過(guò)關(guān)聯(lián),,即沒(méi)有通過(guò) clone 遠(yuǎn)程項(xiàng)目到本地再開(kāi)始做項(xiàng)目,,而是先本地新建了一個(gè)項(xiàng)目,然后想傳到遠(yuǎn)程倉(cāng)庫(kù)上,。 # 將本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)起來(lái) $ git remote add origin 遠(yuǎn)程倉(cāng)庫(kù)地址 # 將本地的 master 分支推送到 origin 主機(jī),,同時(shí)指定 origin 為默認(rèn)主機(jī) $ git push -u origin master # 上面的命名執(zhí)行后,下次再?gòu)谋镜貛?kù)上傳內(nèi)容的時(shí)候只需下面這樣就可以了 $ git push復(fù)制代碼 7,、HEAD 指針既可以指向分支(默認(rèn)指向當(dāng)前分支),,也可以指向快照,當(dāng)指向的是快照時(shí),,這個(gè)時(shí)候指針的狀態(tài)稱之為游離狀態(tài)(detached)8,、創(chuàng)建與合并分支的原理9、每次 git push 都要輸入用戶名,、密碼
ssh-keygen -t rsa -C "[email protected]" # Generating public/private rsa key pair... # 三次回車即可生成 ssh key復(fù)制代碼
cat ~/.ssh/id_rsa.pub復(fù)制代碼
測(cè)試 ssh 是否能夠連接成功 $ ssh -T [email protected]復(fù)制代碼
使用 ssh 協(xié)議 $ git remote set-url origin [email protected]:xxx/xxx.git復(fù)制代碼
一般為 C:\users\Administrator,也可以是你自己創(chuàng)建的系統(tǒng)用戶名目錄,,文件名為 .git-credentials,。由于在 Windows 中不允許直接創(chuàng)建以 "." 開(kāi)頭的文件,所以用命令行創(chuàng)建該文件,。 $ touch .git-credentials $ echo "http://{username}:{password}@github.com" >> ~/.git-credentials $ git config --global credential.helper store復(fù)制代碼 10,、git 不允許提交空文件夾可以在當(dāng)前目錄下,添加一個(gè) .gitkeep 文件 11,、有時(shí)候復(fù)制過(guò)來(lái)的文件,,使用 |
|