Kaip iššokti git stash be automatinio sujungimo

Trumpas šio klausimo variantas yra toks: kaip galiu paliesti tylų git be automatinio sujungimo?


Dabar už ilgesnę versiją ...

Apsvarstykite šį žaislo pavyzdį - alternatyvą git stash ... + git pull ... + git pop .

Pirma, „ git status rodo, kad vienintelis darbo katalogo pakeitimas yra tam tikras stebimas failas „ foo .

 # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: foo # no changes added to commit (use "git add" and/or "git commit -a") 

Dabar, norėdami atstatyti darbo katalogą į švarią būseną, kaip prielaidą paleisti „ git pull , aš laikinai pervadinau modifikuotą „ foo failą (tam tikrą neatpažintą pavadinimą) ir atstatiau foo versiją į HEAD ...

 % mv foo foo.$(date +%Y%m%dT%H%M%S) % git checkout foo % git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # foo.20130508T110014 nothing added to commit but untracked files present (use "git add" to track) 

Gerai, dabar paleidžiu „ git pull , kuris šiuo pavyzdžiu gali būti laikomas greituoju:

 % git pull 

Galiausiai, aš atkuriu laikiną pervardyti foo .

 % mv foo.20130508T110014 foo 

... ir grįžau į

 % git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: foo # 

Tai „moralinis ekvivalentas“ git stash save + git pull + git stash pop , IŠSKYRUS, kad pirmasis, o ne paskutinis, yra apsaugotas „sujungti konfliktus“:

 % git stash save 'WIP' % git pull % git stash pop Auto-merging foo CONFLICT (content): Merge conflict in foo 

Kaip aš galiu pakartoti rename-checkout-pull-rename seką, naudojant git stash save + ... + git stash pop , nesukeliant automatinio sujungimo?

EDIT: Beje, rename-checkout-...-rename pogrupį tiksliau atspindi tai, ko tikiuosi iš komandos, pavadintos stash . IOW: dabar išsaugokite mano darbo katalogo būseną ir pakeiskite vėliau. Šiame paveikslėlyje nėra „sujungimo“.

9
08 мая '13 в 18:36 2013-05-08 18:36 kjo yra nustatytas gegužės 8 d. 13 val. 18:36 2013-05-08 18:36
@ 4 atsakymai

Pavėluotai supratau, kad git jau suteikia labai paprastą problemos sprendimo būdą (būtent automatinis susiliejimas su galimybe patalpinti saugyklą į „nesusietą valstybę“).

Viskas, ką jums reikia padaryti, tai naudoti

 git stash branch <branchname> [<stash>] 

vietoj git stash pop (arba git stash apply ).

Tai išstumia talpyklą taip, kad nebūtų jokių konfliktų. „Easy-Peasy-Lemon-Squeezy“.

3
08 февр. atsakymą pateikė kjo 08 Feb 2014-02-08 22:12 '14, 10:12 pm 2014-02-08 22:12

stash susitinka, kai tik jis veikia.

Galite sujungti be sujungimo naudojant write-tree read-tree ir checkout-index . Štai pavyzdys, kaip sukurti nepaliestą bandymų aplinką .

Jei norite paprasčiausiai taikyti priverstinę talpyklą be susijungimo, galite, pavyzdžiui,

 git read-tree stash^{tree} git checkout-index -af 
3
09 мая '13 в 0:47 2013-05-09 00:47 Atsakymas pateikiamas iki gegužės 09 d. 13 val. 0:47 2013-05-09 00:47

Tai, kad matote susijungimo konfliktą, reiškia, kad foo faile, kurį ištraukėte iš serverio, įvyko gedimas. Taigi, kopijuojant failą ir perkeliant jį, visi failo „repo“ pakeitimai bus visiškai sunaikinti. Jei tai padarysite, kitas asmuo, kuris pakeitimą pakeitė, jums nepatinka.

Atsakymas į jūsų klausimą priklauso nuo to, ką bandote atlikti. Ar bandote pamatyti, kokie pakeitimai serveryje buvo lyginami su jūsų kodu? Ar bandote išvengti bendravimo su kitų žmonių kodu, kol baigsite?

Jei tiesiog norite žinoti, ką keičia filialas, vietoj „ git pull galite naudoti „ git fetch ir palyginti dabartinį kodą su šiuo. Arba, jei dabar nenorite sujungti savo pakeitimų, pagalvokite apie darbą atskirame filiale arba netraukite tol, kol nesate pasiruošęs sujungti.

2
09 мая '13 в 20:03 2013-05-09 20:03 Atsakymą pateikė Jonathan Wren gegužės 09, 13, 20:03 2013-05-09 20:03

Gerai, eikite į kažką panašaus:

 % git stash pop Auto-merging foo CONFLICT (content): Merge conflict in foo Auto-merging bar CONFLICT (content): Merge conflict in bar Auto-merging baz CONFLICT (content): Merge conflict in baz ... # $#@?!?!%$!*@#... 

... geriausias sprendimas, su kuriuo galėjau sugalvoti, yra atsakymas į šį klausimą:

 % git checkout --theirs $(git diff --name-only --diff-filter=U) % git reset % git stash drop 

(Remiantis šiuo atsakymu .)

1
09 мая '13 в 0:19 2013-05-09 00:19 atsakymą įteikė kjo gegužės 09 d. 13 val. 0:19 2013-05-09 00:19

Peržiūrėkite kitus klausimus „ žyma arba užduoti klausimą