git從入門到放棄

到你想進行版本控制的文件所在的目錄下(該目錄便是工做區) 查看狀態 git statushtml

初始化 git initgit

添加到暫存區 git addsegmentfault

提交到版本庫 git commit -m "註釋"3d

爲何Git添加文件須要兩步呢?一步add,一步commit。嘿嘿,由於commit命令能夠一次提交多個文件,因此你能夠屢次使用add命令呢。(至關於在某地集合而後你們一塊兒去網吧開黑,固然你也能夠自個去)版本控制

然而咱們在工做區的文本中添加一行內容

想知道作了哪些修改的話可使用命令 git diff(僅對已追蹤的文件好使)code

再次修改文件再次添加htm

版本回滾

多添加提交幾回 用git log命令能夠查看最近幾回提交的版本。若是你發現內容太多,能夠用這個命令查看 git log --pretty=oneline -n(n表示顯示幾條記錄)blog

在Git中咱們用HEAD表示當前版本,也就是咱們最新提交的,上一個版本就應該這麼表示」HEAD^「,再上一個版本就這樣表示」HEAD^^「,固然若是有幾十個版本或者1000個版本,咱們還要寫1000個^,這是不可能的,因此喲。咱們寫成這樣HEAD~1000get

回退到上一版本git reset --hard HEAD^(慎用,瞭解詳情it

想回到某個版本 git reset --hard 版本號(這個會改變工做區,暫存區的數據,慎用,瞭解詳情)

咱們在工做區新建一個文本b.txt,再git status查看狀態,提示

由於工做區新建的b.txt沒有被add到暫存區,git提示咱們有一個untracked(未被追蹤)的文件。(能夠用git add <file>命令添加到暫存區)

在工做區修改已經git add 過的readme.txt文本,查看狀態提示:

changes not staged for commit :意思是readme.txt已經被修改了但還未添加到暫存區 Git會告訴你有你個文件被修改,你有兩個選擇,一個用 git add 提交到暫存區,另外一個是用git checkout能夠丟棄工做區的修改。命令git checkout -- readme.txt意思就是,把readme.txt文件在工做區的修改所有撤銷(discard changes(放棄修改)),這裏有兩種狀況:

  • 一種是readme.txt自修改後尚未被放到暫存區,如今撤銷修改就回到和版本庫如出一轍的狀態;
  • 另外一種是readme.txt已經添加到暫存區後,又做了修改,如今撤銷修改就回到添加到暫存區後的狀態。 總之,就是讓這個文件回到最近一次git commit或git add時的狀態。

當咱們把修改的readme.txt和新建的b.txt添加到暫存區的時候

use "git reset HEAD <file>..." to unstage 意思是git reset HEAD <file> 能夠把暫存區中的修改撤消掉,就是你git add <file> 後就後悔了,發現你其實不想添加文件到暫存區,就能夠用這個命令,原理是讓當前分支對應的內容,覆蓋掉暫存區的內容,這樣就至關於咱們沒有提交 大概意思是除了存在未跟蹤的文件外,未添加任何提交 ,說明暫存區是空的,告訴咱們能夠用git add <file> 跟蹤文件 這意味著你有一個乾淨的工做目錄——換句話說,已追蹤的檔案沒有被修改; Git 也沒有看到任何未追蹤檔案,否則它們會在這裡被列出來; b.txt同時被列在已預存「及」未預存。 這怎麼可能? 原來 Git 在你執行 git add 命令時,的確將當時的檔案內容預存起來; 若是你現在提交,最後一次執行 git add 命令時,那個當下的 b.txt 的版本會被提交,而不是在提交時你在工做目錄所看到的檔案版本被提交; 若是你在 git add 後修改檔案,你必需再次執行 git add 預存最新版的檔案:

簡潔的狀態輸出

雖然 git status 輸出內容相當全面,但也相當囉嗦; Git 另外提供一個簡潔輸出的選項,所以你能夠以一種較精簡的方式來檢視你的修改; 若是你執行 git status -s 或 git status --short,你能夠從該命令獲得一個相當簡單的輸出內容:

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

未追蹤的新檔案在開頭被標示為 ??、被加入預存區的新檔案被標為 A、已修改檔案則是 M 等等。 標記有二個欄位——左邊欄位用來指示「預存區」狀態,右邊欄位則是「工做目錄」狀態。 因此在這個範例中,在工做目錄中的檔案 README 是已修改的,但還沒有被預存;而 lib/simplegit.rb 檔案則是已修改且已預存的; Rakefile 則是曾經修改過也預存過,但之後又再次修改,因此總共有二次修改,一個有預存一個沒有。

git diff 會對比【工做目錄】和【暫存區】間的內容,,而後將【工做目錄】已修改但未存入【暫存區】的內容展現出來

git diff --staged會對比【暫存區】和版本庫中最新的一個版本,即最後一次commit上去的內容,把【暫存區】和【版本庫】的差別展現出來,若是同樣,無返回(--staged和--cached是一回事)

對比的是已追蹤的文件

git commit -a -m "註釋" Git 在提交前自動預存全部已追蹤的檔案,讓你略過 git add 步驟(前提是文件已被追蹤) 在提交以前,你並不須要執行 git add 來預存 b.txt 檔案; 那是因為 -a 選項會納入全部已變更的檔案; 很方便,但請當心,有時候它會納入你並不想要的變更。

image

若是將【工做目錄】即電腦本地的文件刪除(rm <file>),git status會顯示:有變動但未添加到【暫存區】,暫存區有而工做目錄沒有 若是接下來執行 git rm,【暫存區】會記錄該檔案的移除動做 另外一個有用的技巧是保留工做目錄的檔案,但將它從預存區中移除; 換句話說,你或許想保留在磁碟機上的檔案但不但願 Git 再繼續追蹤它; 當你忘記將某些檔案加到 .gitignore 中並且不當心預存它的時候會特別用有,像是不當心預存了一個大的日誌檔案或者一堆 .a 已編譯檔案。 加上 --cached 選項可作到這件事:

git rm --cached

git rm --cached 只刪除暫存區的文件,rm 只刪除工做目錄的文件,git rm 工做目錄和暫存區的文件都刪除

git mv b.txt bb.txt 可給文件改名

git add -A 和 git add . 的區別
  • git add . :他會監控工做區的狀態樹,使用它會把工做時的全部變化提交到暫存區,包括文件內容修改(modified)以及新文件(new),但不包括被刪除的文件。
  • git add -u :他僅監控已經被add的文件(即tracked file),他會將被修改的文件提交到暫存區。add -u 不會提交新文件(untracked file)。(git add --update的縮寫)
  • git add -A :是上面兩個功能的合集(git add --all的縮寫)

參考 參考二 參考三 參考四

相關文章
相關標籤/搜索