【Git 總結】Git進階--版本控制管理

Git 總結系列如下(感興趣的賞個臉看一下唄):
Git基礎–常用命令
Git進階–版本控制管理
Git進階–遠程倉庫,在Github上提交代碼

工作區,暫存區,提交的版本三個的關係:
工作區:我們當前正在操作的地方,任何修改都是先在工作區裏。
暫存區:當我們修改了文件後,並執行git add 命令就將工作區的修改放進暫存區,使工作區與暫存區一致。暫存區可以防止誤提交,或將一些不想提交的修改隔絕在工作區裏,不添加進暫存區的修改就不會被提交。
提交版本: 放進暫存區之後執行git commit 就可以將暫存區與上一次 commit 不同的東西提交。

提一個不太恰當的比喻,就像3個水桶,裏面放滿了代碼(Git 其實使用HEAD 指針來控制版本的,只會有一份代碼),一次提交後,假設上一次提交沒有沒加進暫存區的修改,這時候3個桶的代碼完全一樣。你往第一個桶加了點代碼或倒掉一點,這時候工作區就不一樣了,執行git add 就會將工作區(第一個桶)修改同步進暫存區(第二個桶),然後執行git commit 就可以將暫存區(第二個桶)的內容同步到第三個桶。

這裏寫圖片描述
圖片來源 Git教程

1. 版本回退

git reset
git reset HEAD^git reset HEAD~1 回退到上一版本
git reset HEAD^^git reset HEAD~2 回退到上上個版本
使用 ^,每個^ 代表一個,~ 則後接數字 。
git reset <$id> 回退到任意commit,參數可以只打commit id 前面的部分數字,一般7,8位足夠,只要保證id 的唯一性即可。

首先用 git log 查看提交記錄。

log
我們要回退到 First commit 即 532acf...

執行git reset --hard HEAD^
reset
可以看到回退成功了。(–hard 的作用下面再解釋)
再執行git log 就可以看到只有一個commit 了。
log

這時候如果你後悔回退了,向要回到回退之前,git log 也打不出之後的commit了,這時候就需要git reflog 這個命令了,他會記錄你的每一次操作。
reflog
我們要回到第二次commit 的時候,也就是 1e9832e

執行git reset --hard 1e9832e
reset
可以看到又回到第二次提交了。

git reset --hard --soft --mixed(default)
三種的區別:
--hard 工作區,暫存區,版本 都回退到某次commit(HEAD 指向某次commit ,index 即爲暫存區,working 爲工作區)
這裏寫圖片描述
--soft 只有版本會回退,暫存區,工作區保持原樣
這裏寫圖片描述
--mixed 也是不加參數時的默認操作,暫存區 和 提交版本 會回退,但工作區保持原樣。
這裏寫圖片描述
詳細的可以看看這篇博文(圖片來源)

2.分支管理

分支創建,切換,合併上一篇文章已經說過了,這裏就不再贅述了,想要了解的可以查看我的上一篇文章 Git基礎–常用命令 的後半部分。
git stash
現在 還有一種情況,當你在開發新功能開發到一半,這時候突然有一個緊急的bug需要修復,而新功能距離開發完成還需要一段較長時間,無法提交。你需要先修復bug,在這時候就需要 git stash 這個命令了,這個命令用來把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:
先用status 看一下狀態:

然後 使用git stash 保存狀態。

git stash list 可以查看stash的工作現場:

這時候你就可以歡快的在需要修復bug的分支新建bug分支修復代碼了。
等修復完bug,就可以切換回你剛纔的工作分支了,然後恢復工作現場,
一是用git stash apply恢復,但是恢復後,stash內容並不會刪除,你需要用git stash drop 命令來刪除。
另一種方式是用git stash pop,恢復的同時把stash內容也刪了。

這時候再用git stash list 就沒有東西了。

我們也可以多次stash,恢復的時候,先用git stash list查看,然後用命令恢復指定的stash:
git stash apply stash@{0}

解決衝突
我們先各自在a分支和master分支修改同一個地方並分別做一次提交,這時候兩個分支都各自前進了一個commit。
a分支

master分支

然後在master分支合併一下a分支,這就發生了衝突

用status查看一下,changes to be commmited 代表沒有衝突的部分,unmerged paths 代表發生衝突的部分。

打開文件readme.txt可以查看衝突:

Git用<<<<<<<=======>>>>>>>標記出不同分支的內容,我們修改後保存想要保留的部分即可。
最後再add,commit就可以了。
可以使用git log --graph看到分支的合併情況,
git log --graph --pretty=oneline --abbrev-commit

3.修改管理

1.撤銷修改
撤銷工作區相對於暫存區修改: git checkout -- <file>
-- 主要是爲了說明後面所跟的是路徑,而不是工作樹的一些名詞。

便於理解,分爲兩種應用場景:一種是修改後還沒add 進暫存區,此時直接回到上一次commit時暫存區的狀態。
一種是修改後add 進了暫存區,然後又做了修改,這時候回到上一次add 進暫存區後的狀態。

首先隨意修改一下文件,
然後使用 git status 查看一下狀態,會有相應提示。

再使用 git checkout -- <file> 命令撤銷修改
這裏寫圖片描述
最後再用git status 看一下,工作區修改已經被撤銷了

撤銷暫存區相對於提交版本的修改: git reset HEAD <file>
首先隨意修改一下文件,
並使用 git add <file> 將修改添加到暫存區。

然後使用 git status 查看一下狀態,會有相應提示。

再使用 git reset HEAD <file> 命令撤銷暫存區修改

最後再用git status 看一下,暫存區修改已經被撤銷回工作區了,這時候如果還需要撤銷工作區修改,就可以使用上面的git checkout -- <file> 命令了

撤銷全部文件的修改:
這個其實結合前面內容可以猜出來,直接使用git reset HEAD 就可撤銷最後提交版本後的全部文件修改,結合 hard soft mixed有不同的場景:
git reset --hard HEAD : 直接回退 工作區和暫存區的全部修改。
git reset --soft HEAD : 無效 ,不會有任何改變
git reset --mixed HEAD : 回退 暫存區 修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章