pull之后發(fā)現(xiàn)忘記加--rabase參數(shù)了
我本地做了若干commit,準備push到remote,push前我需要pull一下民宿,merge別人的工作:
git pull
如果沒有沖突宙地,它會merge并創(chuàng)建一個commit送漠,可是我發(fā)現(xiàn)我忘了rebase了,我需要做git pull --rebase
, 而不是git pull
狼荞。咋辦辽装?
方案:
git reflog
git reset HEAD@{1}
然后再做git pull --rebase
事實上 git reflog
可以做很多事. 參考[1]
想把上次或上上次的版本拿出來看看
我當(dāng)前在master最新版本上,可是好像有個Unit Test沒通過相味,可是不像是這次commit引起的拾积,那么我想看看上個版本是不是也有這個問題?
用git checkout HEAD~1
,重復(fù)運行它,將一直往回走殷勘。(顯然 git checkout HEAD~2
就是上上個版本了此再。)
這時候進入的是<i>detached HEAD</i>狀態(tài),我可以“審閱歷史”玲销。審閱完畢输拇,想回到最新狀態(tài)?
`git checkout master`即可贤斜。
本地白做了策吠,想全部作廢——git clean與git reset雙劍合璧
我在本地做了很多修改:修改了已存在的文件,增加了文件瘩绒,還增加了文件夾猴抹。
我還沒有commit,不過我發(fā)現(xiàn)我做的都是廢活锁荔,白做了蟀给,需要全部作廢,回到“干凈”的狀態(tài)阳堕。
對于untracked的文件/文件夾跋理,也就是我在本地新加的那些
git clean -dn
或者git clean
-n
會干跑一下,告訴你它將刪除哪些新加的文件夾/文件恬总。有-d
會處理文件夾前普,否則只會處理文件。
確定沒問題后壹堰,
git clean -df
或者git clean -f
就會真正執(zhí)行了拭卿。 -f
是force的意思。
對于tracked的文件贱纠,也就是我修改的那些
比如2.txt被我修改了峻厚,我想丟棄這個修改,執(zhí)行
git checkout 2.txt
即可
但如果我修改了30個文件并巍,我不想一個一個checkout目木,那么用
git reset --hard
可是我已經(jīng)執(zhí)行過git add .
了。
也就是我已經(jīng)把我修改的2.txt添加到stage了懊渡。
這時git checkout 2.txt
不好使了刽射,必須用
git reset 2.txt
<b>note: git reset only apply to tracked files, need git clean to clean untracked fiels</b>
想undo上一個commit怎么辦?
git reset
有三種模式:soft剃执,hard誓禁,default
git reset --soft head~1: undo git commit
, 但本地index會保留,也就是回到git add .
之后的狀態(tài)肾档。
git reset head~1: undo git commit
, 但本地index不會保留摹恰,但本地做的改變都還在辫继。也就是回到git add .之前的狀態(tài)。
git reset --hard head~1
: 這個最猛俗慈,回到上個commit姑宽,本地雞犬不留。
commit之后發(fā)現(xiàn)注釋寫錯了
git commit --amend -m "update comments here"
:不會產(chǎn)生新的commit闺阱,只是修正上次commit炮车。
commit并push之后發(fā)現(xiàn)注釋寫錯了
git commit --amend -m "update comments here"
之后,還需push這次amend到remote
git push -f
:需加上-f
(force的意思)酣溃,否則不會成功瘦穆。但不推薦這樣做,因為你是在一個團隊里赊豌,別人也在基于上次commit繼續(xù)開發(fā)……
更多參見How do I push amended commit to the remote git repo?[2]
[1]http://stackoverflow.com/questions/134882/undoing-a-git-rebase
[2] http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo