Git基本命令 -- 基本工作流程 + 檔案相關操作

solenovex發表於2018-03-14

可以先找一個已經被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, 

相關文章