git問題記錄-如何切換歷史提交分支,且保留本地修改

問題記錄

我在本地編寫了代碼,突然想查看之前提交的代碼,并且想保留當前所在分支所做的修改

通過git stash對本地的代碼進行暫存

使用git checkout <commit-hash>切換到之前的提交記錄。

查看完之后我想切換回來,恢復暫存的本地代碼

使用git stash pop恢復我本地暫存區的代碼,這時候出現了 git 沖突

我需要解決沖突,通過git status查看暫存區的內容

對于Unmerged pathsUntracked files的內容,都通過git add 將這些文件添加到暫存區

git add .完成之后,我以為已經完全恢復了切換分支之前本地的代碼,于是將分支切換為主分支。

此時提示我需要commit

執行git commit 操作后

切回自己的master分支

此時發現,現在的代碼是所切換的代碼,切換指定提交之前的本地代碼丟失了


問題原因

  1. 沒有使用git checkout master切換原來的分支就進行git stash pop

    • 沒有切換回主分支,直接用git stash pop,會將暫存的修改(stash應用到當前所在的歷史提交detached HEAD),才會導致沖突

      • 如果你在 detached HEAD 狀態下 stash pop 后直接切換分支:

        git stash pop ? ? ? # 修改應用到歷史提交
        git checkout master # 切換分支

        Git 會提示“本地修改會被覆蓋”,你必須選擇:

        • git commit → 提交會留在游離狀態,容易被遺忘。

        • git stash → 再次暫存,但需手動恢復。

        • 丟棄修改 → 代碼丟失

  2. git stash push未添加-u參數導致未追蹤的文件未被添加到暫存區

    • git stash 默認不保存未跟蹤文件。最初執行 git stash 時沒有加 -u--include-untracked 參數

什么是未跟蹤文件

  1. 從未執行過 git add

    • 新創建的文件默認是未跟蹤的。

    • 例如:你新建了一個 test.py,但還沒用 git add test.py

  2. .gitignore 忽略的文件

    • 如果文件匹配 .gitignore 中的規則,即使手動 git add 也會被忽略。

    • 例如:IDE 配置文件(如 .idea/)、編譯生成的 *.class 文件等。

  3. 已從 Git 中刪除,但仍在本地磁盤

    • 如果文件曾被跟蹤,但后來被 git rm 刪除,而本地文件仍保留,它會變成未跟蹤狀態。


如何恢復丟失的代碼?

1. 檢查是否還能找回 stash

運行以下命令查看是否還有 stash 記錄:

git stash list

如果仍有記錄(如 stash@{0}),可以嘗試重新應用:

git stash apply 'stash@{0}' ?# 不刪除 stash
?
#或者
git stash pop stash@{0} # 彈出刪除 stash

這時候暫存區的代碼就會恢復到工作區中了

2.未追蹤代碼未被恢復

這些文件沒有被 git stash apply 恢復,是因為:

主要原因

  1. git stash 默認不保存未跟蹤文件

    • 你最初執行 git stash 時沒有加 -u--include-untracked 參數

    • 導致 IDE 配置文件(.idea/)和新創建的 Java 文件未被暫存

如果文件還在本地(未被刪除)
  • 這些文件可能仍然在你的工作目錄中,只是 Git 沒有跟蹤它們。你可以手動檢查這些路徑是否存在:

    ls habbit/.idea/ ? ? ? ? ?# 查看 .idea 目錄是否存在
    ls habbit/HELP.md ? ? ? ? # 查看 HELP.md 是否存在
  • 如果存在,可以直接用 git add 開始跟蹤:

    git add habbit/HELP.md
如果文件已被刪除
  • 檢查 IDE(如 IntelliJ/VSCode)的 本地歷史記錄(Local History),可能會找到備份。

  • 使用文件恢復工具(如 Recuva)掃描硬盤。


正確操作流程

1. 切換分支前

  • 推薦提交代碼(而不是 stash):

    git add .
    git commit -m "臨時保存當前修改"

    這樣即使切換分支,代碼也會在提交歷史中。

    后續也能通過git checkout <commit-hash>切換回來

  • 如果必須用 stash

    git stash push -u -m "暫存所有修改" ?# -u 包含未跟蹤文件

2. 切換分支后

  • 恢復 stash 時正確處理沖突

    git stash pop ?# 或 git stash apply

    如果沖突:

    • git status 查看沖突文件。

    • 手動決定保留哪些代碼(不要直接 git add .)。

    • 確認無誤后再提交。

3. 切換回原分支

  • 確保所有代碼已提交或 stash

    git status ?# 確認沒有未提交的修改
    git checkout master

不添加暫存區直接git checkout 可以嗎?

對比項git checkout <commit>(第一種)git stash + git checkout(第三種)
是否保留本地更改? 保留(工作目錄和暫存區)? 不保留(先存到 stash,再恢復)
工作目錄狀態仍然有未提交的更改切換到歷史提交時是干凈的
適用場景臨時查看歷史版本,同時繼續修改完全回到歷史版本,稍后恢復更改
是否進入 detached HEAD? 是? 是
沖突風險可能直接沖突(如果歷史版本和本地更改沖突)切換時無沖突,stash pop 時才可能沖突

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79109.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Github開通第三方平臺OAuth登錄及Java對接步驟

調研起因&#xff1a; 準備搞AI Agent海外項目&#xff0c;有相當一部分用戶群體是程序員&#xff0c;所以當然要接入Github這個全球最大的同性交友網站了&#xff0c;讓用戶使用Github賬號一鍵完成注冊或登錄。 本教程基于Web H5界面進行對接&#xff0c;同時也提供了spring-…

期刊、出版社、索引數據庫

image 1、研究人員向期刊或者會議投稿&#xff0c;交注冊費和相應的審稿費等相關費用[1]&#xff1b; 2、會議組織者和期刊聯系出版社&#xff0c;交出版費用&#xff1b; 3、出版社將論文更新到自己的數據庫中&#xff0c;然后將數據庫賣給全世界各大高校或企業&#xff1b; 4…

Transformer 模型及深度學習技術應用

近年來&#xff0c;隨著卷積神經網絡&#xff08;CNN&#xff09;等深度學習技術的飛速發展&#xff0c;人工智能迎來了第三次發展浪潮&#xff0c;AI技術在各行各業中的應用日益廣泛。 注意力機制&#xff1a;理解其在現代深度學習中的關鍵作用&#xff1b; Transformer模型…

zynq7035的arm一秒鐘最多可以支持觸發多少次中斷

一、概述 1.關于zynq7035的ARM處理器一秒能夠支持多少次中斷觸發&#xff0c;需要綜合來考慮。需要確定ARM處理器的參數&#xff0c;目前zynq7000系列&#xff0c;使用的雙核Cortex-A9處理器。其中主頻大概在500MHZ~1GHZ左右&#xff0c;不同的用戶配置的主頻可能稍微有差別。 …

數據結構與算法:圖論——最短路徑

最短路徑 先給出一些leetcode算法題&#xff0c;以后遇見了相關題目再往上增加 最短路徑的4個常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同應用場景下&#xff0c;應有選擇地使用它們&#xff1a; 圖的規模小&#xff0c;用Floyd。若邊的權值有負數&#xff0c;需要…

[android]MT6835 Android 關閉selinux方法

Selinux SELinux is an optional feature of the Linux kernel that provides support to enforce access control security policies to enforce MAC. It is based on the LSM framework. Working with SELinux on Android – LineageOS Android 關閉selinux MT6835 Android…

【Linux網絡編程】http協議的狀態碼,常見請求方法以及cookie-session

本文專欄&#xff1a;Linux網絡編程 目錄 一&#xff0c;狀態碼 重定向狀態碼 1&#xff0c;永久重定向&#xff08;301 Moved Permanently&#xff09; 2&#xff0c;臨時重定向&#xff08;302 Found&#xff09; 二&#xff0c;常見請求方法 1&#xff0c;HTTP常見Hea…

當神經網絡突破摩爾定律:探索大模型時代的算力新紀元

當摩爾定律熄滅后&#xff1a;AI算力革命如何重塑技術文明的底層邏輯 一、摩爾定律的黃昏&#xff1a;物理極限與經濟理性的雙重困境 當英特爾在1965年提出摩爾定律時&#xff0c;沒有人預料到這個每18-24個月將芯片晶體管數量翻倍的預言會成為現代計算文明的基石。半個世紀以…

位運算題目:尋找重復數

文章目錄 題目標題和出處難度題目描述要求示例數據范圍進階 前言解法一思路和算法代碼復雜度分析 解法二思路和算法代碼復雜度分析 解法三思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;尋找重復數 出處&#xff1a;287. 尋找重復數 難度 6 級 題目描述 要…

Elasticsearch:沒有 “AG” 的 RAG?

作者&#xff1a;來自 Elastic Gustavo Llermaly 了解如何利用語義搜索和 ELSER 構建一個強大且視覺上吸引人的問答體驗&#xff0c;而無需使用 LLMs。 想要獲得 Elastic 認證&#xff1f;查看下一期 Elasticsearch Engineer 培訓的時間&#xff01; Elasticsearch 擁有眾多新…

linux下安裝ollama網不好怎么辦?

文章目錄 前言kkgithub下載腳本,而不是直接運行修改腳本修改權限還是不行?前言 今天想在linux上面更新一下ollama,于是去到官網: https://ollama.com/download/linux linux下安裝ollama還是挺簡單的: curl -fsSL https://ollama.com/install.sh | sh我也是特別嗨皮地就…

相機-IMU聯合標定:相機-IMU外參標定

文章目錄 ??簡介??標定工具kalibr??標定數據錄制??相機-IMU外參標定??簡介 在 VINS(視覺慣性導航系統) 中,相機-IMU外參標定 是確保多傳感器數據時空統一的核心環節,其作用可概括為以下關鍵點: 坐標系對齊(空間同步),外參誤差會導致視覺特征點投影與IMU預積…

基于 Java 的實現前端組裝查詢語句,后端直接執行查詢方案,涵蓋前端和后端的設計思路

1. 前端設計 前端負責根據用戶輸入或交互條件,動態生成查詢參數,并通過 HTTP 請求發送到后端。 前端邏輯: 提供用戶界面(如表單、篩選器等),讓用戶選擇查詢條件。將用戶選擇的條件組裝成 JSON 格式的查詢參數。發送 HTTP 請求(如 POST 或 GET)到后端。示例: 假設用…

[STM32] 4-2 USART與串口通信(2)

文章目錄 前言4-2 USART與串口通信(2)數據發送過程雙緩沖與連續發送數據發送過程中的問題 數據接收過程TXE標志位&#xff08;發送數據寄存器空&#xff09;TC標志位&#xff08;發送完成標志位&#xff09;單個數據的發送數據的連續發送 接收過程中遇到的問題問題描述&#xf…

Qt多線程TCP服務器實現指南

在Qt中實現多線程TCP服務器可以通過為每個客戶端連接分配獨立的線程來處理&#xff0c;以提高并發性能。以下是一個分步實現的示例&#xff1a; 1. 自定義工作線程類&#xff08;處理客戶端通信&#xff09; // workerthread.h #include <QObject> #include <QTcpSo…

詳細介紹Python-pandas-DataFrame全部 *功能* 函數

Python-pandas-DataFrame全部 功能 函數 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是pandas的使用語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#xff1a;每個知識點…

香港科技大學廣州|可持續能源與環境學域博士招生宣講會—四川大學專場

香港科技大學廣州&#xff5c;可持續能源與環境學域博士招生宣講會—四川大學專場 時間&#xff1a;2025年5月8日&#xff08;星期四&#xff09;16:30開始 地點&#xff1a;四川大學基礎教學樓A座504 宣講嘉賓&#xff1a;肖殿勛 助理教授 一經錄取&#xff0c;享全額獎學金…

裝飾器設計模式(Decorator Pattern)詳解

裝飾器設計模式(Decorator Pattern)詳解 裝飾器模式是一種結構型設計模式,它允許動態地向對象添加額外行為,而無需修改其原始類。這種模式通過包裝對象的方式提供靈活的擴展功能替代繼承。 1. 核心概念 (1)模式定義 裝飾器模式:動態地給一個對象添加一些額外的職責,就…

【SpringMVC】詳解參數傳遞與實戰指南

目錄 1.前言 2.正文 2.1基礎參數傳遞 2.1.1單參數 2.1.2多參數 2.2對象參數綁定 2.2.1自動封裝對象 2.2.2參數別名處理 2.3集合類型處理 2.3.1數組接收 2.3.2List集合接收 2.4JSON參數處理 2.4.1介紹JSON 2.4.2傳遞JSON參數 2.5RESTful風格參數 2.6文件上傳處理…

mysql-窗口函數一

目錄 一、感受一下分組與窗口函數的區別 二、滑動窗口&#xff08;子窗口&#xff09;大小的確認 2.1 分組函數下order by使用 2.2 窗口子句 2.3 執行流程 三、函數使用 窗口函數需要mysql的版本大于等于8才行&#xff0c;可以先檢查一下自己的mysql版本是多少 select ve…