Git 後悔藥,指的是咱們操做本地代碼以後想要恢復以前的代碼,所須要作的一系列操做,好像是作過後悔了,想要吃後悔藥同樣,生活中雖沒有後悔藥,可是 git 的世界中是存在的哦!
# 注意跟切換分支不要搞混了,這個有兩個橫線,放棄對單個文件的修改 git checkout -- filename # 放棄對全部文件的修改 git checkout .
<!--more-->git
# 單個文件回到修改以後,add以前 git reset HEAD filename # 全部文件回到修改以後, add以前 git reset HEAD .
# 回到add以後,commit以前 git reset --soft HEAD^ # 回到修改以後,add以前 git reset --mixed HEAD^ # 回到修改以前,放棄對文件的修改 git reset --hard HEAD^ # 能夠恢復到以前任意版本 git reset --hard 提交版本號
# 例若有三次提交,提交一、提交二、提交3,假如提交2版本有問題,想要撤銷,可是不想影響以後的提交3 的內容,這就能夠反作提交2 git revert -n 版本號 # 反作以後會自動生成一個新的提交,這個提交會撤銷提交2,而保留提交3 #這裏可能會出現衝突,那麼須要手動修改衝突的文件。並且要git add 文件名
#切換到主分支 git checkout main # 拉取最新代碼 git pull # 切換到開發分支 git checkout dev # 將本地屢次提交合併成一次提交,好處是隻須要解決一次衝突 git rebase -i HEAD~2 #合併提交 --- 2表示合併兩個 # 同步主分支的最新代碼到dev分支 git rebase main #---->解決衝突--->git rebase --continue # 切換回主分支 git checkout main # 在主分支上合併 dev 分支 git merge dev # 推送遠程 git push ## 記錄功能 git rebase --abort #會放棄合併,回到rebase操做以前的狀態,以前的提交的不會丟棄; git rebase --skip #則會將引發衝突的commits丟棄掉(慎用!!); git rebase --continue #合併衝突,結合"git add 文件"命令一塊兒用與修復衝突,提示開發者,一步一步地有沒有解決衝突。
git revert 597ace36 :wq git revert f187d3ef :wq git revert d301fafe :wq # 回退了三個版本以後會生成三個新的log # 而後能夠使用rebase 合併三個新的log git rebase -i 597ace36 #也能夠HEAD~3至關於合併三個提交歷史 # 注意 -i 後面的參數是不須要合併的 commit 的 hash 值,這裏即從當前時間往前推的第四個提交,包括新生成的三個提交log #pick 的意思是要會執行這個 commit #squash 的意思是這個 commit 會被合併到前一個commit # 把後面兩個pick修改爲 squash :wq # 而後進入編輯合併日誌的模式,把其中兩個 Revert 註釋註釋掉,只剩一個合併日誌以下: #Revert "後悔藥系列,revert三個以後合併爲一個註釋rebash" # This reverts commit 597ace360be8f00575bae40d5bf9bfea551a1c48. # This reverts commit f187d3ef9c9eb0de74b4ad6c0fa5854b0e612539. # This reverts commit d301fafe75cb5fadf5b98f0711c39243e4174e34. :wq
# 基於當前分支建立並切換到本地新分支,新分支dev git checkout -b dev # 基於遠程dev分支建立新的本地分支,本地沒有dev分支呢 git chechout -b dev origin/dev # 提交本地分支到遠程 git push origin dev:dev # 刪除遠程分支,至關於推送一個空分支到遠程分支 git push origin :dev # 本地切換分支 git checkout dev # 刪除本地分支 git branch -d dev # 設置本地分支與遠程分支的關聯,設置關聯以後,若是隻有一個關聯能夠直接git push git push --set-upstream origin dev # 也能夠寫全 git branch –set-upstream dev origin/dev # 查看本地分支與遠程關聯 git branch -vv # 若是隻有一個關聯,則能夠使用git push直接提交,省略後面的
# 當臨時須要去別的分支解決問題,又不想提交當前分支沒寫完的代碼 git stash save "隱藏當前沒寫完的代碼" # 這時候就能夠切換分支操做了,解決完回來以後進行以下操做 # 查看隱藏的列表 git stash list # 若是執行此命令會直接刪除隱藏列表,若是隻有一條剛纔的隱藏記錄,直接用能夠,用完以後以前隱藏的代碼就回來了,還會刪除隱藏列表 git stash pop # 若是隻想代碼回來,不刪除隱藏列表,能夠執行,stash@{0},恢復隱藏列表中的stash@{0}的代碼 git stash apply stash@{0} # 提交代碼以前,能夠先隱藏本身代碼,而後pull,以後pop放出本身隱藏的代碼,解決衝突,提交,這樣能夠減小合併的代碼 git stash save "隱藏本身代碼" git pull git stash pop # 解決衝突 # 其中Updated upstream 和=====之間的內容就是pull下來的內容,====和stashed changes之間的內容就是本地修改的內容。碰到這種狀況,git也不知道哪行內容是須要的,因此要自行#肯定須要的內容。 #解決完成以後,就能夠正常的提交了。 git add . git commit -m "註釋" git push # 注意,發生衝突以後,即便git stash pop,代碼也取出來了,可是git stash list中的貯存代碼記錄依然存在 # 這時候由於代碼取出來了,因此能夠直接刪除list中的記錄 # 不加參數默認刪除最新的編號爲stash@{0}的記錄 git stash drop # 或者本身指定刪除的編號 git stash drop stash@{0}
# 同步本地和遠程的分支 git remote prune origin # 用新的提交替換上一次提交,若是沒有改動,則替換上一次的提交註釋 git commit --amend -m "替換上次提交" # 查看當前分支的最近幾回提交 git reflog
# 例如把dev分支合併到main分支 # 首先切換到main分支,並保證全部提交均最新,都pull過了 git checkout main git merge dev # 若是有衝突解決衝突,以後push到遠程就能夠了