git reset和git rebase的簡單使用


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到遠程的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM