【寫在最前】
我們在平時的編程學習中,經常會接觸到“版本控制”這個概念。
目前業界的開發團隊,基本都會從 GIT 、 SVN 兩種主流版本控制系統中選擇一個在團隊內部使用。
兩個軟件設計思路不同,各有利弊。
通過本文知識,讓我們花5分鐘時間學習一下git工具及其常用命令,相信聰明的你,看完一定會有收獲!
【正文開始】
# 定義
Git 是一個開源的“分布式”版本控制系統,跟SVN不同,他并不需要一個集中式的中央代碼服務器的支持。
# 安裝
windows版: https://npm.taobao.org/mirrors/git-for-windows/
linux版: https://www.kernel.org/pub/software/scm/git/git-2.8.1.tar.gz (或 yum -y install git-core)
# 基本概念
想學好git,必須要理解版本庫、暫存區、工作區概念
版本庫:.git隱藏目錄是 Git 的版本庫
暫存區:對應版本庫中名為index的二進制文件(另有stage一說,概念相同)
工作區:就是你在電腦里能正常看到的工作目錄。
三者關系如下圖所示:
- 圖中可看出 "HEAD" 是指向 master 分支的一個"游標"(圖示的命令中出現 HEAD 的地方可以用 master 來替換)
- 當對工作區修改(或新增)的文件執行git add命令時,暫存區的目錄樹被更新;
- 當執行提交操作git commit命令時,暫存區的目錄樹寫到master版本庫(即 master 指向的目錄樹就是提交時暫存區的目錄樹)
- 當執行git reset HEAD命令時,暫存區的目錄樹被 master 分支指向的目錄樹所替換,但是工作區不受影響。
- 當執行git rm --cached命令時,會直接從暫存區刪除文件,工作區不受影響。
- 當執行git checkout .或者git checkout --命令時,會用暫存區全部或指定的文件替換工作區的文件 (這個操作有一定危險性,會丟失工作區未add的改動)
- 當執行git checkout HEAD .或者git checkout HEAD命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件同時替換暫存區和以及工作區中的文件。 (這個操作有一定危險性,會同時丟失工作區和暫存區的改動)
# 常用命令
Git 常用命令有6個,分別是:
git clone、git push、git add、git commit、git checkout、git pull
使用過程如下圖所示:
再附上另一張圖,加深你的理解:
# 分支管理
每一種版本控制系統都以某種形式支持分支,一個分支代表一條獨立的開發線。
使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續工作。
創建分支命令:
git branch (branchname)
切換分支命令:
git checkout (branchname)
刪除分支命令:
git branch -d (branchname)
合并分支命令:
git merge (branchname)
注意:合并分支過程中,可能會有代碼沖突,此時必須手動解決后重新通過git add+git commit命令提交
#版本回退(穿梭)
人人都會犯錯誤,版本回退功能給了我們犯錯后改正的機會。
版本回退,需要區分兩種情形:
1)如果還沒有 commit ,則建議用 git checkout 命令進行指定文件錯誤恢復;
2)如果已經commit,則需要先用 git log 命令列出所有 commitId, 然后利用 reset 命令進行恢復;
命令語法為: git reset --hard
注1: --hard: commit 和 index都回退(推薦) –-soft:只回退commit,不回退index暫存區 --mixed:混合模式(默認值,但因為工作區沒變化不直觀,所以不推薦)
注2: reset 是全部回退(之后的commit記錄會被直接清除) revert 則只回退指定的 commitId (單次),其余 commit 記錄不變
特別注意:
不建議在已經commit的情況下利用 checkout 回退(因為二次修改會有detached HEAD游離態的問題)
detached HEAD 游離態產生的原因:
checkout head 命令原理是將head從master分支指向了某個具體 commitId,如果再對文件進行二次修改就會自動產生一個無名分支,此時只會允許你commit到本地,不會再允許你push到遠程。
detached HEAD 游離態的解決:
方案原理:先創建新的臨時分支保存修改操作,再將新分支合并到master
方案只需4步:
git branch temp_branch
git checkout master
git merge temp_branch
git branch -d temp_branch
【全文完】
十年技術沉淀,只做原創文章;
及時關注作者,成就大牛之路!
如果您對文章內容有不同意見或獨到見解,歡迎大家在評論區留言討論,作者也會第一時間進行互動回復。