1. 程式人生 > >git從入門到放棄

git從入門到放棄

它的 可能 十個 car read 暫存區 sub 添加 技巧

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

技術分享圖片

初始化 git init

技術分享圖片
技術分享圖片

添加到暫存區 git add

技術分享圖片

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

技術分享圖片

為什麽Git添加文件需要兩步呢?一步add,一步commit。嘿嘿,因為commit命令可以一次提交多個文件,所以你可以多次使用add命令呢。(相當於在某地集合然後大家一起去網吧開黑,當然你也可以自個去)

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

技術分享圖片

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

技術分享圖片

再次修改文件再次添加

技術分享圖片

版本回滾

多添加提交幾次
用git log命令可以查看最近幾次提交的版本。如果你發現內容太多,可以用這個命令查看 git log --pretty=oneline -n(n表示顯示幾條記錄)

技術分享圖片
在Git中我們用HEAD表示當前版本,也就是我們最新提交的,上一個版本就應該這麽表示”HEAD^“,再上一個版本就這樣表示”HEAD^^“,當然如果有幾十個版本或者1000個版本,我們還要寫1000個^,這是不可能的,所以喲。我們寫成這樣HEAD~1000

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

技術分享圖片
技術分享圖片
想回到某個版本 git reset --hard 版本號(這個會改變工作區,暫存區的數據,慎用,了解詳情)

技術分享圖片

技術分享圖片

技術分享圖片
技術分享圖片

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

技術分享圖片
因為工作區新建的b.txt沒有被add到暫存區,git提示我們有一個untracked(未被追蹤)的文件。(可以用git add 命令添加到暫存區)

在工作區修改已經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 ..." to unstage 意思是git reset HEAD 可以把暫存區中的修改撤消掉,就是你git add
後就後悔了,發現你其實不想添加文件到暫存區,就可以用這個命令,原理是讓當前分支對應的內容,覆蓋掉暫存區的內容,這樣就相當於我們沒有提交
技術分享圖片
技術分享圖片
大概意思是除了存在未跟蹤的文件外,未添加任何提交 ,說明暫存區是空的,告訴我們可以用git add 跟蹤文件
技術分享圖片
這意味著你有一個乾淨的工作目錄——換句話說,已追蹤的檔案沒有被修改; 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 選項會納入所有已變更的檔案; 很方便,但請小心,有時候它會納入你並不想要的變更。
技術分享圖片

技術分享圖片
如果將【工作目錄】即電腦本地的文件刪除(rm ),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的縮寫)

參考
參考二
參考三
參考四

git從入門到放棄