g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!
上一篇git 基本原理對git的使用以及文件分布已經(jīng)有了一個(gè)整體的了解。
本篇將對工作中常用的一些git 操作命令的操作進(jìn)行總結(jié)歸納,方便今后查閱。
文章目錄
- 1. 分離頭指針
- 2. 通過HEAD 來進(jìn)行不同提交的差異對比
- 3. 刪除不需要的分支
- 4. 對當(dāng)前分支最近一次提交的message 做變更
- 5. 基于當(dāng)前分支,修改老舊的commit信息
- 6. 把連續(xù)多個(gè)commit 整合為一個(gè)commit
- 7. 合并多個(gè)不連續(xù)的commit信息
- 8. 比較 暫存區(qū) 和 HEAD 最新內(nèi)容的差異
- 9. 比較工作區(qū) 和 暫存區(qū) 最新內(nèi)容的差異
- 10. 將暫存區(qū)中的內(nèi)容恢復(fù)到HEAD的內(nèi)容
- 11. 將工作區(qū)內(nèi)容恢復(fù)到暫存區(qū)的內(nèi)容
- 12. 消除最近的幾次commit
- 13. 查看不同提交的指定文件的內(nèi)容
- 14. 如何正確刪除git管理的文件
- 15. 工作中加塞緊急任務(wù),暫存工作區(qū)
- 16. 如何指定不需要git管理的文件
- 17. 如何將git 倉庫備份到本地
1. 分離頭指針
當(dāng)我們想要切換分支的時(shí)候,無意中點(diǎn)了commit的對象id,然后在其分支上做了大量的變更。
這個(gè)時(shí)候當(dāng)前分離頭指針的狀態(tài)就是沒有分支的狀態(tài), 此時(shí)如果你切換到其他的分支繼續(xù)進(jìn)行開發(fā)的時(shí)候很有能導(dǎo)致之前在分離頭指針的狀態(tài)下做的大量的變更都被丟棄掉了。
過程如下:
- 分離頭指針
Baron@MacBook-Progit_learning % git checkout bce2f242注意:正在切換到 'bce2f242'。您正處于分離頭指針狀態(tài)。您可以查看、做試驗(yàn)性的修改及提交,并且您可以在切換 回一個(gè)分支時(shí),丟棄在此狀態(tài)下所做的提交而不對分支造成影響。如果您想要通過創(chuàng)建分支來保留在此狀態(tài)下所做的提交,您可以通過在 switch 命令 中添加參數(shù) -c 來實(shí)現(xiàn)(現(xiàn)在或稍后)。例如:git switch -c <新分支名>或者撤銷此操作:git switch -通過將配置變量 advice.detachedHead 設(shè)置為 false 來關(guān)閉此建議HEAD 目前位于 bce2f24 modify on temp branch - 不對其關(guān)聯(lián)分支,在當(dāng)前狀態(tài)進(jìn)行變更
Baron@MacBook-Progit_learning % echo "222" > readme Baron@MacBook-Progit_learning % git add readme Baron@MacBook-Progit_learning % git commit -m"add readme file" [分離頭指針 286afae] add readme file 1 file changed, 1 insertion(+) create mode 100644 readme - 此時(shí)歷史版本能夠看到正常的變更記錄
Baron@MacBook-Progit_learning % git log commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD) Author: BaronStack <2689496754@qq.com> Date: Fri Jul 3 19:38:46 2020 +0800add readme filecommit bce2f2428649f640d98d4fbb011084c53c87fa25 (temp) Author: BaronStack <2689496754@qq.com> Date: Sat Jun 27 20:34:01 2020 +0800modify on temp branchcommit b360e56b39a5d605918816ea4dc07d61e93b12f8 Author: BaronStack <2689496754@qq.com> Date: Sat Jun 27 20:27:21 2020 +0800mod testfilecommit 30a71408576f421909d05cdd424703b8866dd943 Author: BaronStack <2689496754@qq.com> Date: Sat Jun 27 20:26:51 2020 +0800add test_file - 當(dāng)我們切換分支之后,會發(fā)現(xiàn)因?yàn)轭^指針分離下沒有綁定分支,之前的更改便無法找回
Baron@MacBook-Pro git_learning % git checkout temp 警告:您正丟下 1 個(gè)提交,未和任何分支關(guān)聯(lián):286afae add readme file如果您想要通過創(chuàng)建新分支保存它,這可能是一個(gè)好時(shí)候。 如下操作:git branch <新分支名> 286afae切換到分支 'temp' - 但是根據(jù)git的提示信息,能夠發(fā)現(xiàn)git會發(fā)出分離頭指針狀態(tài)切換時(shí)的警告,盡可能阻止我們犯錯(cuò)
如果我們認(rèn)為頭指針下的變更很重要,接下來只需要按照提示信息就可以對分離頭指針的狀態(tài)進(jìn)行分支添加。
此時(shí)再切換回去的時(shí)候已經(jīng)能夠發(fā)現(xiàn)在分離頭指針狀態(tài)下的變更(創(chuàng)建的readme文件)已經(jīng)能夠看到了。Baron@MacBook-Pro git_learning % git branch seprate 286afae Baron@MacBook-Pro git_learning % git branch -amasterseprate * temp Baron@MacBook-Pro git_learning % git checkout seprate 切換到分支 'seprate' Baron@MacBook-Pro git_learning % git ls readme test_file
2. 通過HEAD 來進(jìn)行不同提交的差異對比
先描述一下HEAD 指向的含義,每一次git log查看的時(shí)候都會發(fā)現(xiàn)最新的commit都會有一個(gè)HEAD來指向?qū)?yīng)的分支或者就是一個(gè)單獨(dú)的HEAD(分離頭指針的情況)
#正常的分支
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD -> seprate)#分離頭指針的情況
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD)
查看.git文件中的HEAD文件,可以看到具體的內(nèi)容,ref指向一個(gè)文件
Baron@MacBook-Pro git_learning % cat .git/HEAD
ref: refs/heads/seprate
查看指向的文件內(nèi)容,以及類型,可以發(fā)現(xiàn)最終的指向還是一個(gè)commit類型
Baron@MacBook-Pro git_learning % cat .git/refs/heads/seprate
286afae9cb98199213a546aa2d087a16cc63e391
Baron@MacBook-Pro git_learning % git cat-file -t 286afae9c
commit
所以我們想要對比不同變更的內(nèi)容差異,即可通過如下方式
-
對比不同的commit id,
git diff 286afae9 bce2f2428Baron@MacBook-Pro git_learning % git diff 286afae9 bce2f2428 diff --git a/readme b/readme deleted file mode 100644 index c200906..0000000 --- a/readme +++ /dev/null @@ -1 +0,0 @@ -222 -
對比HEAD和其父親的變更, 直接通過
git diff HEAD HEAD~1或者git diff HEAD HEAD^1Baron@MacBook-Pro git_learning % git diff HEAD HEAD^1 diff --git a/readme b/readme deleted file mode 100644 index c200906..0000000 --- a/readme +++ /dev/null @@ -1 +0,0 @@ -222 -
對比HEAD 和其父親的父親 的變更,直接通過
git diff HEAD HEAD~2或者git diff HEAD HEAD^^Baron@MacBook-Pro git_learning % git diff HEAD HEAD^^ diff --git a/readme b/readme deleted file mode 100644 index c200906..0000000 --- a/readme +++ /dev/null @@ -1 +0,0 @@ -222 diff --git a/test_file b/test_file index d8124e2..58c9bdf 100644 --- a/test_file +++ b/test_file @@ -1,2 +1 @@111 -22
3. 刪除不需要的分支
git branch -d branch_name該情況適用于刪除的分支沒有新的變更才行,有變更的話會報(bào)錯(cuò)git branch -D branch_name使用-d刪除不掉的時(shí)候可以使用-D 來刪除
大體過程如下
Baron@MacBook-Pro git_learning % git branch -av66389211 286afae add readme filemaster ade6638 add readme file
* seprate 286afae add readme filetemp bce2f24 modify on temp branch
Baron@MacBook-Pro git_learning % git branch -d 66389211
已刪除分支 66389211(曾為 286afae)。
Baron@MacBook-Pro git_learning % git branch -d temp
已刪除分支 temp(曾為 bce2f24)。
Baron@MacBook-Pro git_learning % git branch -d seprate #當(dāng)前工作目錄處于被刪除的分支之上,需要更改工作目錄
error: 無法刪除檢出于 '/Users/zhanghuigui/Desktop/work/work_file/mind-map/git_learning' 的分支 'seprate'。
Baron@MacBook-Pro git_learning % git checkout master
切換到分支 'master'
Baron@MacBook-Pro git_learning % git branch -d seprate
error: 分支 'seprate' 沒有完全合并。
如果您確認(rèn)要?jiǎng)h除它,執(zhí)行 'git branch -D seprate'。
Baron@MacBook-Pro git_learning % git branch -D seprate
已刪除分支 seprate(曾為 286afae)。
Baron@MacBook-Pro git_learning % git branch -av #刪除完成,僅剩下一個(gè)分支
* master ade6638 add readme file
4. 對當(dāng)前分支最近一次提交的message 做變更
git commit --amend 使用vim編輯修改即可
修改之后
5. 基于當(dāng)前分支,修改老舊的commit信息
git rebase -i commitid 這里的commit id需要填寫我們要修改的舊的commit的父親commit id
保存之后會進(jìn)入如下頁面
修改完成后,git log查看,即能夠看到修改的結(jié)果已經(jīng)生效
6. 把連續(xù)多個(gè)commit 整合為一個(gè)commit
git rebase -i commitid 這里的commit id 仍然是所有commit的父親commit id
我們想要合并如下三個(gè)commit信息
則使用其父親commit的id信息 git rebase -i 9e5a0d1
保存后跳轉(zhuǎn)到message信息的編輯頁面
最終已經(jīng)完成了指定message信息的合并
7. 合并多個(gè)不連續(xù)的commit信息
gitk --all可視化查看當(dāng)前commit信息
仍然使用git rebase -i commitid對commit記錄進(jìn)行合并,合并的方式和之前連續(xù)的方式一樣,只不過修改的時(shí)候修改對應(yīng)的pick為s即可
8. 比較 暫存區(qū) 和 HEAD 最新內(nèi)容的差異
git diff --cached 比較暫存取和HEAD 最新內(nèi)容的差異
Baron@MacBook-Pro git_learning % echo "444" >> test_file
Baron@MacBook-Pro git_learning % git add test_file #添加到暫存區(qū)
Baron@MacBook-Pro git_learning % git diff --cached #將暫存區(qū)內(nèi)容和HEAD進(jìn)行比較
diff --git a/test_file b/test_file
index 58c9bdf..b8dd46c 100644
--- a/test_file
+++ b/test_file
@@ -1 +1,2 @@111
+444
之后確認(rèn)暫存區(qū)的更改是我們想要的更改,即可進(jìn)行commit
9. 比較工作區(qū) 和 暫存區(qū) 最新內(nèi)容的差異
git diff 默認(rèn)比較工作區(qū)和暫存區(qū)的內(nèi)容
git diff -- test_file 僅僅比較具體文件的工作區(qū)和暫存區(qū)文件的差異
Baron@MacBook-Pro git_learning % git diff -- test_file
diff --git a/test_file b/test_file
index b8dd46c..f5fb332 100644
--- a/test_file
+++ b/test_file
@@ -1,2 +1,3 @@
-111
+222444
+999999
10. 將暫存區(qū)中的內(nèi)容恢復(fù)到HEAD的內(nèi)容
工作中有時(shí)候我們會想要將暫存區(qū)中的內(nèi)容恢復(fù)到HEAD的程度,此時(shí)有可能工作區(qū)中的某一些方案更好,我們就像將暫存取中的變更全部撤銷掉,恢復(fù)到和HEAD一樣的,可以通過命令
git reset HEAD恢復(fù)所有暫存區(qū)的內(nèi)容到HEADgit reset HEAD -- test_file恢復(fù)具體的文件內(nèi)容到HEAD
Baron@MacBook-Pro git_learning % git reset HEAD
重置后取消暫存的變更:
M test_file
Baron@MacBook-Pro git_learning % git diff --cached #此時(shí)可以發(fā)現(xiàn)工作區(qū)和HEAD已經(jīng)沒有差異了
Baron@MacBook-Pro git_learning %
11. 將工作區(qū)內(nèi)容恢復(fù)到暫存區(qū)的內(nèi)容
發(fā)現(xiàn)工作區(qū)的變更還不如暫存區(qū),此時(shí)需要將工作區(qū)的內(nèi)容恢復(fù)到暫存區(qū)的內(nèi)容。
較為舊的git版本使用的是git checkout -- filename,為了防止命令執(zhí)行的歧義,最新的git版本已經(jīng)變更為git restore filename
執(zhí)行之前工作區(qū)和暫存區(qū)的信息差異
執(zhí)行之后已經(jīng)恢復(fù)成一樣的內(nèi)容了
Baron@MacBook-Pro git_learning % git restore test_file
Baron@MacBook-Pro git_learning % git diff test_file
Baron@MacBook-Pro git_learning %
12. 消除最近的幾次commit
這里是指我們工作中有幾個(gè)commit所有相關(guān)的信息都不想要了,這個(gè)時(shí)候即可變更HEAD頭指針的位置
git reset --hard commitid
PS:這條命令非常危險(xiǎn),如果能夠確認(rèn) 真的不需要當(dāng)前commit之前所有的信息之后即可執(zhí)行該操作,否則執(zhí)行命令之后丟棄的變更就找不回來了
如下,我們想要丟棄 藍(lán)色方框內(nèi)commit之前所有commit變更內(nèi)容
已經(jīng)完成變更之后的log信息
13. 查看不同提交的指定文件的內(nèi)容
git diff commitid commitid --- file
這里只需要指定不同的commit id即可完成不同commit內(nèi)容的差異比較。
14. 如何正確刪除git管理的文件
總共兩種方法:
- 先從工作區(qū)刪除,再從暫存區(qū)刪除
rm file;git rm file
- 直接從工作區(qū)刪除
git rm file
15. 工作中加塞緊急任務(wù),暫存工作區(qū)
當(dāng)我們工作中突然有了需要在HEAD指向的內(nèi)容中增加一些功能, 但是我們已經(jīng)在工作區(qū)中了做了大量的變更,此時(shí)為了保存我們工作區(qū)中的內(nèi)容,先完成緊急任務(wù),需要使用如下功能來完成。
git stash暫存工作區(qū),同時(shí)將工作區(qū)內(nèi)容恢復(fù)到HEAD所指的內(nèi)容git stash list查看當(dāng)前有多少個(gè)暫存的工作區(qū),棧形式的存儲結(jié)構(gòu)git stash apply從當(dāng)前保存的暫存區(qū)列表中取出列表頭部暫存區(qū)內(nèi)容git stash pop從當(dāng)前保存的暫存區(qū)列表中取出列表頭,并刪除列表頭
16. 如何指定不需要git管理的文件
我們在實(shí)際開發(fā)過程中可能只想要讓git管理我們需要的源碼文件,而像二進(jìn)制文件,或者.o,.d文件等中間文件都不需要納入git的版本管理之中,這個(gè)時(shí)候我們就需要維護(hù)一個(gè)只管理我們想要的文件。
.gitignore文件就是git 中做這樣的事情,我們將我們不想管理的文件按照指定的格式添加到這個(gè)文件之中即可。
PS:這里需要注意的是gitignore文件只對不在暫存區(qū)中的文件起作用,如果在添加.gitignore之前文件已經(jīng)存在于暫存區(qū),則此時(shí)在.gitignore去除該文件,是不會生效的,且此時(shí)的文件名必須叫做.gitignore才能夠被git識別。
.gitignore文件格式如下:
*.*jnilib* #支持通配符來匹配文件
*.d-e #所有的.d文件
*.o-* #所有的.o文件
*.swp #所有的.swp文件
*~
*.vcxproj
*.vcxproj.filters
*.sln
*.cmake
.watchmanconfig
CMakeCache.txt
CMakeFiles/
build/
測試如下:
Baron@MacBook-Pro git_learning % cat .gitignore #此時(shí)忽略test文件,以及test目錄下的所有文件
# test file
testBaron@MacBook-Pro git_learning % ls -al
total 24
drwxr-xr-x 6 staff 192 7 5 12:56 .
drwxr-xr-x 10 staff 320 7 4 12:30 ..
drwxr-xr-x 15 staff 480 7 5 12:57 .git
-rw-r--r-- 1 staff 17 7 5 12:56 .gitignore
-rw-r--r-- 1 staff 8 7 5 12:06 readme
-rw-r--r-- 1 staff 9 7 5 12:40 test_file
Baron@MacBook-Pro git_learning % echo '111' >test #創(chuàng)建一個(gè)test文件
Baron@MacBook-Pro git_learning % ls -l
total 24
-rw-r--r-- 1 staff 8 7 5 12:06 readme
-rw-r--r-- 1 staff 4 7 5 12:59 test
-rw-r--r-- 1 staff 9 7 5 12:40 test_file
Baron@MacBook-Pro git_learning % git status
位于分支 master
無文件要提交,干凈的工作區(qū)
17. 如何將git 倉庫備份到本地
git備份時(shí)可以用到的傳輸協(xié)議如下,大體分為兩種:啞協(xié)議和智能協(xié)議。
其中啞協(xié)議是看不到進(jìn)度的,智能協(xié)議能夠看到傳輸進(jìn)度,且智能協(xié)議性能優(yōu)于啞協(xié)議。
如下使用本地協(xié)議進(jìn)行備份, 其中git clone --bare是指直接備份一個(gè)純倉庫到本地。
以下為分別使用兩種本地協(xié)議進(jìn)行備份。
git remote add zhineng zhinneg.repo.git 為本地配置遠(yuǎn)端的git源
當(dāng)我們在本地做了變更之后,可以將本地的變更同步到遠(yuǎn)端
git push 即可
或者在遠(yuǎn)端的指定分之使用git fetch將本地的內(nèi)容拉回到遠(yuǎn)端
總結(jié)
以上是生活随笔為你收集整理的g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拍摄视频有水印怎么办?
- 下一篇: 《DDIA》读书笔记