必要的概念

- 當前編輯界面:工作區(workspace)
- “git add”命令:將改動加入到緩存區(Index)
- ”git commit”命令:提交代碼到本地庫(Local Repository)
- ”git push”命令:提交代碼到遠程庫(Remote Repository)
未使用“git add”命令緩存代碼時
git checkout
git checkout -- <filepathname> # 丟棄工作區某個文件的修改
git checkout . # 丟棄工作區所有文件的修改
注意:此命令不會刪除掉新建的文件,需要手動刪除。
已使用“git add”命令緩存代碼
git reset
git reset HEAD <filepathname> # 撤銷暫存區某個文件的修改,重新放回工作區
git reset HEAD . # 撤銷暫存區所有文件的修改,重新放回工作區
注意:相當於撤銷“git add”命令,但只是將本地的修改從暫存區回退到工作區。
已使用“git commit”命令提交代碼
git reset
git reset --hard HEAD^ <filepathname> // 回退某個文件到上一次commit的狀態
git reset --hard HEAD^ // 回退所有文件到上一次commit的狀態
git reset --hard <commit id> // 回退所有文件到某個commit
git commit --amend
重做上一次commit,並包括指定文件的新變化。
合並緩存區的修改和最近的一次commit,並嘗試重新commit。可以理解為,用一個全新的commit整個替換了最近一次commit。
如果緩存區沒有內容, 可以用來編輯上一次的commit描述。
不要對一個公共的commit使用amend。如果amend了一個被其他開發者使用的commit, 可能會嚴重影響其他開發者。
git rebase
重新定義分支的起點,也就是將當前分支從一個commit移動到另一個commit作為起點。
分支上的老commit將被刪除,保持了項目歷史的干凈。建議不要在一個公共的分支中使用rebase。
git rebase <base> # 將<base>做為當前分支的新起點, <base>可以是任何一種commit引用(如ID,branch name,tag,HEAD~N等)。
git rebase -i <base> # 交互式地將<base>做為當前分支的新起點,過程中可以對要rebase的commit做一定的修改。
"git reset"命令
用來撤銷本地的修改。建議不要reset一個公共的項目歷史。
主要參數:
- --soft 回退后a分支修改的代碼被保留並標記為add的狀態(git status 是綠色的狀態)
- --mixed 重置索引,但不重置工作樹,更改后的文件標記為未提交(add)的狀態。默認操作。
- --hard 重置索引和工作樹。
git reset # 回退版本庫到上一個commit的狀態, 工作區不變。
git reset <commit> # 回退版本庫到指定的<commit>, 工作區不變。
git reset --hard # 回退版本庫和工作區到上一次commit的狀態。 --hard表明覆蓋所有的修改, 而且是不可逆的, 因此使用之前要謹慎。
git reset --hard <commit> # 回退版本庫和工作區到指定的<commit>。
git reset --hard origin/master # 將版本庫和工作區回退到和遠程的一樣。
回退到上個版本:git reset --hard HEAD^ <filepathname> git reset --hard HEAD^ git reset --hard HEAD~
回退到上上個版本:git reset --hard HEAD^^ git reset --hard HEAD~1
以此類推。
