這篇文章主要講解了“git常見(jiàn)命令有哪些及怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“git常見(jiàn)命令有哪些及怎么使用”吧!
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供八宿企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站建設(shè)、做網(wǎng)站、HTML5、小程序制作等業(yè)務(wù)。10年已為八宿眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
許多公司的代碼倉(cāng)庫(kù)及第三方代碼托管平臺(tái),使用的都是基于公鑰的SSH認(rèn)證方式(公鑰加密,私鑰解密)。
Git推薦使用SSH協(xié)議的原因 使用SSH協(xié)議可以避免每次push
輸入密碼。 git@github.com開(kāi)頭的就是SSH協(xié)議。 使用Https協(xié)議則每次都要輸入用戶(hù)名和密碼。
公鑰是代碼倉(cāng)庫(kù)服務(wù)器驗(yàn)證本地機(jī)器的一種身份識(shí)別方式。入職一家新公司后,公司的git服務(wù)器管理員,會(huì)要求你把你的git公鑰通過(guò)郵件的方式發(fā)給它,配置好之后,以后每次向遠(yuǎn)程代碼倉(cāng)庫(kù)提交代碼,就不用輸入用戶(hù)名和密碼啦。
這里插一句,如果感到git bash的窗口太小或者字體太小,可以自己進(jìn)行調(diào)整。調(diào)整的方式是,打開(kāi)git bash命令窗口后,在命令窗的標(biāo)題欄,鼠標(biāo)右鍵,然后選擇options,安裝下面的操作進(jìn)行設(shè)置
// 窗口尺寸設(shè)置
options --> windows -->修改行數(shù)(高度)+列數(shù)(寬度)
// 窗口字體設(shè)置
options --> text -->設(shè)置字體大小
在公司使用的話(huà),用戶(hù)名建議配置成自己的真名,這樣查看代碼修改者的時(shí)候,比較好找。git config命令有三種作用域。
# 對(duì)當(dāng)前倉(cāng)庫(kù)有效
git config --local
# 對(duì)當(dāng)前登錄者有效,對(duì)所有倉(cāng)庫(kù)都有效
git config --global
# 對(duì)登錄這臺(tái)電腦的人都有效,對(duì)所有倉(cāng)庫(kù)都有效
git config --system
如果配置項(xiàng)比較多,可以在這些指令后面加 -e 參數(shù),打開(kāi)配置文件進(jìn)行配置。編輯完先按esc, 然后再按shift+:組合鍵,最后在命令行輸入wq保存退出
這里明顯應(yīng)該選擇git config --global配置命令。
git config --global user.name "用戶(hù)名"
git config --global user.email "郵箱地址"
ssh-keygen
生成秘鑰過(guò)程會(huì)有三次問(wèn)詢(xún)交互。第一次是詢(xún)問(wèn)生成秘鑰存儲(chǔ)路徑和名稱(chēng),默認(rèn)存儲(chǔ)位置是 /c/Users/用戶(hù)名/.ssh/id_rsa
, 不想更改的話(huà)按回車(chē)鍵。第二和第三次是要求你輸入兩次私鑰密碼。用于查看秘鑰時(shí)的認(rèn)證,一次是設(shè)置密碼,一次是確認(rèn)密碼, 如果你不想在使用密鑰時(shí)輸入口令,按回車(chē)跳過(guò)即可。
ssh-keygen -t rsa -C “上一步的郵箱地址”
cd ~/.ssh && ls
cat id_rsa.pub
登錄個(gè)人或企業(yè)的git網(wǎng)站,在用戶(hù)設(shè)置-->SSH公鑰里面 ,給公鑰起個(gè)有意義的名稱(chēng),將生成的公鑰粘貼到公鑰輸入框里(注意要?jiǎng)h除公鑰末尾的空白或者換行符),點(diǎn)擊保存,就可以了。
創(chuàng)建步驟:
git config --local user.name "你的名字"
git config --local user.email "你的郵箱"
ssh-keygen命令生成SSH-KEY密鑰對(duì)文件時(shí),需要輸入文件存儲(chǔ)路徑,為不同賬號(hào)起不同的名稱(chēng)
ssh-keygen -t rsa -C "test@126.com”
Host github.com
HostName github.com
User test@126.com
PreferredAuthentications publickey
IdentityFile /c/Users/用戶(hù)名/.ssh/ssh/id_rsa_github
Host oschina.com
HostName oschina.com
User test@126.com
PreferredAuthentications publickey
IdentityFile /c/Users/用戶(hù)名/.ssh/ssh/id_rsa_github
Host gitee.com
HostName gitee.com
User test@126.com
PreferredAuthentications publickey
IdentityFile /c/Users/用戶(hù)名/~ssh/id_rsa_gitee
HostName
是服務(wù)器的地址,User
是用戶(hù)名,PreferredAuthentications
是驗(yàn)證方式,IdentityFile是私鑰文件路徑
分為兩種情況,一種是沒(méi)有倉(cāng)庫(kù),一種是已有倉(cāng)庫(kù),先看第一種,從零創(chuàng)建倉(cāng)庫(kù),然后推送到遠(yuǎn)程
git init 目錄名 新建一個(gè)本地倉(cāng)庫(kù)
git add README.md -- 將README.md文件加入到倉(cāng)庫(kù)中
git commit -m "提交描述" -- 將文件提交到本地倉(cāng)庫(kù)
git remote add origin "遠(yuǎn)程倉(cāng)庫(kù)地址" -- 添加遠(yuǎn)程倉(cāng)庫(kù),origin是一個(gè)遠(yuǎn)程主機(jī)的別名,名稱(chēng)可以隨意取,一個(gè)遠(yuǎn)程主機(jī)上可以有多個(gè)遠(yuǎn)程倉(cāng)庫(kù)
git push -u origin master -- 將本地倉(cāng)庫(kù)push到遠(yuǎn)程主機(jī)origin的master分支,并將origin設(shè)為默認(rèn)遠(yuǎn)程主機(jī) -u參數(shù)設(shè)置默認(rèn)遠(yuǎn)程主機(jī),后續(xù)push代碼,不寫(xiě)主機(jī)名的話(huà),就是默認(rèn)主機(jī)
git clone /path/to/repository // 克隆本地庫(kù)
git clone git/ssh/http[s]/ftp[s]/file/rsync:username@ip/path/to/repository // 克隆遠(yuǎn)端庫(kù)
git clone的本質(zhì)就是把Git目錄里面的內(nèi)容拷貝過(guò)來(lái),一般Git目錄里有成千上萬(wàn)的各種對(duì)象(提交對(duì)象,樹(shù)對(duì)象,二進(jìn)制對(duì)象, tag對(duì)象......),如果逐一復(fù)制的話(huà),其效率就可想而知。如果通過(guò)git、ssh協(xié)議傳輸,服務(wù)器端會(huì)在傳輸前把需要傳輸?shù)母鞣N對(duì)象先打好包再進(jìn)行傳輸;而http(s)協(xié)議則會(huì)反復(fù)請(qǐng)求要傳輸?shù)牟煌瑢?duì)象。如果倉(cāng)庫(kù)里面的提交不多的話(huà),前者和后者的效率相差不多;但若倉(cāng)庫(kù)里有很多提交的話(huà),git、ssh協(xié)議進(jìn)行傳輸效率更高。不過(guò)現(xiàn)在Git對(duì)http(s)協(xié)議傳輸Git倉(cāng)庫(kù)做了一定的優(yōu)化,http(s)傳輸現(xiàn)在也能達(dá)到ssh協(xié)議的效率 。
如果你不清楚git add ,git commit ,git push都做了什么,那可能是因?yàn)槟悴恢纆it倉(cāng)庫(kù)存儲(chǔ)區(qū)管理方式。git將本地的代碼保存分為三個(gè)存儲(chǔ)空間。
工作區(qū):用戶(hù)編輯保存項(xiàng)目文件的區(qū)域,用戶(hù)直接可以接觸的地方。
暫存區(qū):保存準(zhǔn)備提交的文件列表信息,保存在上文的.git文件夾下的index目錄中;
版本庫(kù):git 之所以快,是因?yàn)榇蠖鄶?shù)提交都是對(duì)本地倉(cāng)庫(kù)而言的,不依賴(lài)網(wǎng)絡(luò)也能進(jìn)行版本管理,需要與遠(yuǎn)程倉(cāng)庫(kù)同步的時(shí)候才推送到遠(yuǎn)程倉(cāng)庫(kù)。
分支是用來(lái)將特性開(kāi)發(fā)絕緣開(kāi)來(lái)的。在你創(chuàng)建倉(cāng)庫(kù)的時(shí)候,master 是“默認(rèn)的”分支。在其它分支上進(jìn)行開(kāi)發(fā),完成后再將它們合并到主分支上。
git branch 查看本地所有的分支
git branch -r 查看遠(yuǎn)程所有分支
git branch -vv 查看本地分支和遠(yuǎn)程分支的追蹤關(guān)系
git checkout 分支名
git checkout -b 新分支名 // 從當(dāng)前所處的本地分支下,創(chuàng)建一個(gè)新分支,分支名建議以 feature-YYYYMMDD-開(kāi)發(fā)功能概述-姓名簡(jiǎn)稱(chēng),這樣的格式命名
git checkout -b 新分支名 遠(yuǎn)程主機(jī)名/遠(yuǎn)程分支名 // 從遠(yuǎn)程分支創(chuàng)建一個(gè)新分支,并追蹤遠(yuǎn)程分支
git branch -m 舊名稱(chēng) 新名稱(chēng)
git branch -D 分支名 // 先切換到別的分支名下,刪除本地分支
git push --delete 遠(yuǎn)程主機(jī) 遠(yuǎn)程分支名 // 刪除遠(yuǎn)程分支
git merge 當(dāng)前分支要合并的分支名 -m '合并備注'
git merge --no-ff 當(dāng)前分支要合并的分支名 // 保留分支合并之前的歷史提交記錄
git merge --squash 當(dāng)前分支要合并的分支名 // 將分支合并之前多次提交記錄合并為一次
git rebase -i [startpoint] [endpoint]
其中-i
的意思是--interactive
,即彈出交互式的界面讓用戶(hù)編輯完成合并操作,[startpoint]
[endpoint]
則指定了一個(gè)編輯區(qū)間,如果不指定[endpoint]
,則該區(qū)間的終點(diǎn)默認(rèn)是當(dāng)前分支HEAD
所指向的commit
以合并最近三次的提交記錄為例:
git rebase -i HEAD~3
彈出如下界面:
上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交,下面注釋部分是git為我們提供的命令說(shuō)明。每一個(gè)commit id 前面的pick
表示指令類(lèi)型,git 為我們提供了以下幾個(gè)命令:
命令 | 說(shuō)明 |
---|---|
pick | 保留該commit(縮寫(xiě):p) |
reword | 保留該commit,但我需要修改該commit的注釋?zhuān)s寫(xiě):r) |
edit | 保留該commit, 但我要停下來(lái)修改該提交(不僅僅修改注釋)(縮寫(xiě):e) |
squash | 將該commit和前一個(gè)commit合并(縮寫(xiě):s) |
fixup | 將該commit和前一個(gè)commit合并,但我不要保留該提交的注釋信息(縮寫(xiě):f) |
exec | 執(zhí)行shell命令(縮寫(xiě):x) |
drop | 我要丟棄該commit(縮寫(xiě):d) |
根據(jù)需要編輯完之后保存即可。
git rebase生成的歷史記錄線(xiàn)比較好看,merge比rebase有更多的歷史記錄,一方認(rèn)為,合并分支不能僅僅為了好看,而要記錄某個(gè)分支完整開(kāi)發(fā)歷史,一根直線(xiàn)的歷史,很難分辨出開(kāi)發(fā)歷程和工作分配,如果開(kāi)發(fā)過(guò)程跌跌撞撞,要進(jìn)行如實(shí)記錄,遍于后期改進(jìn)。
另一方認(rèn)為,在開(kāi)發(fā)過(guò)程中,如果某個(gè)分支功能比較多, commit量比較多時(shí),使用rebase可以將當(dāng)前分支提交記錄整理過(guò)后再合并回主干,這樣主干的演變軌跡線(xiàn)會(huì)看著比較美觀(guān),比較清晰。如果項(xiàng)目成員對(duì)git用得比較熟練,建議使用git rebase,否則建議使用git merge,便于查看提交歷史。
沖突的原因是兩個(gè)不同的開(kāi)發(fā)者改了相同文件相同位置的代碼,沖突提示,
$ git merge conflict-branch
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
文件沖突,HEAD到=======之間的是當(dāng)前分支,=======到>>>>>>>之間的是沖突分支的內(nèi)容,最后面是沖突分支名
<<<<<<< HEAD
id="footer">contact : email.support@github.com
=======
id="footer"> please contact us at support@github.com
>>>>>>> conflict-branch
合并沖突的原則是取最大公約數(shù),共同的部分只保留一份,有差異的地方多方都保留 遇到?jīng)_突,難于解決,想回退到未合并之前的狀態(tài),使用
git merge --abort
解決完沖突文件之后,要重新添加文件到暫存區(qū)和本地版本庫(kù)。
另外一種場(chǎng)景是git pull最新的代碼后,git stash pop引起沖突,想回退到最新沒(méi)沖突之前的代碼,使用指令
git reset --hard HEAD
追蹤分支主要用來(lái)對(duì)比當(dāng)前和遠(yuǎn)程分支的版本, 比如說(shuō)origin/master分支比master多提交了兩次,意味著你需要將origin/master的分支更新到master。
git branch --set-upstream-to=遠(yuǎn)程主機(jī)名/遠(yuǎn)程分支名 本地分支名(可不寫(xiě),不寫(xiě)表示當(dāng)前分支)
在倉(cāng)庫(kù)根目錄下新建.gitignore
文件,文件名不可更改。在Win系統(tǒng)下,不允許新建以.
開(kāi)頭的文件或文件夾,因此需要在Git Bash中新建,命令如下:
cd 本地代碼倉(cāng)庫(kù)目錄
vim .gitignore
# 以#開(kāi)頭的行都是注釋
# 忽略*.o和*.a文件(常見(jiàn)的編譯過(guò)程中產(chǎn)生的文件)
*.[oa]
# 忽略*.c和*.C文件,somefile.c除外,!用于在在某規(guī)則之后增加例外
*.[cC]
!somefile.c
# 忽略somepath文件和somepath目錄
somepath
# 只忽略somepath目錄,不忽略somepath文件
somepath/ # 只忽略somepath文件,不忽略somepath目錄
somepath
!somepath/
# 只忽略當(dāng)前目錄下的somepath文件和目錄,子目錄的somepath不在忽略范圍內(nèi)
/somepath
7.3 忽略文件的原則
忽略操作系統(tǒng)自動(dòng)生成的文件,比如縮略圖等;
忽略自動(dòng)測(cè)試生成的報(bào)告文件,忽略代碼治療掃描結(jié)果文件;
忽略帶有敏感信息的配置文件,比如存放口令的配置文件。
忽略依賴(lài)安裝包,忽略包管理工具生成的錯(cuò)誤文件,忽略打包目錄
7.4 忽略已經(jīng)添加到遠(yuǎn)程倉(cāng)庫(kù)的文件 (如果文件重要,要提前備份)
刪除文件追蹤兩種方法
git rm –cached xxx
git rm -r –cached
在.gitignored中添加需要過(guò)濾的文件
commit, push提交.gitignore 配置這個(gè)后其他成員pull后working directory中對(duì)應(yīng)的文件會(huì)刪除,
git 切換分支時(shí),如果當(dāng)前分支的功能沒(méi)有開(kāi)發(fā)好,不具備提交的條件, 如果不對(duì)這些內(nèi)容做暫存處理,會(huì)被帶入到切換之后的分支,給代碼管理帶來(lái)不必要的麻煩。這時(shí)就需要對(duì)尚未開(kāi)發(fā)完成的進(jìn)度進(jìn)行存儲(chǔ)操作。
git stash save "備注說(shuō)明" // 暫存尚未開(kāi)發(fā)完成的進(jìn)度
git stash list // 查看暫存進(jìn)度
git stash pop stash@{1} // 恢復(fù)指定進(jìn)度到工作區(qū),stash_id是通過(guò)git stash list命令得到的,如果不指定,恢復(fù)最新的進(jìn)度到工作區(qū)
git stash drop [stash_id] // 如果不指定stash_id,則默認(rèn)刪除最新的存儲(chǔ)進(jìn)度。
git stash clear // 刪除所有暫存內(nèi)容
git add dir1 # 添加dir1這個(gè)目錄,目錄下的所有文件都被加入
git add f1 f2 # 添加f1,f2文件
git add -u # -u是update的縮寫(xiě),只監(jiān)聽(tīng)已經(jīng)被加入的文件,包括修改和刪除,不包括新增的文件和.gitignore中設(shè)置的忽略文件 添加到暫存區(qū)
git add . # 監(jiān)聽(tīng)工作區(qū)的狀態(tài)樹(shù),把工作區(qū)狀態(tài)樹(shù)的所有變化提交到暫存區(qū), 包括新增的和修改的,不包括刪除的文件和.gitignore中設(shè)置的忽略文件
git add -A # 等于 git add . + git add -u 不包括.gitignore中要忽略的文件
git add * # 等同git add -A
git commit -m "代碼提交信息"
git commit -a -m "代碼提交信息" # -a是把unstaged的文件變成staged(不包括新建的文件),然后commit
git commit --amend # 修改提交的commit(沒(méi)有push)
git commit --amend -m "comment" # 修改commit注釋
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
git push -f <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名> // 強(qiáng)制推送
git push命令使用時(shí)常見(jiàn)的四種情況:
git push <遠(yuǎn)程主機(jī)名> <本地分支名> | 如果遠(yuǎn)程分支被省略,如上則表示將本地分支推送到與之存在追蹤關(guān)系的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在,則會(huì)被新建 |
---|---|
git push <遠(yuǎn)程主機(jī)名> :<遠(yuǎn)程分支名> | 如果省略本地分支名,則表示刪除指定的遠(yuǎn)程分支,因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支,等同于 git push origin --delete 遠(yuǎn)程分支 |
git push <遠(yuǎn)程主機(jī)名> | 如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略,將當(dāng)前分支推送到遠(yuǎn)程主機(jī)的對(duì)應(yīng)分支 |
git push | 如果當(dāng)前分支只有一個(gè)遠(yuǎn)程分支,那么主機(jī)名都可以省略 |
git fetch <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名> // 等于git fetch+git merge
git pull 常見(jiàn)的四種省略參數(shù)的情況,與git push比較類(lèi)似。這里就不再贅述。git pull除了更新和自動(dòng)合并當(dāng)前代碼之外,還有更新倉(cāng)庫(kù)所有分支的功能,注意是更新分支,不是更新分支上的代碼。
回退命令
git checkout -- #撤銷(xiāo)工作區(qū)修改,省略filename,就是放棄工作區(qū)所有的改動(dòng)
git log --pretty=oneline --abbrev-commit #查看version_hash
git reset version_hash --[soft|mixed|hard] #本地倉(cāng)庫(kù)回退到某個(gè)版本
# --soft 回退commit,stage和workspace仍舊保留改動(dòng)
# --mixed 回退commit和stage,git reset默認(rèn)的模式,只有工作區(qū)保留改動(dòng)
# --hard 回退commit stage workspace 所有的改動(dòng)都會(huì)丟失
git push -f 遠(yuǎn)程主機(jī)名 遠(yuǎn)程分支 #強(qiáng)制遠(yuǎn)程倉(cāng)庫(kù)回退到本地倉(cāng)庫(kù)版本
回退流程
1.備份當(dāng)前分支
git checkout -b the_branch_backup
2.本地倉(cāng)庫(kù)版本回退
git log --pretty=oneline --abbrev-commit #查看回退版本號(hào)
git reset --hard the_commit_id #本地倉(cāng)庫(kù)版本回退
3.遠(yuǎn)程倉(cāng)庫(kù)回退
git push origin :the_branch //刪除遠(yuǎn)程 the_branch
4. 用回滾后的本地分支重新建立遠(yuǎn)程分支
git push origin the_branch
5.回退成功,刪除本地備份分支
git branch -D the_branch_backup
Git的版本回退速度非???,因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD
指針,當(dāng)你回退版本的時(shí)候,Git僅僅是把HEAD從指向回退版本
提交代碼時(shí)提交錯(cuò)了分支的處理方法
git log --pretty=oneline --abbrev-commit #查看 提交之前的commit_id
git reset commit_id #本地版本庫(kù)回退
git stash #暫存工作區(qū)和暫存區(qū)改動(dòng)
git checkout target_branch #切換到正確的分支
git stash pop #恢復(fù)代碼
git add -A && git commit - m '備注'
(1) git reset只能針對(duì)本地操作,如果本地刪除的內(nèi)容已經(jīng)推送到遠(yuǎn)程倉(cāng)庫(kù),下一次更新時(shí),被刪除的內(nèi)容會(huì)恢復(fù)。git revert可以對(duì)對(duì)遠(yuǎn)程服務(wù)器執(zhí)行回退操作。下一次更新時(shí),本地被刪除的文件,不會(huì)恢復(fù)。
(2) git revert會(huì)使提交記錄增多,git revert是撤銷(xiāo)指定版本的提交,會(huì)產(chǎn)生一個(gè)新的提交記錄,git reset會(huì)使提交記錄減少,git reset是回卷,會(huì)撤銷(xiāo)指定版本之后的所有提交記錄
revert后如果不想撤銷(xiāo)了,看一下log,reset就可以回去了。
git log # 查看commit_id
git reset --hard commit_d # 回退本地倉(cāng)庫(kù),暫存區(qū),工作區(qū)
reset后后悔了怎么辦,沒(méi)有l(wèi)og了,怎么辦? 沒(méi)關(guān)系,用git reflog命令可以查到更多commit_id:
git reflog # 查看所有的命令操作記錄,可以查詢(xún)到git reset之前的commit_id
git reset --hard commit_id # 就可以回退會(huì)reset以前狀態(tài)了。
在git中,總是有后悔藥可以吃的,git reflog 記錄你操作的每一條指令,HEAD
指向的版本是當(dāng)前版本,Git允許我們使用命令git reset --hard commit_id
在歷史版本之間穿梭。穿梭前,用git log
可以查看提交歷史,以便確定要回退到哪個(gè)版本。要重返未來(lái),用git reflog
查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。
git cherry-pick
命令的作用,就是在當(dāng)前分支上,把其它分支的提交記錄合并過(guò)來(lái),這在兩個(gè)版本剛開(kāi)始說(shuō)要一起上線(xiàn),后來(lái)一個(gè)版本不上線(xiàn)了,而代碼都攪合在發(fā)布分支,要撤銷(xiāo)不上線(xiàn)的代碼時(shí),配合git reset指令,可以輕松實(shí)現(xiàn)發(fā)布分支不上線(xiàn)功能的代碼下撤。
a1 - a2 - a3 - a4 A
\
b1 - b2 - b3 B
現(xiàn)在將b2提交應(yīng)用到A
分支。
# 切換到 A 分支$ git checkout A# Cherry pick 操作$ git cherry-pick b2
操作完成以后,代碼庫(kù)就變成:
a1 - a2 - a3 - a4 - b2 A
\
b1 - b2 - b3 B
合并多個(gè)提交的操作指令是:
git cherry-pick <Hash-b1> <Hash-bN>
當(dāng)我們需要?jiǎng)h除暫存區(qū)或版本庫(kù)上的文件, 同時(shí)工作區(qū)也不需要這個(gè)文件了, 可以使用git rm
git rm file_path
git commit -m 'delete somefile'
git push
當(dāng)我們需要?jiǎng)h除暫存區(qū)或版本庫(kù)的文件, 但本地又需要使用, 只是不希望這個(gè)文件被版本控制, 可以使用 git rm --cached
git rm --cached file_path
git commit -m 'delete remote somefile'
git push
推薦兩條簡(jiǎn)寫(xiě)提交日志格式設(shè)置參數(shù), lm-不顯示提交記錄匯總信息 lms-會(huì)現(xiàn)在提交記錄匯總信息
# 提交記錄hash值是紅色 提交描述是藍(lán)色 提交日期是綠色 提交者是深藍(lán)色
git config --global alias.lm "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h %Creset- %Cblue%s %Cgreen(%cd) %C(bold blue)<%an>'"
# 有提交記錄匯總信息 提交記錄hash值是紅色 提交描述是藍(lán)色 提交日期是綠色 提交者是深藍(lán)色
git config --global alias.lms "log --no-merges --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h %Creset- %Cblue%s %Cgreen(%cd) %C(bold blue)<%an>'"
命令淺析:
--no-merges:不顯示分支合并日志
%h:簡(jiǎn)短hash提交字符串
%cd:提交日期
%an:提交者
%s:提交說(shuō)明
%C+顏色值+內(nèi)容=給內(nèi)容設(shè)置相應(yīng)的顏色
看看這兩種風(fēng)格的注釋是不是看著更優(yōu)雅,更舒服
在軟件發(fā)布時(shí)創(chuàng)建標(biāo)簽,建一個(gè)發(fā)布版本的里程碑,是被推薦的。
#查詢(xún)版本號(hào)
git log --pretty=oneline --abbrev-commit
#創(chuàng)建tag
git tag v1.0.0 1b2e1d63ff -m '20210123 created'
#推送某個(gè)tag到遠(yuǎn)程倉(cāng)庫(kù)
git push origin tag_name
# 一次性推送所有tag到遠(yuǎn)程服務(wù)器
git push origin --tags
# 查看某個(gè)tag記錄
git show tag-name
# 查看所有的tag
git tag -ln # 加-ln,查看tag簡(jiǎn)略信息
// 取出打過(guò)tag的某個(gè)版本
git checkout -b branch_name tag_name
#刪除本地的tag命令是
git tag -d tag-name
#刪除遠(yuǎn)程tag的命令是
git push origin --delete tag-name
#鏡像名稱(chēng)不是隨意起的,要與docker配置名稱(chēng)對(duì)應(yīng)
image: node:lts
# 要緩存的東西
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .yarn-cache/
variables:
APP_NAME: 'alp-crm-ng'
stages:
- format
# 預(yù)處理命令
before_script:
- echo "before_script"
- node -v
- yarn -v
- yarn install --cache-folder .yarn-cache
format:
stage: format
script:
- yarn format
每次提交前,檢查一下所提交代碼,是不是真正想修改的內(nèi)容
提交的粒度要細(xì),頻率要高,能極大減少代碼沖突和重要改動(dòng)無(wú)版本存儲(chǔ)問(wèn)題
最好打通gitlab和釘釘,企業(yè)微信機(jī)器人代碼提交通知,有人提交代碼時(shí),可以及時(shí)通知其它人更新,減少代碼沖突的概率
git的自動(dòng)合并功能,有瑕疵,有時(shí)候文件的一些部分,合并是對(duì)的,一些部分,合并有沖突,最好逐個(gè)文件檢查
給項(xiàng)目配置husky工具,可以在提交代碼的時(shí)候,對(duì)代碼進(jìn)行格式化,或者檢查是否符合lint規(guī)則,如果不符,可以終止提交
對(duì)于異常操作,一定要保留現(xiàn)場(chǎng),查明原因,這樣記憶更深刻。
要看一下每條git命令的回顯,看看是不是你要執(zhí)行的操作, 有沒(méi)有遺漏或報(bào)錯(cuò)或者執(zhí)行終止的情況
git減少代碼沖突的做法
分配任務(wù)時(shí),盡量把任務(wù)拆分成獨(dú)立的模塊, 彼此之間的交集越少越好
對(duì)于容易沖突的大文件,可以指定由一個(gè)人去修改
將大文件拆分成多個(gè)子文件,將所有的子文件導(dǎo)入到一個(gè)index.ts索引文件中,使用的時(shí)候從索引文件中按需導(dǎo)出
組內(nèi)成員對(duì)預(yù)感會(huì)產(chǎn)生沖突的大文件,商量好修改順序
error: pathspec 'branch-xxx' did not match any file(s) known to git
git checkout 的分支不存在.git文件夾引起的
修改了文件的名稱(chēng),將小寫(xiě)改成大寫(xiě),提交到git遠(yuǎn)程倉(cāng)庫(kù),發(fā)現(xiàn)文件名稱(chēng)沒(méi)有改變,解決方法是
git rm -r --cached .
3. 合并代碼,推薦用如下命令,比git merge更好用。
git pull origin remote_need_merge_branch_name
在VSCode的git命令窗口提交代碼時(shí),報(bào)如下錯(cuò)誤:
git pull --tags origin hotfix/20210707-hide-fund-rate
From gitlab.tengmoney.com:tengmoney-fe/caizhi-minipro-cscb
* branch hotfix/20210707-hide-fund-rate -> FETCH_HEAD
! [rejected] v1.2.0 -> v1.2.0 (would clobber existing tag)
這是因?yàn)閠ag被刪除了,又新建了一個(gè)一模一樣的tag,解決方案是,強(qiáng)制刷新一下遠(yuǎn)程的所有tag
git fetch --tags -f
5. .gitignore文件中設(shè)置的忽略文件不生效的解決方法,.gitignore中設(shè)置的忽略規(guī)則,是針對(duì)未添加到版本管理的文件而言,對(duì)已添加到版本庫(kù)的文件不生效。解決方法是將所有文件先從版本庫(kù)刪除,再重新添加一遍。
git rm --cached 要?jiǎng)h除的xxx文件夾或文件
6. Could not retrieve the pipeline status. ---- 無(wú)法檢索流水線(xiàn)狀態(tài)。
這種報(bào)錯(cuò)是因?yàn)闆](méi)有流水線(xiàn)文件所致。
error: cannot lock ref ‘xxx’: ‘xxx’ exists; cannot create ‘xxx’
原因:git工程的.git/refs目錄下跟蹤的某些git分支,在pull時(shí)候發(fā)現(xiàn)與遠(yuǎn)程倉(cāng)庫(kù)對(duì)應(yīng)的分支refs不同,因此導(dǎo)致 git pull 失敗
A同事$ git push -force
了test這個(gè)分支,導(dǎo)致遠(yuǎn)程倉(cāng)庫(kù)的分支被覆蓋,而你本地的refs則會(huì)與遠(yuǎn)程倉(cāng)庫(kù)的分支不一致,產(chǎn)生問(wèn)題;
git分支是不區(qū)分大小寫(xiě),有人刪除了遠(yuǎn)程倉(cāng)庫(kù)的分支又重新創(chuàng)建一個(gè)同樣名字的分支同樣也會(huì)產(chǎn)生問(wèn)題。
解決方法:
使用git命令 git update-ref -d xxx 刪除本地.git下的xxx文件
如果不行,強(qiáng)制更新 git pull -p 強(qiáng)制更新
8. The following untracked working tree files would be overwritten by merge,
原因: 遠(yuǎn)端將某個(gè)文件加入了倉(cāng)庫(kù),本地把這個(gè)文件從倉(cāng)庫(kù)中移除了,就會(huì)出現(xiàn)這樣的提示。一般是同名文件,剛開(kāi)始命名不規(guī)范,比如說(shuō)文件名首字母大寫(xiě),后面改成了小寫(xiě)文件。window系統(tǒng)不區(qū)分文件大小寫(xiě),就出現(xiàn)這個(gè)問(wèn)題。
解決方法:
方法1
git rm --cached filename
git push origin remote_branch
方法2
git clean -d -fx "src/httpTypes"
其中 d----刪除未被添加到git的路徑中的文件 x---刪除忽略文件 對(duì)git來(lái)說(shuō)不識(shí)別的文件 f ---強(qiáng)制運(yùn)行 ,強(qiáng)制合并的思路走不通。
9. git默認(rèn)對(duì)文件名稱(chēng)大小寫(xiě)不敏感,如果將原來(lái)小駝峰命名的文件改成了大駝峰,會(huì)發(fā)現(xiàn)本地git的改動(dòng)文件提示,沒(méi)有任何修改。解決方法就是執(zhí)行
git config core.ignorecase false
刪除之前小駝峰文件的操作指令是
git mv readme.md README.md
已刪除的文件,并且本地已暫存,無(wú)法在暫存狀態(tài)下復(fù)原刪除的文件,將刪除文件從暫存?zhèn)}庫(kù)中移除,才能恢復(fù)刪除的文件。
錯(cuò)誤: error dst refspec matches more than one ,原因: tags與branch中有重名的分支
解決方法:刪除重名分支 12. git checkout -b 創(chuàng)建新分支時(shí),報(bào)fatal: cannot lock ref xxx
git 把分支信息存放在 .git/refs/heads
目錄中,每個(gè)分支是一個(gè)文件。如果.git/refs/heads下存在同名目錄,就會(huì)報(bào)這個(gè)錯(cuò)誤。
解決方法: 從一開(kāi)始創(chuàng)建分支時(shí),如果要?jiǎng)?chuàng)建一個(gè)以xxx為前綴的開(kāi)發(fā)名,就要?jiǎng)?chuàng)建成xxx/test1這種格式。
感謝各位的閱讀,以上就是“git常見(jiàn)命令有哪些及怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)git常見(jiàn)命令有哪些及怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前名稱(chēng):git常見(jiàn)命令有哪些及怎么使用
文章網(wǎng)址:http://bm7419.com/article42/jjechc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)