可以先找一個已經被git管理的專案, 我就使用這個專案吧: https://github.com/solenovex/ID3-Editor
基本工作流程
克隆以後呢, 進入該目錄檢視一下狀態:
然後新增一個檔案叫 z0.txt, 然後新增點文字:
然後再檢視狀態:
隨後我使用git add z0.txt讓這個檔案被git追蹤, 然後再檢視狀態:
這時git告訴我有變化需要被commit.
這時檔案是在staging 區裡面:
這時執行git commit, 輸入資訊之後, 就會回到命令列:
master後邊那一串字串就是這次commit的id.
這時再檢視狀態:
我的分支領先於origin/master一個commit.
commit之後會, 所有在staging區的檔案都會被commit的:
如果這時執行git push命令, 那麼就會把本地的新commit推送到遠端倉庫(remote repository).
不過我這裡先要執行一下git pull命令:.git pull origin master.
這句話就是把有可能發生在遠端倉庫的變化拉取到本地的倉庫, 就是為了保證我本地的程式碼是最新的.
命令執行後告訴我, 這個是最新的.
最後執行git push origin master:
這個命令將會把本地所有的commit推送到遠端的倉庫, 也就是origin這個名的倉庫的master分支上.
這時有可能要求你輸入使用者名稱和密碼.
這裡也顯示了包含了哪些commit.
這時在遠端倉庫就可以看到這個檔案了.
檔案相關操作.
追蹤檔案.
修改一下z0.txt的內容, 然後檢視狀態:
這時呢, 我想直接commit這個檔案, 也就是把add和commit過程合併成一步:
git commit -am "xxxx"
git commit -a的作用就是把所有的變化新增到了staging 區, 然後直接就commit了.
這個命令只針對被追蹤的檔案起作用, 那麼什麼是被追蹤的(tracked)檔案呢?
就是git所知道要追蹤的檔案.....就是已經被commit到repository或者被add到index/staging區的檔案.
想知道檔案是否被追蹤了, 就需要使用這個命令:
git ls-files
這個命令會列出當前repository所追蹤的所有檔案.
編輯檔案.
編輯一個z0.txt, 並且新增一個z1.txt並寫點內容, 檢視狀態:
可以看到這兩個檔案分別處於不同的狀態.
z0是等待被commit, z1則是還沒有被新增到staging 區.
如果現在執行git commit命令, 那麼它只會對z0起作用.
而這時這個新檔案的狀態不變:
這時把這個檔案新增到staging 區:
然後我再改一下這個檔案的內容, 然後再檢視一下狀態:
儘管是同一個檔案, git還是把每次變化分開來追蹤的: 已經在staging區的和不在staging區的.
這時再用git add把該檔案的變化新增到staging 區:
然後git commit:
遞迴新增檔案.
建立多級資料夾:
然後分別在這幾個目錄內建立檔案並寫上點內容. 檢視狀態:
這裡只能看到根目錄的一個資料夾有變化, 並不能遞迴的看到所有的檔案變化.
但我可以使用git add .這個命令來遞迴的新增檔案變化.
然後commit:
可以看到這幾個檔案都被新增到git repository裡面了.
退回變化.
沒有變化的時候, 狀態應該是這樣的:
然後修改一個檔案並執行git add, 檢視狀態:
如果不想要這個變化了, 想把這個變化退出staging區,或者叫unstage:
就可以按照圖示的命令執行 git reset HEAD z0.txt.
然後該變化就是這個狀態了:
但是檔案的內容還是我修改過的內容.
如果我不想要這個檔案有任何變化, 也就是想讓這個檔案退回到上次commit的內容, 那麼執行:
上面那個命令圖已經告訴我怎麼做了 git checkout -- z0.txt:
檔案的內容也恢復到原來了.
檔案更名/移動.
使用git mv 原始檔名 新檔名 來為檔案改名.
檢視狀態:
git已經把該變化新增到了staging區.
然後 commit即可.
最好的實踐就是在修改檔案內容之前改檔名, 這樣git更方便追蹤該檔案.
如果使用系統的命令去改檔名:
那麼git認為這是兩個動作: 刪除了老檔案, 新增個新檔案.
使用git add -A 這個命令, 它會遞迴的新增變化, 也會更新改名,移動, 刪除的檔案.
這時git就會認為我是把檔案改名了.
然後commit即可.
現在再改一個檔名:
如果我不想改名了, 想該回去, 那麼 還是使用git mv即可, 不過引數是相反的:
就相當於未發生任何變化.
下面我要移動檔案到另一個資料夾.
使用git mv移動一個檔案, 然後看狀態:
然後commit即可.
下面直接使用系統的mv命令把該檔案移動回去.
git會把它當成兩個動作.
還是同樣使用git add -A:
同樣git就會認為這是一個改名/更換目錄的動作了.
然後commit即可.
然後我用系統的檔案瀏覽器去改檔名.
把z2改成z1:
同樣, git 認為這是兩個動作:
然後git add該檔案, 使用git add -u 更新index:
刪除檔案.
建立一個新檔案, 然後使用 git rm刪除該檔案, 這是會報錯的:
所以應該使用系統的命令/操作去刪除該檔案.
就相當於完全沒有變化.
然後我要刪除git追蹤的檔案z1.txt, 就應該使用git rm z1.txt 命令:
現在檔案沒了, 但是還不是最終的結果, 還需要commit.
再刪除一個追蹤的檔案z00.txt.
現在不想刪了, 使用git reset HEAD z00.txt 這裡必須包括精確的檔名.
執行該命令後, 該檔案依然沒有出現.
看下狀態:
這個檔案目前被追蹤了, 但是並不在working directory裡面.
所以之前的git reset只是unstage了這個刪除動作, 並沒有恢復檔案.
所以我需要把working directory裡所有的變化都恢復, 就要使用git checkout命令.
但是如果使用系統/命令刪除一個追蹤的檔案會怎樣呢?
我用系統去刪除z00這個檔案.
可以看到git認為該檔案在working directory裡面找不到了, 這時我可以 使用git add -A, 它將新增並更新working directory裡面的變化包括改名和刪除.
這時這個變化就被加到了staging區, 然後commit即可.
下面從系統中刪除d1資料夾.
git 認為該目錄下的檔案都找不到了, 然後就應該使用git add -A:
然後stage, 然後commit即可.
再總結一下git add命令常用的幾個引數:
git add -A / git add --all: stage所有的變化
git add .: 把新建/修改的內容新增到staging區, 不包括刪除.
git add -u: 把修改和刪除的內容新增到staging區, 不包括新增的.
今天的命令包括git pull, git push, git commit -am, git ls-files, git add的各種引數, git reset HEAD, git checkout, git mv, git rm,