最近學習了git的一些重要命令的使用,總結出來跟大家分享:
使用git的幾種常見情形:
(1)正常的情形,修改工作區的文件然后add,commit,我使用git一般的流程是:
git status ——> git stash save "message..."——> git pull --> git stash pop ——> git add . 或 git add filename ——> git commit -m 'message...' ——> git push
其中 . 表示所有的文件。
(2)只需要撤銷工作區的文件修改,即用暫存區的文件覆蓋工作區中的文件
git checkout -- filename
(3)當修改的文件已經add到暫存區,需要撤銷這次添加,即撤銷上一次git add filename 操作:
git reset -- filename / git reset HEAD filename
撤銷暫存區內所有的文件改動:
git reset / git reset HEAD
(4)當對上次提交不滿意,可以讓HEAD指針回退,而暫存區和工作區可以不用動
git reset --soft HEAD^
(5)如果讓工作區不改變,而暫存區和引用(HEAD指針)回退一次
git reset --mixed HEAD^
(6)當需要徹底撤銷最近的提交,HEAD指針、暫存區、工作區都回到上次的提交狀態,自上一次以來的提交全部丟失
git reset --hard HEAD^
1、git stash 用於保存和恢復工作進度。
git stash
保存當前的工作進度。會分別對暫存區和工作區的狀態進行保存。
git stash list
顯示進度列表。此命令顯然暗示了git stash 可以多次保存工作進度,並用在恢復時候選擇。
git stash drop [
刪除一個存儲的進度。默認刪除最新的進度。
git stash clear
刪除所有存儲的進度。
其他:
git stash pop [--index] [
--index 參數:不僅恢復工作區,還恢復暫存區
<stash> 指定恢復某一個具體進度。如果沒有這個參數,默認恢復最新進度
如:以下命令恢復編號為0的進度的工作區和暫存區
# git stash pop --index stash@{0}
(1)如果不使用任何參數,會恢復最新保存的工作進度,並將恢復的工作進度從存儲的工作進度列表中清除。
(2)如果提供<stash>參數(來自git stash list顯示的列表),則從該<stash>中恢復。恢復完畢也將從進度列表中刪除<stash>。
(3)選項--index除了恢復工作區的文件外,還嘗試恢復暫存區。這也就是為什么恢復進度的時候顯示的狀態和保存進度前的略有不同。
git stash [save [--patch] [-k|--[no]keep-index] [-q|--quiet] [
這條命令實際上是git stash命令的完整版。
(1)save,即如果需要在保存工作進度的時候使 用指定的說明,必須使用如下格式:
git stash save “message...”
(2)使用參數--patch會顯示工作區和HEAD的差異,通過對差異文件的編輯決定在進度中 最終要保存的工作區的內容,通過編輯差異文件可以在進度中排除無關內容。
(3)使用-k或者--keep-index參數,在保存進度后不會將暫存區重置。默認會將暫存區和工 作區強制重置。
git stash apply [--index] [
除了不刪除恢復的進度之外,其余和git stash pop 命令一樣。
2、檢出命令git checkout是git最常用的命令之一,同時也是一個很危險的命令,因為這條命令會重寫工作區。
檢出命令的用法如下:
用法一:git checkout [-q] [
用法二:git checkout [
用法三:git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
注:
<1> 為了避免路徑和引用(或者提交ID)同名而發生沖突,可以在
<2> 在用法一中,
(1)省略commit:用暫存區的文件覆蓋工作區的文件。
(2)加上commit:用指定提交中的文件覆蓋暫存區和工作區中的文件。
<3>在用法二中,會改變HEAD頭指針
(1)加上<branch>:因為只有HEAD切換到一個分支才可以對提交進行跟蹤,否則仍然會進入“分離頭指針”的狀態。在“分離頭指針”狀態下的提交不能被引用關聯到,從而可能丟失。
所以用法二(加上
(2)省略
<4>在用法三中,主要是創建和切換到新的分支(<new_branch>),新的分支從<start_point>指定的提交開始創建。新分支和我們熟悉的master分支沒有什么實質的不同,都是在refs/heads命名空間下的引用。
下圖所示的版本庫模型圖描述了git checkout實際完成的操作。
使用:
git checkout branch
檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch 指向的樹更新暫存區和工作區。
git checkout / git checkout HEAD
匯總顯示工作區、暫存區與HEAD的差異。
git checkout -- filename
用暫存區中filename文件來覆蓋工作區中的filename文件。相當於撤銷自上次執行git add filename以來(如果執行過)的本地修改。
git checkout -- . / git checkout .
這條命令最危險!會撤銷所有本地的修改(相對於暫存區)。相當於用暫存區的所有文件直接覆蓋本地文件,不給用戶任何確認的機會!
3、git reset是Git最常用的命令之一,也是最危險最容易誤用的命令。
用法一:git reset [-q] [
用法二:git reset [--soft --mixed | --hard | --merge | --keep] [-q] [
注:
(1)第一種用法(包含了路徑
例如:git reset HEAD
相當於取消之前執行的git add
(2)第二種用法(不使用路徑
參照下面的版本庫模型圖,可以看不同的參數對第二種重置語法的影響。
命令格式:git reset [--soft | --mixed | --hard] [
(1)使用參數--soft,如 git reset --soft
會執行上圖中的操作①。即只更改引用的指向,不改變暫存區和工作區。
(2)使用參數--mixed或者不使用參數(默認為--mixed),如 git reset
會執行上圖中的操作①和②。即更改引用的指向及重置暫存區,但是不改變工作區。
(3)使用參數--hard,如git reset --hard
會執行上圖中的全部動作①、②、③,(理解為此時工作區、暫存區、commit都相同)即:
①替換引用的指向。引用指向新的提交ID。
②替換暫存區。替換后,暫存區的內容和引用指向的目錄樹一致。
③替換工作區。替換后,工作區的內容變得和暫存區一致,也和HEAD所指向的目錄樹內容相同。
注: 引用即HEAD指針
使用:
git reset / git reset HEAD
僅用HEAD指向的目錄樹重置暫存區,工作區不會受到影響,相當於將之前用git add命令更新到暫存區的內容撤出暫存區。引用也未改變,因為引用重置到HEAD相當於沒有重置。
git reset -- filename / git reset HEAD filename
僅將文件filename 的改動撤出暫存區,暫存區中其他文件不改變。相當於命令git add filename 的反射操作。
git reset --soft HEAD^
工作區和暫存區不改變,但是引用向前回退一次。當對最新的提交說明或者提交的更改不滿意時,撤銷最新的提交以便重新提交。
之前提到過修補提交命令git commit --amend,用於對最新的提交進行重新提交以修補錯誤的提交說明或者錯誤的提交文件。修補提交命令實際上相當於執行了下面兩條命令。(注:文件.git/COMMIT_EDITMSG保存了上次的提交日志)
git reset --soft HEAD^
git commit -e -F .git/COMMIT_EDITMSG
git reset HEAD^ / git reset --mixed HEAD^
工作區不改變,但是暫存區會回退到上一次提交之前,引用也會回退一次。
git reset --hard HEAD^
徹底撤銷最近的提交。引用回退到前一次,而且工作區和暫存區都會回退到上一次提交的狀態。自上一次以來的提交全部丟失。