Git reset嚷辅、revert、rebase的簡單使用
回滾提示
本地或者自己單獨的倉庫使用reset 或者revert都可以
涉及到遠程倉庫(公用倉庫)時距误,不要使用reset,而使用revert回滾
git reset
git reset [-q] [<tree-ish>] [--] <paths>…?
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…?]
EXPERIMENTAL: git reset [-q] [--stdin [-z]] [<tree-ish>]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
說明:回退HEAD到某一個<commit>
-
git reset <paths>
這是git add <paths> 的反向用法簸搞。- git add <paths> 是將修改后的文件添加到暫存區(qū)。
- git reset <paths> 則是將暫存區(qū)內(nèi)的文件移出准潭。如果沒有指定路徑文件趁俊,則會將暫存區(qū)內(nèi)修改的文件全部移出。
git reset -p <paths>
這個是git add -p <paths> 的反向用法刑然。-p是對文件修改變動的區(qū)塊處理寺擂,這個操作比較高級。暫時不管泼掠。-
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
主要講這個命令怔软,具體功能是將HEAD移動到某一個commit。
假設(shè)master分支上的提交記錄如下:
A->B->C->D
目前HEAD指向commit D,我們要將代碼回退到B提交時的狀態(tài)- 方法1
git reset --soft B
這個時候可以發(fā)現(xiàn)择镇,C,D兩次提交做的修改依然存在挡逼,并且在索引區(qū)內(nèi),這個時候如果直接調(diào)用git commit 腻豌,可以生成一個新的提交E,E包含C家坎、D兩次提 交的修改嘱能。
- 方法2
git reset --mixed B //git reset B 二者是一樣的
這個時候可以發(fā)現(xiàn),C,D兩次提交做的修改依然存在虱疏,但是不在索引區(qū)內(nèi)惹骂,,記如果需要重新提交订框,則需要先調(diào)用git add析苫。
- 方法3
git reset --hard B
和--soft、--mixed不同的是穿扳,C,D兩次提交做的修改以及D以后做的一些沒有提交的修改都不復(fù)存在
- --merge說明
這個參數(shù)使用的有一定的前提,需要保證沒有添加到索引區(qū)的修改文件在新舊兩個HEAD直接的提交中沒有過修改国旷。如果下面命令調(diào)用成功
git reset --merge B
則會保留沒有添加到索引區(qū)的修改矛物。即,假設(shè)commit C 和 commit D都只修改了a.txt,而在D后我們又修改了b.txt,但是沒有調(diào)用git add b.txt保存修改到索引區(qū)跪但,則調(diào)用git reset --merge B 成功后履羞,原來對b.txt做的修改還會存在,但是C屡久、D提交中的修改將會回滾消失
- --keep說明
和--merge有一些類似忆首。使用成功的前提是:在D后有本地修改的文件在C、D兩次提交中沒有修改過被环,即C糙及、D兩次提交中沒有它的修改記錄。
假設(shè)我們在D后修改了a.txt文件筛欢,而且C浸锨、D兩次提交中我們都沒有修改a.txt文件,這樣我們調(diào)用git reset --keep B 可以成功版姑,并且a.txt文件中的修改依然會保留柱搜。
git revert
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…?
git revert --continue
git revert --quit
git revert --abort
說明:放棄一個或多個提交,并生成一個或多個新的提交來記錄這些放棄操作剥险。
-
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…?
- --edit or --no-edit是否彈出commit message窗口
- **-n **是 --no-commit的縮寫
- -m parent-number 存在merge是聪蘸,指定父系分支號?這個還不怎么懂表制,暫時略過健爬。
假設(shè)master分支上的提交記錄如下:
A->B->C->D
目前HEAD指向commit D,我們要將代碼revert到B提交時的狀態(tài)
- 方法1
會生成2個新的commit分別覆蓋C、D的提交git revert C D
- 方法2
git revert -n C D
不會生成新的提交夫凸,但是回滾變動會作為修改變動添加到了索引區(qū)浑劳,可以直接調(diào)用git commit保存或者git revert --conitnue彈出commit頁面
- 方法3
類似方法1,revert從C到D之間的提交夭拌,假設(shè)中間還有很多提交時可以用這種git revert -n C..D //git revert C..D
git rebase
說明:變基操作魔熏。
簡單的舉例說明幾種用法
- 用法1
假設(shè)如下:
master分支提交歷史為:A->B->C->D
你后面發(fā)現(xiàn)commit C和D有些問題衷咽,需要做一些變動,比如-
將C蒜绽、D兩次提交合并成一次提交
squash D //將D合并到C提交 或者用fixup D,但是這樣會丟棄D的提交message
-
刪除D提交
drop D //刪除D
-
修改D提交的message
reword D//修改D提交的message
等等镶骗。
則可以調(diào)用
然后會彈出編輯窗口,相應(yīng)的做修改即可躲雅。也就是變更修改pick鼎姊、reword、squash相赁、fixup相寇、drop等命令。git rebase -i B
-
將C蒜绽、D兩次提交合并成一次提交
-
用法2
假設(shè)origin/master 分支上的提交歷史為 A->B->C->D钮科;你在本地新添加了一個提交E唤衫,則master為A->B->C->D->E。此時隊友新推送一個提交N到origin/master,則origin/master 分支上提交歷史為A->B->C->D->N绵脯。如果你在本地采用merge的方式佳励,則提交歷史會在分叉變成A->B->C-D->(E,N)->M(表示Merge后的新提交)。而才有rebase方式的話git fetch origin master //更新代碼 git rebase origin/master //變基操作
則本地master提交歷史可能變成A->B->C->D->N->E不會存在分叉蛆挫。
-
用法3
假設(shè)如下:
master分支提交歷史為:A->B->C
server分支提交歷史為:A->B->D->E
client分支提交歷史為:A->B->D->F
調(diào)用git rebase --onto master server client
這樣會取出client分支赃承,找出處于client分支和server分支的共同祖先之后的修改,然后把他們在master分支上重演一遍
這樣client分支會變成A->B->C->F悴侵,注意server和client共同擁有的D提交記錄在client里消失了