亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用暫存區域中的未提交文件撤消git reset --hard

使用暫存區域中的未提交文件撤消git reset --hard

Git
互換的青春 2019-08-16 14:25:36
使用暫存區域中的未提交文件撤消git reset --hard我正在努力恢復我的工作。我愚蠢地做了git reset --hard,但在那之前我只做過get add .而且沒做過git commit。請幫忙!這是我的日志:MacBookPro:api user$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)#   modified:   .gitignore...MacBookPro:api user$ git reset --hardHEAD is now at ff546fa added new strucuture for apigit reset --hard在這種情況下可以撤消嗎?
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

您應該能夠恢復添加到索引中的任何文件(例如,在您的情況下git add .),盡管它可能有點工作。為了將文件添加到索引,git將它添加到對象數據庫,這意味著只要尚未發生垃圾收集,它就可以恢復。在JakubNar?bski的答案中有一個如何做到這一點的例子:

  • 執行git reset后恢復添加的文件--hard HEAD ^

但是,我在測試存儲庫上嘗試了這一點,并且存在一些問題 - --cached應該是--cache,并且我發現它實際上并沒有創建.git/lost-found目錄。但是,以下步驟對我有用:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")

這應該輸出對象數據庫中的任何ref,索引或reflog都無法訪問的所有對象。輸出看起來像這樣:

unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03

......對于每個blob,你可以這樣做:

git show 907b308

輸出文件的內容。


輸出太多了?

更新響應sehe以下的評論:

如果您發現該命令的輸出中列出了許多提交和樹,您可能希望從輸出中刪除任何從未引用的提交引用的對象。(通常你可以通過reflog回到這些提交 - 我們只對已添加到索引但永遠無法通過提交找到的對象感興趣。)

首先,保存命令的輸出,使用:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all

現在可以找到那些無法訪問的提交的對象名稱:

egrep commit all | cut -d ' ' -f 3

因此,您可以找到已添加到索引但未在任何時間提交的樹和對象,具有:

git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
  $(egrep commit all | cut -d ' ' -f 3)

這極大地減少了你必須考慮的物體數量。


更新: 下面的Philip Oakley提出了另一種減少要考慮的對象數量的方法,即只考慮最近修改過的文件.git/objects。你可以找到這些:

find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort

(我在這里發現了這個find調用。)該列表的結尾可能如下所示:

2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a

在這種情況下,您可以看到這些對象:

git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a

(請注意,您必須刪除/路徑末尾的內容才能獲取對象名稱。)


查看完整回答
反對 回復 2019-08-16
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

我只是做了一個git reset --hard并丟失了一個提交。但我知道提交哈希,所以我能夠做git cherry-pick COMMIT_HASH來恢復它。

我在丟失提交的幾分鐘內就這樣做了,所以它可能適合你們中的一些人。


查看完整回答
反對 回復 2019-08-16
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

首先,我將所有哈希保存到文件中:


git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes

接下來我將它們全部放入(刪除'無法訪問的blob'的東西)列表并將數據全部放入新文件中...你必須選擇你的文件并重新命名它們你需要...但我只需要一些files..hope這有助于某人......


commits = ["c2520e04839c05505ef17f985a49ffd42809f",

    "41901be74651829d97f29934f190055ae4e93",

    "50f078c937f07b508a1a73d3566a822927a57",

    "51077d43a3ed6333c8a3616412c9b3b0fb6d4",

    "56e290dc0aaa20e64702357b340d397213cb",

    "5b731d988cfb24500842ec5df84d3e1950c87",

    "9c438e09cf759bf84e109a2f0c18520",

    ...

    ]


from subprocess import call

filename = "file"

i = 1

for c in commits:

    f = open(filename + str(i),"wb")

    call(["git", "show", c],stdout=f)

    i+=1


查看完整回答
反對 回復 2019-08-16
  • 3 回答
  • 0 關注
  • 1060 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號