記一次git amend事故處理方案,gitamend

來源:互聯網
上載者:User

記一次git amend事故處理方案,gitamend
一、問題回顧

問題是git commit --amend 引起的。 一條commit已經push到遠端develop了,但是後來又在這條commit上進行了amend操作,導致這條commit的雜湊碼發生了變化。並且後續又在這條commit之後進行了N條commit操作。

<Begin>

大概的情況畫了個簡圖,。下面的綠色就是最後相同的地方,紅色的那條做的是相同的功能message是一樣的,但是提完develop之後又改動了很多然後使用amend擠壓了。

這個時候比較頭疼了,因為那條amend的commit裡面是發生了太多改動,我採用的是可以避免衝突的方法,但是會改develop的commit樹

git checkout developgit reset 2c4532  //上面97,98,99的改動會被放出來git stash //先把這些改動存起來git reset --hard 5d67bc  //等於是把96完全剔除了,代碼回到了95的狀態git cherry-pick 8a6f7f  //把那一條修改後的功能commit(96的feature)粘貼過來,這一步100%不會有衝突git stash pop  //把之前存起來的那些改動再放出來,這一步不能保證100%無衝突,但實際由於兩個功能模組離得比較開,所以也沒有發生衝突。git add .   git commit -m " " //把develop上面的97,98,99三條commit 擠壓成了一條後commitgit cherry-pick 86f6cc d34c7 2817f5 //這一步把feature分支的97,98,99三條commit粘貼過來,因為這三條基本是基於8a6f7f開發的,所以也沒有發生衝突。 董鉑然部落格園

<End>

這樣改完之後develop的commit樹如所示(第97條就是把之前的97,98,99擠壓成的1條),可以編譯通過功能都能實現。 但是缺點是這時候需要強推develop了。

 

組裡另一個人提出的解決方案是

<Begin>(圖再貼一遍 省的往上翻)

git checkout feature  //操作都在feature分支進行,不動develop的代碼git reset 5d67bc   //把feature分支上“不科學”的commit 96,97,98,99 全部放出來git stash  //全部臨時存起來git rebase develop   //快進一下,合入了所有develop的新代碼 100%無衝突git stash pop   //把之前揉在一起的4條commit的代碼一起放出來,這時候會有大量衝突。git add .  git commit -m "fix"  //解決衝突後commit一下  //然後再把最後的一條commit merge入develop,最後的結果時develop如下

<End>

可以看出這種做法,不需要強制push develop的代碼。理論上更加科學,但是中間需要解決大量的衝突。

事後反省一下,覺得兩種方法其實各有優劣,如果組內成員不多,可以在大家的監督下 完成強推develop的操作。 因為解決了大量衝突可能會比 非常清晰瞭解差異後-f強推develop更容易出現錯誤。 當然如果是大型項目,幾十人團隊,並且遠端都綁上了編譯檢查,和merge規則的項目也只能使用第二種方法了。

 

二、其他經驗

對於一個碼農而言,比寫出bug更恐怖的是把代碼弄丟了或弄亂了。 對於這種問題也是有一種統一的解決方案

①.git reset --hard  雜湊碼 , 這條非常普遍,如果出現問題有點亂直接回到一個安全的commit

②.git reflog    對於有rebase或merge這種操作,第一條指令就用不了了,因為被汙染的並不僅僅是最後一條commit。 這時要用這個萬能恢複指令,回到一個操作的雜湊碼。

③.但是前兩種方法都是對於一些已經加入過git的代碼進行恢複。 如果一些代碼還沒有commit 這時候弄丟了 那些指令就都幫不了你了。 這時候只能看IDE有沒有local history了。(local history相當於IDE幫你實現了一個類似於git的功能)之前就有過一次第3種情況的經曆,當時是把沒commit的代碼給reset了 使用localhistory得以恢複。好在現在iOS的xcode 和 Android的Android Studio都是有local history的,

  • Xcode 的local history在 導覽列 → View → Version Editor → show Version Editor 
  • Android Studio 的local history在 左邊檔案目錄 → 選中根目錄 → show local history

 

如果上文說的問題有更好的解決方案,也歡迎一起討論。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.