本文來自網易雲社區html
做者:任江英git
你的本地倉庫由 git 維護的三棵「樹」組成。第一個是你的 工做目錄,它持有實際文件;第二個是 暫存區(Index),它像個緩存區域,臨時保存你的改動;最後是 HEAD,它指向你最後一次提交的結果。正則表達式
1.工做區(working directory) 2.暫存區(stage index) 3.歷史記錄區(history)緩存
它是你實際持有的文件,是你能夠看獲得的文件目錄安全
它是一個包含文件索引的目錄樹,像是一個虛擬的工做區。在這個虛擬的工做區的目錄樹中,記錄了文件名、文件的狀態信息(時間戳,文件長度),文件的內容並不存儲其中,而是保存在Git對象庫(.git/objects)中,文件索引創建了文件和對象庫中對象實體之間的對應服務器
這個命令將工做目錄中的變化添加到緩存區 它實際上作了兩件事:編輯器
將本地文件的時間戳、長度,當前文檔對象的id等信息保存到暫存區中去svn
將本地文件的內容作一個快照並保存到Git的對象庫中。工具
在這個圖中,咱們能夠看到部分 Git 命令是如何影響工做區和暫存區(stage, index)的:測試
圖中左側爲工做區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區,標記爲 "master" 的是 master 分支所表明的目錄樹。 //圖中咱們能夠看出此時 "HEAD" 實際是指向 master 分支的一個「遊標」。因此圖示的命令中出現 HEAD 的地方能夠用 master 來替換。 圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 ".git/objects" 目錄下
當對工做區修改或新增文件,執行‘git add’命令時,暫存區的目錄樹被更新,同時工做區修改或新增的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中
git add <file>git add <directory>git add -p
將中的更改保存到暫存區 將下的更改保存到暫存區 開始交互式的保存,你能夠選擇文件的一部分保存到暫存區。它會向你展現一堆更改,而後等待你輸入命令。y將這塊更改加入緩存;n忽略這塊更改; q推出;
當執行這個操做時,暫存區的目錄樹(快照)將被寫到版本庫(對象庫)中。 它記錄的是快照,而不是記錄差別
git commitgit commit -m 'message'git commit -a
提交已緩存的快照,它會運行文本編輯器,等待你輸入提交信息。當你完成輸入後,保存文件,關閉編輯器,完成提交
提交快照。做爲提交信息,不用在運動文本編輯器了。
提交一份包含工做目錄全部更改的快照,至關於運行了git add 把全部當前目錄下的文件加入stage暫存,而後再運行git commit
當執行「git status」命令掃描工做區改動的時候,先依據.git/index文件中記錄的時間戳、長度等信息判斷工做區文件是否改變。若是工做區的文件時間戳改變,說明文件的內容可能被改變,須要打開文件,讀取文件內容,和更改前的原始文件相比較(本地文件和與之對應的object庫中的文件的內容進行對比),判斷文件內容是否被更改。若是文件內容沒有改變,則將該文件新的時間戳記錄到 .git/index 文件中。由於判斷文件是否更改,使用時間戳、文件長度等信息進行比較要比經過文件內容比較要快的多,因此 Git 這樣的實現方式可讓工做區狀態掃描更快速的執行,這也是 Git 高效的因素之一。
git status命令顯示工做目錄和暫存區的狀態。你能夠看到哪些被緩存了,哪些尚未,以及哪些還未被Git跟蹤。status的輸出不會告訴你已經提交的信息。若是你想看,就用git log.
這個命令告訴你 git add和git commit的進展??
git log 命令顯示已經提交的快照。
與git status的區別
git status容許你查看工做目錄和暫存區,git log只做用於提交的項目歷史。
git log -n <limit> //用 <limit> 限制提交的數量。好比 git log -n 3 只會顯示 3 個提交。git log --oneline //將每一個提交壓縮到一行。當你須要查看項目歷史的上層狀況時這會頗有用。git log --stat //除了 git log 信息以外,包含哪些文件被更改了,以及每一個文件相對的增刪行數。git log -p //顯示錶明每一個提交的一堆信息。顯示每一個提交所有的差別(diff),這也是項目歷史中最詳細的視圖。git log --author="<pattern>" //搜索特定做者的提交。<pattern> 能夠是字符串或正則表達式。git log --grep="<pattern>" //搜索提交信息匹配特定 <pattern> 的提交。<pattern> 能夠是字符串或正則表達式。 git log <since>..<until> //只顯示發生在 <since> 和 <until> 之間的提交。兩個參數能夠是提交 ID、分支名、HEAD 或是任何一種引用。git log <file> //只顯示包含特定文件的提交。查找特定文件的歷史這樣作會很方便。git log --graph --decorate --oneline //還有一些有用的選項。--graph 標記會繪製一幅字符組成的圖形,左邊是提交,右邊是提交信息。--decorate 標記會加上提交所在的分支名稱和標籤。--oneline 標記將提交信息顯示在同一行,一目瞭然。
git log --author="John Smith" -p hello.py
這個命令會顯示 John Smith 做者對 hello.py 文件所作的全部更改的差別比較(diff) ..句法是比較分支頗有用的工具。下面的栗子顯示了在 some-feature 分支而不在 master 分支的全部提交的概覽。
git log --oneline master..some-feature
這個命令有三個不一樣的做用:檢出文件,檢出提交和檢出分枝; 檢出提交會使工做目錄和這個提交徹底匹配。你能夠用它來查看項目以前的狀態,而不改變當前的狀態。檢出文件使你可以查看某個特定文件的舊版本,而工做目錄中剩下的文件不變。
git checkout master
切換到master分支
git checkout <commit> <file>
回覆文件以前的版本。它將工做目錄中的文件變成中那個文件的拷貝,並將它加入緩存區
git checkout <file>
恢復暫存區的指定文件到工做區
git checkout
恢復暫存區的全部文件到工做區
git checkout <commit>
更新工做目錄中的全部文件,使得和某個特定提交中的文件一致;
使用git checkout的好處是,當你創建了項目歷史以後,git checkout是一種便捷的方式,來將保存的快照‘加載’到你的服務器上去。
檢出以前的提交是一個只讀操做。在查看舊版本的時候毫不會損壞你的倉庫。你項目「當前」的狀態在 master 上不會變化。在開發的正常階段,HEAD 通常指向 master 或是其餘的本地分支,但當你檢出以前提交的時候,HEAD 就再也不指向一個分支了————它直接指向一個提交。
另外,檢出舊文件不影響你倉庫的當前狀態。你能夠在新的快照中像其餘文件同樣從新提交舊版本。因此在效果上,git checkout的這個用法能夠將單個文件回滾到舊版本。
這個例子假定你開始了一個瘋狂的實驗,但你不肯定你是否想要保留它。爲了幫助你決定,你想看一看你開始實驗以前的項目狀態。首先,你須要找到你想要看的那個版本的 ID。
git log --oneline
假設你的項目歷史看上去和下面同樣:
b7119f2 繼續作些喪心病狂的事 872fa7e 作些喪心病狂的事 a1e8fb5 對 hello.py 作了一些修改 435b61d 建立 hello.py 9773e52 初始導入
你能夠這樣使用 git checkout 來查看「對 hello.py 作了一些修改」這個提交:
git checkout a1e8fb5
這讓你的工做目錄和 a1e8fb5 提交所處的狀態徹底一致。你能夠查看文件,編譯項目,運行測試,甚至編輯文件而不須要考慮是否會影響項目的當前狀態。你所作的一切 都不會 被保存到倉庫中。爲了繼續開發,你須要回到你項目的「當前」狀態:
git checkout master
這裏假定了你默認在 master 分支上開發,咱們會在之後的分支模型中詳細討論。
一旦你回到 master 分支以後,你可使用 git revert 或 git reset 來回滾任何不想要的更改。
若是隻是想把文件恢復到以前的版本,能夠用這個操做。好比回覆道以前一個提交的文件
git checkout a1e8fb5 hello.py
檢出文件和檢出提交不一樣的地方是:檢出文件會影響到你項目的當前的狀態的。被從新檢出的文件會顯示爲‘須要提交的更改’,容許你會滾到文件以前的版本。
git revert命令是用來撤銷一個已經提交的快照。這個操做是撤銷這個提交的更改,可是對這個更改後面的提交是保留的。這避免了Git歷史項目的丟失,這一點對項目的版本歷史和協做的可靠性是很重要的。
git revert <commit>//
生成一個撤消了引入的修改的新提交,而後應用到當前分支。
也是撤銷的一種方法,可是比較危險,由於它是一個永遠撤銷的動做,沒法得到原來的樣子。
git reset <file>
從緩存區移除特定文件,但不改變工做目錄。它會取消這個文件的緩存,但不覆蓋任何改變(若是緩存中和工做目錄不同時,會保留工做目錄,只是把這個文件的從緩存中移除)
git reset
重設緩存區,匹配最近一次的提交,但工做目錄不變,它會取消最近一次暫存的全部文件的緩存,但不更改工做項目的文件,只是給了一次重設緩存快照的機會。
git reset --hard
重設緩存區和工做目錄,匹配最近的一次提交。除了取消緩存外,--hard標記也重寫了全部工做目錄中的更改。換句話說,是清除了全部未提交的更改。
git reset <commit>
將當前分支的末端移到,將緩存區重設到這個提交,但不改變工做目錄。全部以後的更改會保留在工做目錄中,這容許你用更乾淨、原子性的快照從新提交項目歷史。就是將這個 commit以後的全部暫存都取消。
git reset --hard <commit>
將當前分支的末端移到,將緩存區和工做目錄都重設到這個提交。它不只清除了未提交的更改,同時還清除了以後的全部提交.
git reset這個操做中,沒有加--hard的是取消緩存或取消一系列的提交,工做目錄不變。可是加上--hard標記是想要從新再來的操做,取消了緩存還把工做目錄給修改了。這兩個都是永久的操做。
警告 當你操做過並把這個提交推送到公共倉庫後,就不能使用git reset,若是你使用這個以後,你會把這個以後的全部提交都撤銷,勢必會影響他人。
移除一個其餘團隊成員在上面繼續開發的提交在協做時會引起嚴重的問題。當他們試着和你的倉庫同步時,他們會發現項目歷史的一部分忽然消失了。下面的序列展現了若是你嘗試重設公共提交時會發生什麼。origin/master 是你本地 master 分支對應的中央倉庫中的分支。
git clean命令是將未跟蹤的文件從你的工做目錄中移除。這個也是個沒法撤銷的操做。
git clean -n
執行一次git clean的『演習』。它會告訴你那些文件在命令執行後會被移除,而不是真的刪除它。
git clean -f
移除當前目錄下未被跟蹤的文件。-f(強制)標記是必需的,除非 clean.requireForce 配置項被設爲了 false(默認爲 true)。它 不會 刪除 .gitignore 中指定的未跟蹤的文件。
git clean -f <path>
移除未跟蹤的文件,但限制在某個路徑下。
git clean -df
移除未跟蹤的文件,以及目錄。
git clean -xf
移除當前目錄下未跟蹤的文件,以及 Git 通常忽略的文件。
例子 若是你在本地倉庫中做死以後想要毀屍滅跡,git reset --hard 和 git clean -f 是你最好的選擇。運行這兩個命令使工做目錄和最近的提交相匹配,讓你在乾淨的狀態下繼續工做。
git remote git fetch git pull
git fetch命令是將提交從遠程庫倒入到你的本地倉庫。拉取下來的提交儲存爲遠程分支,而不是咱們一直使用的普通的本地分支,他並不會自動合併和修改你當前的工做。當你準備好時你必須手動將其合併入你的工做。
git fetch <remote> //拉取倉庫中全部的分支。同時會從另外一個倉庫中下載全部須要的提交和文件。 git fetch <remote> <branch> //只拉取指定的分支
當你但願查看其餘人的工做進展時,你須要 fetch。fetch 下來的內容表示爲一個遠程分支,所以不會影響你的本地開發。這是一個安全的方式,在整合進你的本地倉庫以前,檢查那些提交。相似於 svn update,你能夠看到中央倉庫的歷史進展如何,但它不會強制你將這些進展合併入你的倉庫。
git log --oneline master..origin/master
git pull --rebase <remote>
和上一個命令相同,但使用 git rebase 合併遠程分支和本地分支,而不是使用 git merge。
git push <remote> <branch>
將指定的分支推送到上,包括全部須要的提交和提交對象。它會在目標倉庫中建立一個本地分支。爲了防止你覆蓋已有的提交,若是會致使目標倉庫非快速向前合併時,Git 不容許你 push。
git push <remote> --force
和上一個命令相同,但即便會致使非快速向前合併也強制推送。除非你肯定你所作的事,不然不要使用 --force 標記。
git push <remote> --all
將全部本地分支推送到指定的遠程倉庫。
git push <remote> --tags
當你推送一個分支或是使用 --all 選項時,標籤不會被自動推送上去。--tags 將你全部的本地標籤推送到遠程倉庫中去。
git branch
列出倉庫中全部分支。
git branch -r //用來查看遠程分支
git branch <branch>
建立一個名爲的分支。不會 自動切換到那個分支去。
git branch -d <branch>
刪除指定分支。這是一個安全的操做,Git 會阻止你刪除包含未合併更改的分支。
git branch -D <branch>
強制刪除指定分支,即便包含未合併更改。若是你但願永遠刪除某條開發線的全部提交,你應該用這個命令。
git branch -m <branch>
將當前分支命名爲。
git diff 主要是看工做區和暫存區的不一樣 git diff --cached 查看暫存區和HEAD之間的區別(commit以後的和add以後的) git diff HEAD 查看工做區和HEAD的區別。
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
相關文章:
【推薦】 如何看待P2P領域的羊毛黨?
【推薦】 私有云爆發,將來增加空間巨大
【推薦】 HBase最佳實踐-管好你的操做系統