高大上的Git
最近學習Git感覺真是是高大上,用簡易的方式解決了複雜的版本管理問題。如果要深入介紹Git,其實夠一本書了,所以我根據最近學習情況,總結一下Git的基本知識點吧。
一、Git是什麼?
Git是目前非常流行的分散式版本管理系統。
開發Git最初目的是為更好地管理Linux內核開發而設計。
- 什麼是版本管理?
簡單說就是記錄你的修改。比如你修改一個文檔,今天你修改了最後一段文字,過了一周又修改了最後一段文字,但是你後悔了,想恢復到一周前的版本,但是完全記不得之前的內容,怎麼辦呢?那這個時候就需要版本管理了,版本管理可以記錄你的每次修改,這樣你就可以回到過去。
- 為什麼使用Git?
有的人會說,世界這麼多版本管理系統,Git有什麼好嗎?主要有四點:
- 速度快,操作簡單
- 分散式管理
- 極其優秀的分支管理
- 開源項目
二、 Git的安裝
- Mac下的安裝
Mac下安裝我推薦使用homebrew
,具體方法請參考homebrew的文檔
- Windows下的安裝
在Windows下安裝Git,其實和安裝其他軟體沒什麼區別,去Git官網下載安裝軟體即可
三、Git初次體驗
安裝完後,進入一個新建的文件夾里,我們來體驗一下Git的使用
- 初始化倉庫
// 在當前目錄新建一個Git代碼庫ngit initn
- 添加文件
// 新建一個 a.txt 文件ntouch a.txtnn// 添加指定文件到暫存區ngit add a.txtn
- 提交文件
// 提交暫存區到本地倉庫區ngit commit -m 添加文件 a.txt n
這樣你就記錄下添加a.txt文件的修改
四、Git的基本使用
4.1 Git的基本概念
- 工作區 (Working Directory)
工作區就是你本機操作文件的地方
- 暫存區 (Stage)
當你初始化倉庫時,你會發現工作區里多了個.git
的文件夾,這就是本地倉庫。這裡有個很重要的區域就是暫存區
,當你執行git add
的時候,其實就是把文件修改添加到暫存區。
- 本地倉庫 (History)
.git文件夾就是本地倉庫,裡面還有一個重要區域就是默認的master分支,當你執行git commit
的時候,其實就是把暫存區的所有內容添加到當前分支上。
4.2 添加文件並提交
- git add
添加修改文件到暫存區
- git status
查看工作區的變化
- git commit
把暫存區所有內容提交到當前分支上
- git pull
取回遠程倉庫的變化
- git push origin master
上傳本地master分支到遠程倉庫
4.3 版本回退
現代的人總想回到過去,可是時間是回不去的,但是Git可以實現你的願望。
首先你要知道你想回到哪個版本,通過git log
查看當前分支提交記錄,
HEAD
指向當前分支master,而master
指向提交,也就是下面的commit_id (aa81633220d368b5f1...)git lognncommit aa81633220d368b5f1bc0677e676e2a118ab188e (HEAD -> master)nAuthor: JACK <shizhengchun2015@gmail.com>nDate: Sun Dec 31 11:28:44 2017 +0800nn 添加 b.txtnncommit 91ff12ff6685a7316cecf83c85bbcc96a8d63e39nAuthor: JACK <shizhengchun2015@gmail.com>nDate: Sun Dec 31 11:24:25 2017 +0800nn 添加 a.txtn
其次就是讓我們回到過去,通過git reset --hard commit_id
git reset --hard 91ff12ff668nHEAD is now at 91ff12f 添加 a.txtnn// 查看當前文件夾,發現已經回到添加a.txt的狀態了nlsna.txtnn// 再次查看當前提交歷史ngit lognncommit 91ff12ff6685a7316cecf83c85bbcc96a8d63e39 (HEAD -> master)nAuthor: JACK <shizhengchun2015@gmail.com>nDate: Sun Dec 31 11:24:25 2017 +0800nn 添加 a.txtn
這個時候有人發現,那我還能回到添加 b.txt 文件的狀態嗎?恩,Git無所不能
想要回到未來,通過查看命令歷史git reflog
,我們就找到添加 b.txt 的commit_id,這樣我就可以回到未來了
git reflognn91ff12f (HEAD -> master) HEAD@{0}: reset: moving to 91ff12ff668naa81633 HEAD@{1}: commit: 添加 b.txtn91ff12f (HEAD -> master) HEAD@{2}: commit (initial): 添加 a.txtnnngit reset --hard aa81633nHEAD is now at aa81633 添加 b.txtnn// 此時文件夾有了b.txt 我們成功回到未來nlsna.txt b.txtn
總結一下:
- HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。
- 用git log可以查看提交歷史,以便確定要回退到哪個版本。
- 用git reflog查看命令歷史,以便確定要回到未來的哪個版本。
五、Git的高級使用
5.1 本地新建Git項目並推送遠程空倉庫
- 本地初始化Git項目庫
git initn
- 遠程新建空倉庫,(注意空倉庫就是什麼都沒有)
到GitHub新建倉庫就行,新建成功就是這個樣子
- 關聯本地倉庫和遠程空倉庫
// origin後面是你自己倉庫的地址,別搞錯了nngit remote add origin git@server-name:path/repo-name.gitn
- 推送本地倉庫到遠程
關聯後,使用命令git push -u origin master
第一次推送master分支的所有內容
5.2 分支管理
Git還有一個優勢就是分支設計非常優秀,之前說過HEAD
是指向分支的,當你初始化倉庫時會默認產生master
分支,所以默認HEAD是指向maser分支的。
其實切換分支的本質就是改變HEAD
的指向,工作區什麼都沒有變。
新建一個分支dev
,其實就是新建一個指針dev,並且指向和master相同的提交,同時讓HEAD
指向dev
// 新建分支devngit branch devnn// 切換到分支devngit checkout devnn----------------n// 其實可以一步到位,加參數-b就可以ngit checkout -b devn
那現在工作區改變文件,提交文件就是在dev上面了,假如新提交一個commit,那麼dev指針向前一步,但maser不變
OK,那我們現在來合併分支,其實原理就是把master指向dev當前的提交
// 首先切換到master分支ngit checkout masternn// 查看分支,帶`*`的符合就是當前分支nngit branchnn// 把dev分支合併到master分支上nngit merge devn
dev的分支使命已經完成了,那我們那刪除dev分支,其實刪除分支就是刪除dev指針而已。
git branch -d devn
Git上面操作分支就是這樣簡單有效
總結一下:
- 查看分支:git branch
- 創建分支:git branch <name>
- 切換分支:git checkout <name>
- 創建+切換分支:git checkout -b <name>
- 合併某分支到當前分支:git merge <name>
- 刪除分支:git branch -d <name>
其實Git還有很多命令,這些其實只是很小的一部分,但是我覺得掌握Git的基本概念後,其實遇到問題,其實可以搜索Git來學習。
才疏學淺,歡迎指導批評
參考鏈接
- 常用 Git 命令清單
- 廖雪峰的Git教程
- 圖解Git
推薦閱讀:
※說說Git reset 與 revert 的故事
※Visual Studio Code 使用Git進行版本控制
※git 怎麼在倉庫裡面上傳一個文件夾到github?