記一次git amend事故處理方案

来源:http://www.cnblogs.com/dsxniubility/archive/2016/08/30/5817776.html
-Advertisement-
Play Games

一、問題回顧 問題是git commit --amend 引起的。 一條commit已經push到遠端develop了,但是後來又在這條commit上進行了amend操作,導致這條commit的哈希碼發生了變化。並且後續又在這條commit之後進行了N條commit操作。 <Begin> 大概的情況 ...


一、問題回顧

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

<Begin>

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

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

git checkout develop

git 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 擠壓成了一條後commit

git 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

 

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 廢話不多說,先看上效果,由於動畫錄製的時候幀率限制,只能將動畫放慢了進行錄製,更容易看到效果 這是點擊開始之後代碼 由於動畫使由多個動畫組成,所以第一個動畫完畢之後自動再次開始一個動畫 先解釋一下動畫執行過程 第一步是通過CABasicAnimation 對照片進行縮放 第二步是通過CAKeyfra ...
  • 很久沒有總結,回頭看了一下過期的賬號,記錄的內容少之又少。最近有一些時間,想好好總結記錄一下。 由於很久沒有記錄,想寫的東西很多又很雜,想了一下,一篇一篇羅列知識點和經驗,還不如寫一個系列,記錄一個應用的開發流程和經歷。 主線就是一個應用的構建和開發過程,期間再針對部分節點進行分析和探討。 這篇的標 ...
  • 一:首先瞭解一下生命周期圖 二:UIViewController 生命周期介紹 1.通過alloc init 分配記憶體,初始化controller. 2.loadView loadView方法預設實現[super loadView] 如果在初始化controller時指定了xib文件名,就會根據傳入 ...
  • 一:首先查看一下關於UIGestureRecognizer的定義 UIGestureRecognizer是一個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢 知識點1:關於UIGestureRecognizer的子類如下(下麵這些才是我們平常會直接運用到的類): 實例如下: 二:關 ...
  • 1.1 重新規劃android的項目結構 重新規劃android的目錄結構分兩步: 1.建立AndroidLib類庫,將與業務無關的邏輯轉移到AndroidLib。 acitivity存放的是跟業務無關的Activity基類 cache包存放的是緩存數據和圖片相關的處理 net包存放的是網路底層封裝 ...
  • 在項目中總是需要緩存一些網路請求數據以減輕伺服器壓力,業內也有許多優秀的開源的解決方案。通常的緩存方案都是由記憶體緩存和磁碟緩存組成的,記憶體緩存速度快容量小,磁碟緩存容量大速度慢可持久化。 1、PINCache概述 PINCache 是 Pinterest 的程式員在 Tumblr 的 TMCache ...
  • SQLite3是iOS內嵌的資料庫,SQLite3在存儲和檢索大量數據方面非常有效,它使得不必將每個對象都加到記憶體中。還能夠對數據進行負責的聚合,與使用對象執行這些操作相比,獲得結果的速度更快。 SQLite3使用SQL結構化查詢語言,SQL是與關係資料庫交互的標準語言。 SQLite3的使用: 1 ...
  • 一:首先查看一下關於UIEvent的定義 UIEvent是代表iOS系統中的一個事件,一個事件包含一個或多個的UITouch;UIEvent分為三類:UIEventTypeTouches觸摸事件(通過觸摸、手勢進行觸發,例如手指點擊、縮放)、UIEventTypeMotion運動事件,通過加速器進行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...