日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)下使用Git撤銷操作的方法教程( 二 )


方法: git reflog 和 git reset 或 git checkout
原理: git reflog 對于恢復(fù)項目歷史是一個超棒的資源 。你可以恢復(fù)幾乎 任何東西 — 任何你 commit 過的東西 — 只要通過 reflog 。
你可能已經(jīng)熟悉了 git log 命令,它會顯示 commit 的列表 。git reflog 也是類似的,不過它顯示的是一個 HEAD 發(fā)生改變的時間列表 。
 一些注意事項:
它涉及的只是 HEAD 的改變 。在你切換分支、用 git commit 進(jìn)行提交、以及用 git reset 撤銷 commit 時,HEAD 會改變,但當(dāng)你用 git checkout -- 《bad filename》 撤銷時(正如我們在前面講到的情況),HEAD 并不會改變 — 如前所述,這些修改從來沒有被提交過,因此 reflog 也無法幫助我們恢復(fù)它們 。
git reflog 不會永遠(yuǎn)保持 。Git 會定期清理那些 “用不到的” 對象 。不要指望幾個月前的提交還一直躺在那里 。
你的 reflog 就是你的,只是你的 。你不能用 git reflog 來恢復(fù)另一個開發(fā)者沒有 push 過的 commit 。

Linux系統(tǒng)下使用Git撤銷操作的方法教程


那么…你怎么利用 reflog 來“恢復(fù)”之前“撤銷”的 commit 呢?它取決于你想做到的到底是什么:
如果你希望準(zhǔn)確地恢復(fù)項目的歷史到某個時間點,用 git reset --hard 《SHA》
如果你希望重建工作目錄里的一個或多個文件,讓它們恢復(fù)到某個時間點的狀態(tài),用 git checkout 《SHA》 -- 《filename》
如果你希望把這些 commit 里的某一個重新提交到你的代碼庫里,用 git cherry-pick 《SHA》
利用分支的另一種做法
場景: 你進(jìn)行了一些提交,然后意識到你開始 check out 的是 master 分支 。你希望這些提交進(jìn)到另一個特性(feature)分支里 。
方法: git branch feature,git reset --hard origin/master,and git checkout feature
原理: 你可能習(xí)慣了用 git checkout -b 《name》 創(chuàng)建新的分支 — 這是創(chuàng)建新分支并馬上 check out 的流行捷徑 — 但是你不希望馬上切換分支 。這里,git branch feature 創(chuàng)建一個叫做 feature 的新分支并指向你最近的 commit,但還是讓你 check out 在 master 分支上 。
下一步,在提交任何新的 commit 之前,用 git reset --hard 把 master 分支倒回 origin/master 。不過別擔(dān)心,那些 commit 還在 feature 分支里 。
最后,用 git checkout 切換到新的 feature 分支,并且讓你最近所有的工作成果都完好無損 。
及時分支,省去繁瑣
場景: 你在 master 分支的基礎(chǔ)上創(chuàng)建了 feature 分支,但 master 分支已經(jīng)滯后于 origin/master 很多 。現(xiàn)在 master 分支已經(jīng)和 origin/master 同步,你希望在 feature 上的提交是從現(xiàn)在開始,而不是也從滯后很多的地方開始 。
方法: git checkout feature 和 git rebase master
原理: 要達(dá)到這個效果,你本來可以通過 git reset (不加 --hard,這樣可以在磁盤上保留修改) 和 git checkout -b 《new branch name》 然后再重新提交修改,不過這樣做的話,你就會失去提交歷史 。我們有更好的辦法 。
git rebase master 會做如下的事情:
首先它會找到你當(dāng)前 check out 的分支和 master 分支的共同祖先 。
然后它 reset 當(dāng)前 check out 的分支到那個共同祖先,在一個臨時保存區(qū)存放所有之前的提交 。
然后它把當(dāng)前 check out 的分支提到 master 的末尾部分,并從臨時保存區(qū)重新把存放的 commit 提交到 master 分支的最后一個 commit 之后 。
大量的撤銷/恢復(fù)
場景: 你向某個方向開始實現(xiàn)一個特性,但是半路你意識到另一個方案更好 。你已經(jīng)進(jìn)行了十幾次提交,但你現(xiàn)在只需要其中的一部分 。你希望其他不需要的提交統(tǒng)統(tǒng)消失 。
方法: git rebase -i 《earlier SHA》

推薦閱讀