1、git reset:主要用來版本回退
git reset --參數 head;
參數可以選擇:
hard :當使用這個命令后,工作區、暫存區的內容都會和當前head指向的內容相同。
soft: 當使用這個這個命令后,head指針指向指定的commit,但是工作區、暫存區的內容不會發生變化。
mixed: 從這個英文的意思(混合的)就可以看出,是介於hard和soft之間,暫存區的內容將會發生變化,但是工作區的內容不會發生變化。
例子:
git reset --hard head^ 將head指向上一次commit。
git reset --hard head^^ 將head指向上上次commit。
git reset --hard head~10 將head指向上10次的commit。
git reset --hard 指定commit版本號 將head移動到指定的commit
如何用呢,例如我提交的上一次commit信息錯了,但是暫存區內容是對的,那么我可以使用git reset --soft head^ 來取消上一次commit。
如果git reset錯了怎么辦,這個時候就要使用git reflog, git reflog和git log很像,git不會顯示已刪除的commit 記錄(reset操作導致或者其它操作),但是git reflog會顯示,
使用git reflog會顯示所有的commit記錄。
然后在重新使用git reset命令。
2、git rebase
使用場景1:本地有多個commit,想合並成一個commit。
git rebase -i commit版本號;進入VI便捷界面,按i進入編輯模式,編輯完成后按esc ,然后按:,最后輸入wq保存並退出.
這里參數很多,主要使用的是
pick:保留這份commit。
reword: 保留這份commit,但是會重新編輯commit信息
squash : 這份commit的內容雖然會保留,但是會合並到先前的commit中。
drop: 移除這份commit的內容
等等
例如下面的,第二次,第三次commit都會合到第一個commit里面。
保存成功后,會要你輸入合並commit后的commit信息,
輸入commit信息后,保存退出就可以看到使用git log就可以看到多個commit合並了。
如果遠程以前push過,這時候push會失敗,應為遠程的commit版本已經高於本地的commit版本號了。所以這個時候可以用
git push -f 強制推送。采用強制推送時注意代碼是正確的,沒有丟失。
使用場景2:整合分支
基於master分支拉取新的分支:dev , 在master分支和和dev分支分別有新的commit,此時在master分支執行git merge dev時,會出現新的commit版本號,如下圖所示,可以看到分叉了。
這時git rebase就可以排上用場了。使用git reset --hard head^把merger回退,然后切換到dev分支。
接着使用git rebase master命令,成功后,查看git log,可以看到dev分支上已經沒有分叉了
要注意的是master分支此時head仍在以前的節點,然后在master節點上merger dev,由於使用的是fast-forward模式,merge是不會產生新的分支的。
使用場景3:與遠程代碼同步時使用git pull --rebase
這個其實和第二種情況有點類似,當然這也是不同的。當你在dev分支上開發時,代碼寫完了,先commit到本地倉庫,然后push到遠程倉庫,發現遠程倉庫代碼改變了,就需要pull把遠程代碼拉到本地,pull實際上的命令就是fetch+merge,fetch其實就是更新本地的遠程commit信息,可以在文件夾.git\refs\remotes\origin中找到相應分支的commit信息,然后在和本地進行merge,如果本地進行了已有commit信息,那么不會進行fast-forward,就會產生merge的commit信息。
可以看到在遠程有新的commit時,是無法push到遠程的。