一、為什麼要了解Git
Git是一套版本管理系統。看到“Git版本管理”,一大部分盆友已經轉身想走,在你握著門把手準備開門走人時,請最後聽我說完最後一句:人人都需要版本管理,git可以幫你少交停電/藍屏/死機稅,提高產出效率,不來一發嗎?
試過半夜寫彙報ppt嗎?'彙報ppt'→'彙報ppt1'→'彙報ppt11'→'彙報ppt2015-03-17'→'彙報ppt2015-03-17新'→'彙報ppt2015-03-17新1'……無休止的命名鬥爭,這就是自然而然的版本管理,只不過,沒有好的工具,所以顯得一團mess。
無論學生黨還是設計師(改20個版本後終於順利用回第1版),無論公眾號運營還是音樂人,都持續產出著自己的“半成品/作品”。99.99%的作品都不可能一氣呵成,比如這篇筆記的第一個commit版本,簡直慘不忍睹。如果有版本管理意識,以及高效、方便的工具,生活也許可以簡單許多,更不要說天有不測風雲的停電忘保存、腦殘刪備份等等好事等著我們。
來吧,fork有用有趣的東西,git你應該在意的東西,日拱一卒,打造我們的作品。
二、Git主要概念
Git實現在本地和遠端進行版本管理。
1.工作空間
四個空間概念:工作目錄(workspace),暫存區(index),本地倉庫(local repository),遠程倉庫(remote repository)
想象一下,我們開一個包子店(圖片做的不是同一款包子,見諒)~
- 首先,得有一張大桌子用來和麵、擀皮兒、包餡等等,這張桌子相當於workspace,隨你折騰的地方,工作主要都在這裡進行。
- 然後,包好的包子們會放到一個蒸籠裡,等待被蒸,這個蒸籠就是index暫存區。蒸籠用來放我們想保留的成品或半成品,至於選哪些賣出去,這是以後考慮的事情。
- 下一步,蒸包子。蒸好的包子已經可以吃了,但是我們還是得先把它們從蒸籠拿出來放在 盤子裡。盤子就類似本地倉庫local repository,裡面都是等待出貨的好東西。當然,你也可以在最後一刻把看不順眼的包子扔掉,或者自己吃掉。
- 最後一步就是把包子送到貨架/客人的桌上。公之於眾的貨架,就是遠程倉庫remote repository,醜媳婦終於見公婆啦。
配合下面這張圖,我們對Git就有一個基本概念了。
2.Head & branch & master & origin
Git系統的實質更像是一棵大樹,樹幹(就是Head啦)是最後一次提交的成果。在樹幹上,你可以開無數的分支(就是branch啦)胡弄,弄亂了也不怕,大不了剪掉再開一個,樹幹不受任何影響。折騰ok的分支,最後可以merge到默認branch也就是master上。
用技術性語言描述,分支用來將特性開發絕緣開來。在創建倉庫的時候,master 是“默認的”分支。在其他分支上進行開發,完成後再將它們合併到主分支上。
那origin又是什麼?origin是遠程默認的倉庫。clone完成之後,Git會自動將遠程倉庫命名為origin。
那Head和master又是什麼關係?Head其實只是個指針,指向當前最近commit的branch。而master是本地默認的branch,所以Head經常都是指向master。另外Head是官方定義的,而master和origin都是大家常用的命名,並不一定要叫master和origin。[2]
3.工作流:add & commit & push
- 把包子從桌子挪到蒸籠,叫add————已修改modified————彙報ppt初稿寫成;
- 把包子從蒸籠挪到盤子,叫commit————已暫存staged————彙報ppt完稿存到u盤/網盤什麼的;
- 把包子從盤子挪到貨架,叫push————已提交commited——彙報ppt發送到boss郵箱。
Git的好處之一是,包子包好後,還可以回退……
捷徑:
三、配置
1.工作目錄 2.本地倉庫 3.遠程倉庫
四、常用命令
最常用:
<code>git command --help/<code>
1.創建
需要進入目標目錄進行操作
- 創建新倉庫:git init
- 創建一個本地倉庫的克隆版本:git clone /path/to/repository
- 克隆遠端服務器上的倉庫: git clone username@host:/path/to/repository
2.查詢
<code>git status/<code>
- staged:已在index,等待被commit.
- unstaged:文件做了改動,但還不能被commit.
- untracked:Git還沒有開始跟蹤,需要先add.
- deleted:文件已被刪除,等待remove.
Staging Area:commit前把文件們收集到一起,以便打包commit。
3.add/添加
- 添加到暫存區(讓Git開始跟蹤更改,也就是從 untracked變為tracked):git add <filename> 或 git add */<filename>
- 添加全部文件:git add -A, -A 表示包含刪除的文件。
- git reset: git reset <filename> 從staging area 移除文件。/<filename>
4.commit/提交
"commit" 可以理解為一次快照,幫助我們把所有改動以timeline的方式組織起來。
- 提交改動(到head,但還沒到遠程服務器):git commit -m "代碼提交信息" git commit -m 'Add all files'
- 把所有當前目錄下的文件加入暫存區域再運行commit:git commit -a
- 提交到遠程倉庫:git push origin master (可以把 master 換成你想要推送的任何分支)。 如果還沒有克隆現有倉庫,並想將倉庫連接到某個遠程服務器:git remote add origin <server>。/<server>
5.push/推送
將文件推送到遠程倉庫中:git push -u origin master。遠程倉庫默認叫origin 。-u 告訴Git記住參數,下次可以直接使用push。
6.pull/拉取
更新本地倉庫至最新改動:git pull origin master
7.checkout/切換
checkout命令用於從歷史提交(或者暫存區域)中拷貝文件到工作目錄,也可用於切換分支
- 切換分支: git checkout <branch> /<branch>
- 新建並切換到分支:git checkout -b new_branch 等同於:git branch new_branch + git checkout new_branch
- 把文件從暫存區域複製到工作目錄,用來丟棄本地修改:git checkout --<files>
- 回滾到複製最後一次提交:git checkout HEAD -- <files>
8.diff/比對
git diff
9.reset/撤銷
- 從index中撤銷所有文件:git reset
- 從index中撤銷最後一次add的文件:git reset --<flies> /<flies>
- 恢復之前版本:git reset --hard
- 回滾到最近一次:git checkout -- <target>
10.merge
合併其他分支到當前分支:git merge
11.remove & clean
- 從硬盤和index移除文件:git rm
- 刪除分支git branch -d <branch>
Ref
HackYourself 關注普通人的心智升級,用知識的力量、用微小但持續有效的行動,每天做自我迭代升級。
00 向你推薦:
閱讀更多 Hackyourself 的文章