1. 程式人生 > >git 四個區五種狀態

git 四個區五種狀態

img 推送 include comm 增刪 stage pos hash local

一張圖看明白Git的四個區五種狀態

五種狀態間的順序操作

四個區

    1. 工作區(Working Area)
    1. 暫存區(Stage)
    1. 本地倉庫(Local Repository)
    1. 遠程倉庫(Remote Repository)

五種狀態

    1. 未修改(Origin)
    1. 已修改(Modified)&未追蹤(Untracked)
    1. 已暫存(Staged)
    1. 已提交(Committed)
    1. 已推送(Pushed)

順序操作

  • 第零步:工作區與倉庫保持一致
  • 第一步:文件增刪改,變為已修改狀態
  • 第二步:git add ,變為已暫存狀態
$ git add --all # 當前項目下的所有更改
$ git add .  # 當前目錄下的所有更改
$ git add xx/xx.py xx/xx2.py  # 添加某幾個文件
  • 第三步:git commit,變為已提交狀態
$ git commit -m"<這裏寫commit的描述>"
  • 第四步:git push,變為已推送狀態
$ git push -u origin master # 第一次需要關聯上
$ git push # 之後再推送就不用指明應該推送的遠程分支了
$ git branch # 可以查看本地倉庫的分支
$ git branch -a # 可以查看本地倉庫和本地遠程倉庫(遠程倉庫的本地鏡像)的所有分支

技術分享圖片

五種狀態間的撤銷操作

已修改,但未暫存

$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(幾)個文件的修改
$ git checkout # 撤銷項目下所有的修改
$ git checkout . # 撤銷當前文件夾下所有的修改
$ git checkout xx/xx.py xx/xx2.py # 撤銷某幾個文件的修改
$ git clean -f # untracked狀態,撤銷新增的文件
$ git clean -df # untracked狀態,撤銷新增的文件和文件夾

# Untracked files:
#  (use "git add <file>..." to include in what will be committed)
#
#	xxx.py

已暫存,未提交

這個時候已經執行過git add,但未執行git commit,但是用git diff已經看不到任何修改。

因為git diff檢查的是工作區與暫存區之間的差異。

$ git diff --cached # 這個命令顯示暫存區和本地倉庫的差異
$ git reset # 暫存區的修改恢復到工作區
$ git reset --soft # 與git reset等價,回到已修改狀態,修改的內容仍然在工作區中
$ git reset --hard # 回到未修改狀態,清空暫存區和工作區

git reset --hard 操作等價於 git reset 和 git checkout 2步操作

已提交,未推送

執行完commit之後,會在倉庫中生成一個版本號(hash值),標誌這次提交。之後任何時候,都可以借助這個hash值回退到這次提交。

$ git diff <branch-name1> <branch-name2> # 比較2個分支之間的差異
$ git diff master origin/master # 查看本地倉庫與本地遠程倉庫的差異
$ git reset --hard origin/master # 回退與本地遠程倉庫一致
$ git reset --hard HEAD^ # 回退到本地倉庫上一個版本
$ git reset --hard <hash code> # 回退到任意版本
$ git reset --soft/git reset # 回退且回到已修改狀態,修改仍保留在工作區中。

已推送到遠程

$ git push -f orgin master # 強制覆蓋遠程分支
$ git push -f # 如果之前已經用 -u 關聯過,則可省略分支名

慎用,一般情況下,本地分支比遠程要新,所以可以直接推送到遠程,但有時推送到遠程後發現有問題,進行了版本回退,舊版本或者分叉版本推送到遠程,需要添加 -f參數,表示強制覆蓋。

總結

  • 首先,先用git status查看下當前狀態。
  • git reset可以作用於本地倉庫,用於回退/前進到任意版本,也可以作用於暫存區,用於撤銷暫存區修改。有hard和soft2個參數。soft參數可以省略,soft參數表示撤銷的修改仍放在工作區中。
  • git checkout用於撤銷刪除和修改,git clean -df用於撤銷新增。
  • git diff可以查看工作區、暫存區、倉庫之間的修改和差異,參數不同。

git 四個區五種狀態