1. 程式人生 > >Git基本命令 -- 基本工作流程 + 文件相關操作

Git基本命令 -- 基本工作流程 + 文件相關操作

-- 一個 命令執行 IT 每次 tro 有變 並且 -c

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

Git基本命令 -- 基本工作流程 + 文件相關操作