學(xué)習(xí)Git需要清楚的幾個(gè)術(shù)語

Workspace:工作區(qū)
Index/Stage:暫存區(qū),也叫索引
Repository:倉庫區(qū)(或本地倉庫),也存儲(chǔ)庫
Remote:遠(yuǎn)程倉庫
工作區(qū): 通過git init創(chuàng)建的代碼庫的所有文件但是不包括.git文件(版本庫)
暫存區(qū): 通過git add .//Xxx/Xxxx* 添加的修改,都是進(jìn)入到暫存區(qū)了,肉眼不可見 通過 git status 可以看到修改的狀態(tài)。
三種狀態(tài)
Git 有三種狀態(tài),你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫中。 已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。 已暫存表示對(duì)一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。
由此引入 Git 項(xiàng)目的三個(gè)工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域。工作目錄、暫存區(qū)域以及 Git 倉庫如下圖所示

Git 倉庫目錄是 Git 用來保存項(xiàng)目的元數(shù)據(jù)和對(duì)象數(shù)據(jù)庫的地方。 這是 Git 中最重要的部分,從其它計(jì)算機(jī)克隆倉庫時(shí),拷貝的就是這里的數(shù)據(jù)。
工作目錄是對(duì)項(xiàng)目的某個(gè)版本獨(dú)立提取出來的內(nèi)容。 這些從 Git 倉庫的壓縮數(shù)據(jù)庫中提取出來的文件,放在磁盤上供你使用或修改。
暫存區(qū)域是一個(gè)文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中。 有時(shí)候也被稱作‘索引’,不過一般說法還是叫暫存區(qū)域。
用戶信息
當(dāng)安裝完 Git 應(yīng)該做的第一件事就是設(shè)置用戶名稱與郵件地址。這樣做很重要,因?yàn)槊恳粋€(gè) Git 的提交都會(huì)使用這些信息,并且它會(huì)寫入到每一次提交中,不可更改:
$ git config --global user.name "maxsu"
$ git config --global user.email maxsu@yiibai.com
設(shè)置文本編輯器
$ git config --global core.editor atom
檢查配置信息
如果想要檢查你的配置,可以使用 git config --list 命令來列出所有 Git 當(dāng)時(shí)能找到的配置。
常用基礎(chǔ)命令
git add 指定跟蹤文件,然后執(zhí)行 git commit 提交
$ git add hello.py
$ git commit -m '修改說明'
要查看哪些文件處于什么狀態(tài),可以用 git status 命令。
忽略文件
總會(huì)有些文件無需納入 Git 的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表。我們可以創(chuàng)建一個(gè)名為 .gitignore 的文件,列出要忽略的文件模式。
.gitignore 的格式規(guī)范如下:
- 所有空行或者以
#開頭的行都會(huì)被 Git 忽略。 - 可以使用標(biāo)準(zhǔn)的
glob模式匹配。 - 匹配模式可以以(
/)開頭防止遞歸。 - 匹配模式可以以(
/)結(jié)尾指定目錄。 - 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(
!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式。
提示:GitHub 有一個(gè)十分詳細(xì)的針對(duì)數(shù)十種項(xiàng)目及編程語言的 .gitignore 文件列表,你可以在 http://github.com/github/gitignore 找到它。
查看已暫存和未暫存的修改
如果 git status 命令的輸出對(duì)于你來說過于模糊,你想知道具體修改了什么地方,可以用 git diff 命令。
請(qǐng)注意,git diff 本身只顯示尚未暫存的改動(dòng),而不是自上次提交以來所做的所有改動(dòng)。 所以有時(shí)候你一下子暫存了所有更新過的文件后,運(yùn)行 git diff 后卻什么也沒有,就是這個(gè)原因。
然后用 git diff --cached 查看已經(jīng)暫存起來的變化:(--staged 和 --cached 是同義詞)
跳過使用暫存區(qū)域
Git 提供了一個(gè)跳過使用暫存區(qū)域的方式, 只要在提交的時(shí)候,給 git commit 加上 -a 選項(xiàng),Git 就會(huì)自動(dòng)把所有已經(jīng)跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟。
移除文件
git rm 移除已跟蹤文件(同時(shí)會(huì)刪除工作目錄中的文件)。
如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話,則必須要用強(qiáng)制刪除選項(xiàng) -f(注:即 force 的首字母)。 這是一種安全特性,用于防止誤刪還沒有添加到快照的數(shù)據(jù),這樣的數(shù)據(jù)不能被 Git 恢復(fù)。
另外一種情況是,想讓文件保留在磁盤,但是并不想讓 Git 繼續(xù)跟蹤。 當(dāng)你忘記添加 .gitignore 文件,不小心把一個(gè)很大的日志文件或一堆 .a 這樣的編譯生成文件添加到暫存區(qū)時(shí),可以使用 --cached 選項(xiàng):
$ git rm --cached mytext.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: mytext.txt
git rm 命令后面可以列出文件或者目錄的名字,也可以使用 glob 模式。
移動(dòng)文件
$ git mv file_from file_to
查看提交歷史
默認(rèn)不用任何參數(shù)的話,git log 會(huì)按提交時(shí)間列出所有的更新,最近的更新排在最上面。
顯示最近兩次提交內(nèi)容差異:
$ git log -p -2
每次提交的簡略的統(tǒng)計(jì)信息:
$ git log --stat
另外一個(gè)常用的選項(xiàng)是 --pretty 。 這個(gè)選項(xiàng)可以指定使用不同于默認(rèn)格式的方式展示提交歷史。 這個(gè)選項(xiàng)有一些內(nèi)建的子選項(xiàng)供你使用。 比如用 oneline 將每個(gè)提交放在一行顯示,查看的提交數(shù)很大時(shí)非常有用。 另外還有 short ,full 和 fuller 可以用,展示的信息或多或少有些不同。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
撤消操作
有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒有添加,或者提交信息寫錯(cuò)了,可以運(yùn)行帶有 --amend 選項(xiàng)的提交命令嘗試重新提交:
$ git commit --amend
這個(gè)命令會(huì)將暫存區(qū)中的文件提交。 如果自上次提交以來你還未做任何修改(例如,在上次提交后馬上執(zhí)行了此命令),那么快照會(huì)保持不變,而你所修改的只是提交信息。
例如,提交后發(fā)現(xiàn)忘記了暫存某些需要的修改,可以像下面這樣操作:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
最終你只會(huì)有一個(gè)提交 - 第二次提交將代替第一次提交的結(jié)果。
取消暫存的文件
reset 后面不跟參數(shù)就是取消所有。
git reset HEAD mytext.txt
撤消對(duì)文件的修改
git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: 123
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: 123
按照說明輸入命令撤銷
git checkout -- 123
隱藏(Stash)操作
要切換任務(wù)做其他的,但不想提交一直在做的工作; 那么可以把當(dāng)前工作的改變隱藏起來。 要將一個(gè)新的存根推到堆棧上,運(yùn)行 git stash 命令。通過使用 git stash list 命令來查看已存在更改的列表。執(zhí)行 git stash pop 命令即可從堆棧中刪除更改并將其放置在當(dāng)前工作目錄中。
查看遠(yuǎn)程倉庫
如果想查看你已經(jīng)配置的遠(yuǎn)程倉庫服務(wù)器,可以運(yùn)行 git remote 命令。 它會(huì)列出你指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡寫。
指定選項(xiàng) -v,會(huì)顯示需要讀寫遠(yuǎn)程倉庫使用的 Git 保存的簡寫與其對(duì)應(yīng)的 URL。
添加遠(yuǎn)程倉庫
git remote add <shortname> <url>
從遠(yuǎn)程倉庫中抓取與拉取
git fetch [remote-name]
這個(gè)命令會(huì)訪問遠(yuǎn)程倉庫,從中拉取所有還沒有的數(shù)據(jù)。執(zhí)行完成后,將會(huì)擁有那個(gè)遠(yuǎn)程倉庫中所有分支的引用,可以隨時(shí)合并或查看。
如果使用 clone 命令克隆了一個(gè)倉庫,命令會(huì)自動(dòng)將其添加為遠(yuǎn)程倉庫并默認(rèn)以 “origin” 為簡寫。 所以,git fetch origin 會(huì)抓取克隆(或上一次抓取)后新推送的所有工作。 必須注意 git fetch 命令會(huì)將數(shù)據(jù)拉取到本地倉庫, 它并不會(huì)自動(dòng)合并或修改當(dāng)前的工作。
如果你有一個(gè)分支設(shè)置為跟蹤一個(gè)遠(yuǎn)程分支,可以使用 git pull 命令來自動(dòng)的抓取然后合并遠(yuǎn)程分支到當(dāng)前分支。 這對(duì)你來說可能是一個(gè)更簡單或更舒服的工作流程;默認(rèn)情況下,git clone 命令會(huì)自動(dòng)設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉庫的 master 分支(或不管是什么名字的默認(rèn)分支)。 運(yùn)行 git pull 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。
推送到遠(yuǎn)程倉庫
推送命令: git push [remote-name] [branch-name] 。
$ git push origin master
查看遠(yuǎn)程倉庫
查看遠(yuǎn)程倉庫的更多信息: remote show [remote-name] 。
$ git remote show origin
遠(yuǎn)程倉庫的移除與重命名
$ git remote rename old new
更多詳細(xì)命令請(qǐng)參考
https://git-scm.com/book/zh/v2
http://www.yiibai.com/git/