多用Git少交稅
一、為什么要了解Git
Git是一套版本管理系統。看到“Git版本管理”,一大部分盆友已經轉身想走,在你握著門把手準備開門走人時,請最后聽我說完最后一句:人人都需要版本管理,git可以幫你少交停電/藍屏/死機稅,提高產出效率,不來一發嗎?
試過半夜寫匯報ppt嗎?'匯報ppt'→'匯報ppt1'→'匯報ppt11'→'匯報ppt2015-03-17'→'匯報 ppt2015-03-17新'→'匯報ppt2015-03-17新1'……無休止的命名斗爭,這就是自然而然的版本管理,只不過,沒有好的工具,所以 顯得一團mess。
無論學生黨還是設計師(改20個版本后終于順利用回第1版),無論公眾號運營還是音樂人,都持續產出著自己的“半成品/作品”。99.999%的作 品都不可能一氣呵成,比如這篇筆記的第一個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.遠程倉庫
四、常用命令
最常用:git command --help
1.創建
需要進入目標目錄進行操作
-
創建新倉庫:
git init
-
創建一個本地倉庫的克隆版本:
git clone /path/to/repository
-
克隆遠端服務器上的倉庫:
git clone username@host:/path/to/repository
2.查詢
git status
- staged:已在index,等待被commit.
- unstaged:文件做了改動,但還不能被commit.
- untracked:Git還沒有開始跟蹤,需要先add.
- deleted:文件已被刪除,等待remove.
Staging Area:commit前把文件們收集到一起,以便打包commit。
3.add/添加
-
添加到暫存區(讓Git開始跟蹤更改,也就是從untracked變為tracked):
git add <filename>
或git add *
-
添加全部文件:
git add -A
, -A 表示包含刪除的文件。 -
git reset:
git reset <filename>
從staging area移除文件。
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>
。
5.push/推送
將文件推送到遠程倉庫中:git push -u origin master
。遠程倉庫默認叫origin 。-u 告訴Git記住參數,下次可以直接使用push。
6.pull/拉取
更新本地倉庫至最新改動:git pull origin master
7.checkout/切換
checkout命令用于從歷史提交(或者暫存區域)中拷貝文件到工作目錄,也可用于切換分支
-
切換分支:
git checkout <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>
-
恢復之前版本:
git reset --hard
-
回滾到最近一次:
git checkout -- <target>
10.merge
合并其他分支到當前分支:git merge
11.remove & clean
-
從硬盤和index移除文件:
git rm
-
刪除分支
git branch -d <branch name>
五、待解決問題
- 每次push需要輸入github用戶名密碼
Ref
[1]. Git簡明指南
[2]. What are the git concepts of HEAD, master, origin?
[3]. Try Git
[4]. 圖解Git
[5]. Pro Git中文版
[6]. Gitmagic中文版