„Git“ grąžina ištrintą failą ir išsaugo failų istoriją

Tarkime, turiu failą a.txt . Kai jį ištrinau, jį išsprendžiau ir spustelėjau.

Kitą dieną norėjau grąžinti paskutinį pranešimą, grąžinantį a.txt . Bandžiau naudoti „ git revert “ grįžimą, bet kai aš git blame , visos stygos rodo grįžimo maišą. Prarasta pradinė kaltės istorija.

Ar galiu atkurti failą ir išsaugoti failo istoriją, t. Y. tarsi failas dar nėra ištrintas? Atkreipkite dėmesį, kad neturėčiau keisti istorijos, kai komanda buvo paspaudžiama.

Ačiū!

7
19 авг. nustatė fushar 19 rug . 2015-08-19 20:06 '15 - 20:06 2015-08-19 20:06
@ 3 atsakymai

Jūs galite tai padaryti! Štai kaip:

  • Paleiskite naują filialą iš įsipareigojimo, kuris yra prieš panaikinimą, kurį norite atšaukti.
  • Sujunkite pakeitimus, pažeidžiant „ git merge <sha> -s ours .
  • Jei įsipareigojimas pasikeitė, išskyrus ištrynimą, kurį norite išsaugoti:
    • Taikykite pakeitimus savo darbo kopijoje su „ git diff <sha>^..<sha> | git apply git diff <sha>^..<sha> | git apply .
    • Atšaukti (galima rasti daug metodų; git checkout -p gali dirbti gerai).
  • Sujunkite šią šaką atgal į pagrindinę šaką (pvz., Kapitoną).

Jis sukuria istoriją su dviem šakomis; vienas, kuriame failas buvo ištrintas, ir tas, kuriame jis niekada nebuvo ištrintas. Kaip rezultatas, git gali sekti failų istoriją nesikreipdamas į herojus, pvz., -C -C -C . (Tiesą sakant, net su -C -C -C failas nėra atkurtas, nes tai, ką mato, yra tai, kad naujasis failas buvo sukurtas kaip ankstesnio failo kopija. Šiuo metodu jūs vėl įvedate tą patį failą saugykla.)

3
03 июня '16 в 22:36 2016-06-03 22:36 atsakymą pateikė Matthew birželio 03 d. 16 d. 22:36 . 2016-06-03 22:36

Paleiskite „Git“ kaltinimą „ -C parinktyje, nurodytu tris kartus:

 git blame -C -C -C 

Tai sukelia „ git blame ieškant turinio, nukopijuoto iš ankstesnių failų.

git blame dokumentacijos :

-C|<num>|

Be -M , linijų aptikimas, perkeltas arba nukopijuotas iš kitų failų, pakeistų tame pačiame įvykyje. Tai naudinga reorganizuojant programą ir judantį kodą aplink failus. Kai šis parametras yra padvigubintas, komanda papildomai ieško kopijų iš kitų failų, kurie sukuria failą. Kai šis parametras nustatomas tris kartus, komanda papildomai ieško kopijų iš kitų failų bet kokio įsipareigojimo.

<num> yra neprivalomas, tačiau tai yra mažesnė raidinių ir skaitmeninių simbolių, kuriuos turi apibūdinti kaip perkėlimą / kopijavimą tarp failų, ribos, kad susieti šias eilutes su pagrindiniu užraktu. Ir numatytoji reikšmė yra 40. Jei nurodyti keli -C parametrai, įsigalioja paskutinio -C argumentas <num> .

1
19 авг. atsakymas duotas Ajedi32 19 rug . 2015-08-19 20:47 '15 ne 20:47 2015-08-19 20:47

Tai galite padaryti naudodami git reset o ne git revert . git reset panaikina naują įvykį ir patikrina ankstesnį įvykį. Tai nerekomenduojama, jei jau paspaudėte.

 NAME git-reset - Reset current HEAD to the specified state SYNOPSIS git reset [-q] [<tree-ish>] [--] <paths>... git reset (--patch | -p) [<tree-ish>] [--] [<paths>...] git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>] DESCRIPTION In the first and second form, copy entries from <tree-ish> to the index. In the third form, set the current branch head (HEAD) to <commit>, optionally modifying index and working tree to match. The <tree-ish>/<commit> defaults to HEAD in all forms. 

Kadangi jau paspaudėte:

  • Jei neturite aktyvių bendradarbių, kurie tą dieną ištraukė, naudokite „ git reset ir git push -f .
0
19 авг. atsakymą pateikė Assem Chelli 19 rug . 2015-08-19 20:40 '15 , 8:40 pm 2015-08-19 20:40

Peržiūrėkite kitus klausimus apie žymes arba užduokite klausimą

"192.102.6.96 - 192.102.6.96"