git常見(jiàn)命令有哪些及怎么使用

這篇文章主要講解了“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)行中。

1. Windows-Git 下載安裝

2 Git公鑰生成與配置方法

2.1 公鑰的用途

許多公司的代碼倉(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ù)名和密碼啦。

2.2 生成公鑰

這里插一句,如果感到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è)置字體大小

2.2.1 配置用戶(hù)名和郵箱

在公司使用的話(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 "郵箱地址"

2.2.2 生成密鑰

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 “上一步的郵箱地址”

git常見(jiàn)命令有哪些及怎么使用

2.2.3 查看公鑰

 cd ~/.ssh && ls
 cat id_rsa.pub

git常見(jiàn)命令有哪些及怎么使用

2.3 配置公鑰

登錄個(gè)人或企業(yè)的git網(wǎng)站,在用戶(hù)設(shè)置-->SSH公鑰里面 ,給公鑰起個(gè)有意義的名稱(chēng),將生成的公鑰粘貼到公鑰輸入框里(注意要?jiǎng)h除公鑰末尾的空白或者換行符),點(diǎn)擊保存,就可以了。

git常見(jiàn)命令有哪些及怎么使用

2.4 Git管理多個(gè)SSH密鑰,Git多帳號(hào)配置

創(chuàng)建步驟:

2.4.1 在每個(gè)項(xiàng)目下,單獨(dú)配置用戶(hù)名和郵箱地址,為不同項(xiàng)目生成密鑰對(duì),生成時(shí)指定私鑰名稱(chē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”

2.4.2 在~ssh文件夾下,創(chuàng)建一個(gè)config文件,配置每個(gè)賬號(hào)域名、用戶(hù)名 、 驗(yàn)證方式、私鑰文件路徑

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是私鑰文件路徑

3 Git倉(cāng)庫(kù)創(chuàng)建

分為兩種情況,一種是沒(méi)有倉(cāng)庫(kù),一種是已有倉(cāng)庫(kù),先看第一種,從零創(chuàng)建倉(cāng)庫(kù),然后推送到遠(yuǎn)程

3.1 從零開(kāi)始創(chuà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ī)

3.2 克隆已有倉(cāng)庫(kù)到本地

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é)議的效率 。

4 .git目錄的組成

git常見(jiàn)命令有哪些及怎么使用

5 Git存儲(chǔ)區(qū)概念

如果你不清楚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ù)。

6 分支操作

分支是用來(lái)將特性開(kāi)發(fā)絕緣開(kāi)來(lái)的。在你創(chuàng)建倉(cāng)庫(kù)的時(shí)候,master 是“默認(rèn)的”分支。在其它分支上進(jìn)行開(kāi)發(fā),完成后再將它們合并到主分支上。

git常見(jiàn)命令有哪些及怎么使用

6.1 查看分支

git branch       查看本地所有的分支
git branch -r    查看遠(yuǎn)程所有分支
git branch -vv   查看本地分支和遠(yuǎn)程分支的追蹤關(guān)系

6.2 切換分支

git checkout 分支名

6.3 新建分支

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)程分支

6.4 重命名分支

git branch -m 舊名稱(chēng) 新名稱(chēng)

6.5 刪除分支

git branch -D 分支名 // 先切換到別的分支名下,刪除本地分支
git push --delete 遠(yuǎn)程主機(jī) 遠(yuǎn)程分支名 // 刪除遠(yuǎn)程分支

6.6 合并分支
6.6.1 git merge

git merge 當(dāng)前分支要合并的分支名 -m '合并備注'
git merge --no-ff  當(dāng)前分支要合并的分支名 // 保留分支合并之前的歷史提交記錄
git merge --squash 當(dāng)前分支要合并的分支名 // 將分支合并之前多次提交記錄合并為一次

git常見(jiàn)命令有哪些及怎么使用

6.6.2 git rebase

  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

彈出如下界面:

git常見(jiàn)命令有哪些及怎么使用

上面未被注釋的部分列出的是我們本次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ù)需要編輯完之后保存即可。

6.6.3 git merge和git rebase 合并分支的差異

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,便于查看提交歷史。

6.7 合并分支沖突

沖突的原因是兩個(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

6.8 追蹤分支

追蹤分支主要用來(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)前分支)

7 設(shè)置忽略文件

7.1 創(chuàng)建忽略文件

在倉(cāng)庫(kù)根目錄下新建.gitignore文件,文件名不可更改。在Win系統(tǒng)下,不允許新建以.開(kāi)頭的文件或文件夾,因此需要在Git Bash中新建,命令如下:

cd 本地代碼倉(cāng)庫(kù)目錄
vim .gitignore

7.2 忽略文件語(yǔ)法

# 以#開(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ù)的文件 (如果文件重要,要提前備份)

  1. 刪除文件追蹤兩種方法

git rm –cached xxx
git rm -r –cached

  1. 在.gitignored中添加需要過(guò)濾的文件

  2. commit, push提交.gitignore 配置這個(gè)后其他成員pull后working directory中對(duì)應(yīng)的文件會(huì)刪除,

8 工作空間操作

8.1 進(jìn)度暫存

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)容

8.2 將工作區(qū)的改動(dòng)添加暫存區(qū)

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

8.3 將暫存區(qū)的文件提交到本地版本庫(kù)

git commit -m    "代碼提交信息"
git commit -a -m "代碼提交信息"      # -a是把unstaged的文件變成staged(不包括新建的文件),然后commit
git commit --amend                 # 修改提交的commit(沒(méi)有push)
git commit --amend -m "comment"    # 修改commit注釋

8.4 將本地版本庫(kù)推送到遠(yuǎn)程版本庫(kù)

 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ī)名都可以省略
8.5 更新遠(yuǎn)程版本庫(kù)的內(nèi)容到本地版本庫(kù)

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ù)所有分支的功能,注意是更新分支,不是更新分支上的代碼。

8.6 git版本庫(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 '備注'

git revert和git reset的區(qū)別

(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)指定版本之后的所有提交記錄

git revert和get reset的后悔藥

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è)版本。

8.7 git 提交指定分支

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>

8.8 git刪除

當(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

8.9 git log

推薦兩條簡(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)雅,更舒服

git常見(jiàn)命令有哪些及怎么使用

9 Tag操作

在軟件發(fā)布時(shí)創(chuàng)建標(biāo)簽,建一個(gè)發(fā)布版本的里程碑,是被推薦的。

9.1 tag創(chuàng)建

#查詢(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

9.2 查看tag

# 查看某個(gè)tag記錄
git show tag-name

# 查看所有的tag
git tag -ln  # 加-ln,查看tag簡(jiǎn)略信息

9.3 使用tag

// 取出打過(guò)tag的某個(gè)版本
 git checkout -b branch_name tag_name

9.4 刪除tag

#刪除本地的tag命令是
git tag -d tag-name

#刪除遠(yuǎn)程tag的命令是
git push origin --delete tag-name

10. .gitlab-ci.yml配置參考示例

#鏡像名稱(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

11. git良好的使用習(xí)慣

  1. 每次提交前,檢查一下所提交代碼,是不是真正想修改的內(nèi)容

  2. 提交的粒度要細(xì),頻率要高,能極大減少代碼沖突和重要改動(dòng)無(wú)版本存儲(chǔ)問(wèn)題

  3. 最好打通gitlab和釘釘,企業(yè)微信機(jī)器人代碼提交通知,有人提交代碼時(shí),可以及時(shí)通知其它人更新,減少代碼沖突的概率

  4. git的自動(dòng)合并功能,有瑕疵,有時(shí)候文件的一些部分,合并是對(duì)的,一些部分,合并有沖突,最好逐個(gè)文件檢查

  5. 給項(xiàng)目配置husky工具,可以在提交代碼的時(shí)候,對(duì)代碼進(jìn)行格式化,或者檢查是否符合lint規(guī)則,如果不符,可以終止提交

  6. 對(duì)于異常操作,一定要保留現(xiàn)場(chǎng),查明原因,這樣記憶更深刻。

  7. 要看一下每條git命令的回顯,看看是不是你要執(zhí)行的操作, 有沒(méi)有遺漏或報(bào)錯(cuò)或者執(zhí)行終止的情況

  8. git減少代碼沖突的做法

  • 分配任務(wù)時(shí),盡量把任務(wù)拆分成獨(dú)立的模塊, 彼此之間的交集越少越好

  • 對(duì)于容易沖突的大文件,可以指定由一個(gè)人去修改

  • 將大文件拆分成多個(gè)子文件,將所有的子文件導(dǎo)入到一個(gè)index.ts索引文件中,使用的時(shí)候從索引文件中按需導(dǎo)出

  • 組內(nèi)成員對(duì)預(yù)感會(huì)產(chǎn)生沖突的大文件,商量好修改順序

12. git 常見(jiàn)報(bào)錯(cuò)

  1. error: pathspec 'branch-xxx' did not match any file(s) known to git

git checkout 的分支不存在.git文件夾引起的

  1. 修改了文件的名稱(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

  1. 在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常見(jiàn)命令有哪些及怎么使用

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)文件所致。

  1. 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 失敗

  1. A同事$ git push -force了test這個(gè)分支,導(dǎo)致遠(yuǎn)程倉(cāng)庫(kù)的分支被覆蓋,而你本地的refs則會(huì)與遠(yuǎn)程倉(cāng)庫(kù)的分支不一致,產(chǎn)生問(wèn)題;

  2. git分支是不區(qū)分大小寫(xiě),有人刪除了遠(yuǎn)程倉(cāng)庫(kù)的分支又重新創(chuàng)建一個(gè)同樣名字的分支同樣也會(huì)產(chǎn)生問(wèn)題。

解決方法:

  1. 使用git命令 git update-ref -d xxx  刪除本地.git下的xxx文件

  2. 如果不行,強(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

  1. 已刪除的文件,并且本地已暫存,無(wú)法在暫存狀態(tài)下復(fù)原刪除的文件,將刪除文件從暫存?zhèn)}庫(kù)中移除,才能恢復(fù)刪除的文件。

  2. 錯(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ò)誤。

git常見(jiàn)命令有哪些及怎么使用

解決方法: 從一開(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)

搜索引擎優(yōu)化