g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!
上一篇git 基本原理對git的使用以及文件分布已經有了一個整體的了解。
本篇將對工作中常用的一些git 操作命令的操作進行總結歸納,方便今后查閱。
文章目錄
- 1. 分離頭指針
- 2. 通過HEAD 來進行不同提交的差異對比
- 3. 刪除不需要的分支
- 4. 對當前分支最近一次提交的message 做變更
- 5. 基于當前分支,修改老舊的commit信息
- 6. 把連續多個commit 整合為一個commit
- 7. 合并多個不連續的commit信息
- 8. 比較 暫存區 和 HEAD 最新內容的差異
- 9. 比較工作區 和 暫存區 最新內容的差異
- 10. 將暫存區中的內容恢復到HEAD的內容
- 11. 將工作區內容恢復到暫存區的內容
- 12. 消除最近的幾次commit
- 13. 查看不同提交的指定文件的內容
- 14. 如何正確刪除git管理的文件
- 15. 工作中加塞緊急任務,暫存工作區
- 16. 如何指定不需要git管理的文件
- 17. 如何將git 倉庫備份到本地
1. 分離頭指針
當我們想要切換分支的時候,無意中點了commit的對象id,然后在其分支上做了大量的變更。
這個時候當前分離頭指針的狀態就是沒有分支的狀態, 此時如果你切換到其他的分支繼續進行開發的時候很有能導致之前在分離頭指針的狀態下做的大量的變更都被丟棄掉了。
過程如下:
- 分離頭指針
Baron@MacBook-Progit_learning % git checkout bce2f242注意:正在切換到 'bce2f242'。您正處于分離頭指針狀態。您可以查看、做試驗性的修改及提交,并且您可以在切換 回一個分支時,丟棄在此狀態下所做的提交而不對分支造成影響。如果您想要通過創建分支來保留在此狀態下所做的提交,您可以通過在 switch 命令 中添加參數 -c 來實現(現在或稍后)。例如:git switch -c <新分支名>或者撤銷此操作:git switch -通過將配置變量 advice.detachedHead 設置為 false 來關閉此建議HEAD 目前位于 bce2f24 modify on temp branch - 不對其關聯分支,在當前狀態進行變更
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 - 此時歷史版本能夠看到正常的變更記錄
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 - 當我們切換分支之后,會發現因為頭指針分離下沒有綁定分支,之前的更改便無法找回
Baron@MacBook-Pro git_learning % git checkout temp 警告:您正丟下 1 個提交,未和任何分支關聯:286afae add readme file如果您想要通過創建新分支保存它,這可能是一個好時候。 如下操作:git branch <新分支名> 286afae切換到分支 'temp' - 但是根據git的提示信息,能夠發現git會發出分離頭指針狀態切換時的警告,盡可能阻止我們犯錯
如果我們認為頭指針下的變更很重要,接下來只需要按照提示信息就可以對分離頭指針的狀態進行分支添加。
此時再切換回去的時候已經能夠發現在分離頭指針狀態下的變更(創建的readme文件)已經能夠看到了。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 來進行不同提交的差異對比
先描述一下HEAD 指向的含義,每一次git log查看的時候都會發現最新的commit都會有一個HEAD來指向對應的分支或者就是一個單獨的HEAD(分離頭指針的情況)
#正常的分支
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD -> seprate)#分離頭指針的情況
commit 286afae9cb98199213a546aa2d087a16cc63e391 (HEAD)
查看.git文件中的HEAD文件,可以看到具體的內容,ref指向一個文件
Baron@MacBook-Pro git_learning % cat .git/HEAD
ref: refs/heads/seprate
查看指向的文件內容,以及類型,可以發現最終的指向還是一個commit類型
Baron@MacBook-Pro git_learning % cat .git/refs/heads/seprate
286afae9cb98199213a546aa2d087a16cc63e391
Baron@MacBook-Pro git_learning % git cat-file -t 286afae9c
commit
所以我們想要對比不同變更的內容差異,即可通過如下方式
-
對比不同的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該情況適用于刪除的分支沒有新的變更才行,有變更的話會報錯git branch -D branch_name使用-d刪除不掉的時候可以使用-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 #當前工作目錄處于被刪除的分支之上,需要更改工作目錄
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' 沒有完全合并。
如果您確認要刪除它,執行 'git branch -D seprate'。
Baron@MacBook-Pro git_learning % git branch -D seprate
已刪除分支 seprate(曾為 286afae)。
Baron@MacBook-Pro git_learning % git branch -av #刪除完成,僅剩下一個分支
* master ade6638 add readme file
4. 對當前分支最近一次提交的message 做變更
git commit --amend 使用vim編輯修改即可
修改之后
5. 基于當前分支,修改老舊的commit信息
git rebase -i commitid 這里的commit id需要填寫我們要修改的舊的commit的父親commit id
保存之后會進入如下頁面
修改完成后,git log查看,即能夠看到修改的結果已經生效
6. 把連續多個commit 整合為一個commit
git rebase -i commitid 這里的commit id 仍然是所有commit的父親commit id
我們想要合并如下三個commit信息
則使用其父親commit的id信息 git rebase -i 9e5a0d1
保存后跳轉到message信息的編輯頁面
最終已經完成了指定message信息的合并
7. 合并多個不連續的commit信息
gitk --all可視化查看當前commit信息
仍然使用git rebase -i commitid對commit記錄進行合并,合并的方式和之前連續的方式一樣,只不過修改的時候修改對應的pick為s即可
8. 比較 暫存區 和 HEAD 最新內容的差異
git diff --cached 比較暫存取和HEAD 最新內容的差異
Baron@MacBook-Pro git_learning % echo "444" >> test_file
Baron@MacBook-Pro git_learning % git add test_file #添加到暫存區
Baron@MacBook-Pro git_learning % git diff --cached #將暫存區內容和HEAD進行比較
diff --git a/test_file b/test_file
index 58c9bdf..b8dd46c 100644
--- a/test_file
+++ b/test_file
@@ -1 +1,2 @@111
+444
之后確認暫存區的更改是我們想要的更改,即可進行commit
9. 比較工作區 和 暫存區 最新內容的差異
git diff 默認比較工作區和暫存區的內容
git diff -- test_file 僅僅比較具體文件的工作區和暫存區文件的差異
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. 將暫存區中的內容恢復到HEAD的內容
工作中有時候我們會想要將暫存區中的內容恢復到HEAD的程度,此時有可能工作區中的某一些方案更好,我們就像將暫存取中的變更全部撤銷掉,恢復到和HEAD一樣的,可以通過命令
git reset HEAD恢復所有暫存區的內容到HEADgit reset HEAD -- test_file恢復具體的文件內容到HEAD
Baron@MacBook-Pro git_learning % git reset HEAD
重置后取消暫存的變更:
M test_file
Baron@MacBook-Pro git_learning % git diff --cached #此時可以發現工作區和HEAD已經沒有差異了
Baron@MacBook-Pro git_learning %
11. 將工作區內容恢復到暫存區的內容
發現工作區的變更還不如暫存區,此時需要將工作區的內容恢復到暫存區的內容。
較為舊的git版本使用的是git checkout -- filename,為了防止命令執行的歧義,最新的git版本已經變更為git restore filename
執行之前工作區和暫存區的信息差異
執行之后已經恢復成一樣的內容了
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
這里是指我們工作中有幾個commit所有相關的信息都不想要了,這個時候即可變更HEAD頭指針的位置
git reset --hard commitid
PS:這條命令非常危險,如果能夠確認 真的不需要當前commit之前所有的信息之后即可執行該操作,否則執行命令之后丟棄的變更就找不回來了
如下,我們想要丟棄 藍色方框內commit之前所有commit變更內容
已經完成變更之后的log信息
13. 查看不同提交的指定文件的內容
git diff commitid commitid --- file
這里只需要指定不同的commit id即可完成不同commit內容的差異比較。
14. 如何正確刪除git管理的文件
總共兩種方法:
- 先從工作區刪除,再從暫存區刪除
rm file;git rm file
- 直接從工作區刪除
git rm file
15. 工作中加塞緊急任務,暫存工作區
當我們工作中突然有了需要在HEAD指向的內容中增加一些功能, 但是我們已經在工作區中了做了大量的變更,此時為了保存我們工作區中的內容,先完成緊急任務,需要使用如下功能來完成。
git stash暫存工作區,同時將工作區內容恢復到HEAD所指的內容git stash list查看當前有多少個暫存的工作區,棧形式的存儲結構git stash apply從當前保存的暫存區列表中取出列表頭部暫存區內容git stash pop從當前保存的暫存區列表中取出列表頭,并刪除列表頭
16. 如何指定不需要git管理的文件
我們在實際開發過程中可能只想要讓git管理我們需要的源碼文件,而像二進制文件,或者.o,.d文件等中間文件都不需要納入git的版本管理之中,這個時候我們就需要維護一個只管理我們想要的文件。
.gitignore文件就是git 中做這樣的事情,我們將我們不想管理的文件按照指定的格式添加到這個文件之中即可。
PS:這里需要注意的是gitignore文件只對不在暫存區中的文件起作用,如果在添加.gitignore之前文件已經存在于暫存區,則此時在.gitignore去除該文件,是不會生效的,且此時的文件名必須叫做.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 #此時忽略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 #創建一個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
無文件要提交,干凈的工作區
17. 如何將git 倉庫備份到本地
git備份時可以用到的傳輸協議如下,大體分為兩種:啞協議和智能協議。
其中啞協議是看不到進度的,智能協議能夠看到傳輸進度,且智能協議性能優于啞協議。
如下使用本地協議進行備份, 其中git clone --bare是指直接備份一個純倉庫到本地。
以下為分別使用兩種本地協議進行備份。
git remote add zhineng zhinneg.repo.git 為本地配置遠端的git源
當我們在本地做了變更之后,可以將本地的變更同步到遠端
git push 即可
或者在遠端的指定分之使用git fetch將本地的內容拉回到遠端
總結
以上是生活随笔為你收集整理的g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拍摄视频有水印怎么办?
- 下一篇: 程门立雪是谁写的呢?