Vraag Stash slechts één bestand uit meerdere bestanden die zijn veranderd met Git?


Hoe kan ik slechts één van meerdere gewijzigde bestanden op mijn filiaal plaatsen?


2437
2018-06-14 20:52


oorsprong


antwoorden:


Waarschuwing

Zoals opgemerkt in de opmerkingen, stopt dit alles in de stash, zowel geënsceneerd als niet-gestagineerd. De --ke-index verlaat net de index alleen nadat de opslag is voltooid. Dit kan leiden tot samenvoegconflicten wanneer u later de stash opent.


Hiermee wordt alles opgeslagen dat je nog niet eerder hebt toegevoegd. Net git add de dingen die je wilt bewaren, en voer het dan uit.

git stash --keep-index

Als u bijvoorbeeld een oude commit in meerdere changesets wilt splitsen, kunt u deze procedure gebruiken:

  1. git rebase -i <last good commit>
  2. Markeer enkele wijzigingen als edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Repareer dingen zo nodig. Vergeet niet om git add enige veranderingen.
  7. git commit
  8. git stash pop
  9. Herhaal, vanaf # 5, zoals nodig.
  10. git rebase --continue

1216
2017-11-30 21:28



Je kan ook gebruiken git stash save -p "my commit message". Op deze manier kun je selecteren welke hunks aan de stash moeten worden toegevoegd, ook hele bestanden kunnen worden geselecteerd.

Er worden voor elke homp enkele acties uitgevoerd:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help

2612
2017-07-31 11:59



Omdat git fundamenteel draait om het beheren van een volledige repository inhoud en index (en niet een of meerdere bestanden), git stash deals, niet verrassend, met de volledige werkdirectory.

Eigenlijk, sinds Git 2.13 (Q2 2017), kun je individuele bestanden stashen, met:

git stash push [--] [<pathspec>...]

Zien "Verberg wijzigingen in specifieke bestanden" voor meer.


Het oorspronkelijke antwoord (hieronder, juni 2010) ging over het handmatig selecteren van wat je wilt stashen.

Casebash opmerkingen:

Dit de stash --patch originele oplossing) is leuk, maar vaak heb ik veel bestanden aangepast, dus het gebruik van een patch is vervelend

bukzor's antwoord (upvoted, november 2011) suggereert een meer praktische oplossing, gebaseerd op
git add + git stash --keep-index.
Ga en zie zijn antwoord, dat de officiële zou moeten zijn (in plaats van het mijne).

Over die optie, chhh wijst op een alternatieve workflow in de comments:

je zou moeten "git reset --soft"na zo'n voorraad om je heldere enscenering terug te krijgen:
  Om de oorspronkelijke staat te bereiken - wat een duidelijk staging gebied is en met slechts enkele selecte niet-gefaseerde modificaties, kan men de index zacht resetten om te krijgen (zonder iets te doen zoals jij - bukzor - deed).


(Oorspronkelijk antwoord juni 2010: handmatige stash)

Nog, git stash save --patch zou je de gedeeltelijke opslag kunnen geven die je zoekt:

Met --patch, kun je interactief uit de diff afkomstige hunks selecteren tussen HEAD en de werkboom die moet worden opgeborgen.
  De stash-invoer is zo geconstrueerd dat de indexstatus hetzelfde is als de indexstatus van uw repository en de worktree bevat alleen de wijzigingen die u interactief hebt geselecteerd. De geselecteerde wijzigingen worden vervolgens teruggedraaid vanuit uw werkboom.

Dit bespaart echter de volledige index (wat misschien niet is wat u wilt, omdat het andere geïndexeerde bestanden kan bevatten) en een gedeeltelijke worktree (die eruit zou kunnen zien als degene die u wilt stashen).

git stash --patch --no-keep-index

kan een betere pasvorm zijn.


Als --patchwerkt niet, een handmatig proces kan:

Voor een of meerdere bestanden zou een tussenoplossing zijn om:

  • kopieer ze buiten de Git-repo
    (Werkelijk, eleotlecram stelt een interessant alternatief)
  • git stash
  • kopieer ze terug
  • git stash # deze keer zijn alleen de gewenste bestanden opgeslagen
  • git stash pop stash@{1} # pas al uw bestandswijzigingen opnieuw toe
  • git checkout -- afile # reset het bestand naar de HEAD-inhoud, vóór eventuele lokale wijzigingen

Aan het einde van dat nogal omslachtige proces zul je slechts één of meerdere bestanden hebben opgeslagen.


237
2018-06-14 21:23



Wanneer git stash -p (of git add -p met stash --keep-index) zou te omslachtig zijn, ik vond het gemakkelijker te gebruiken diff, checkout en apply:

Om een ​​bepaald bestand / dir alleen te "stashen":

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Daarna daarna

git apply stashed.diff

76
2018-02-12 13:44



Laten we zeggen dat je 3 bestanden hebt

a.rb
b.rb
c.rb

en je wilt alleen b.rb en c.rb opslaan maar niet a.rb

je kunt zoiets doen

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

En je bent klaar! HTH.


43
2017-10-31 07:10



Gebruik git stash push, soortgelijk:

git stash push [--] [<pathspec>...]

Bijvoorbeeld:

git stash push -- my/file.sh

Dit is beschikbaar sinds Git 2.13, uitgebracht in het voorjaar van 2017.


33
2017-08-15 13:10



Een andere manier om dit te doen:

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

Ik bedacht dit nadat ik (nogmaals) naar deze pagina was gekomen en de eerste twee antwoorden niet leuk vond (het eerste antwoord beantwoordt gewoon niet de vraag en ik vond het niet leuk om met de -p interactieve modus).

Het idee is hetzelfde als wat @VonC voorstelde met behulp van bestanden buiten de repository, je bewaart de gewenste wijzigingen ergens, verwijdert de wijzigingen die je niet wilt in je stash en past de wijzigingen die je uit de weg hebt gedaan opnieuw toe. Ik gebruikte de git-voorraad echter als "ergens" (en als een resultaat is er een extra stap aan het einde: het verwijderen van de cahnges die je in de voorraad hebt gestopt, omdat je deze ook uit de weg hebt gehaald).


25
2018-02-05 10:16