Verwijder een bestand uit de lijst die zal worden vastgelegd

Ik heb een lijst met gewijzigde bestanden in de git-repository. Er is één bestand dat ik op dit moment niet wil vastleggen. Kan ik doen:

git commit -a

Om alle bestanden vast te leggen en dan op de een of andere manier dat bestand uit de huidige vastlegging te verwijderen? Na zo’n verwijdering zou het nog steeds in de lijst met niet-toegewezen bestanden moeten staan.


Antwoord 1, autoriteit 100%

U wilt dit doen:

git add -u
git reset HEAD path/to/file
git commit

Wees er zeker van en doe dit vanaf het hoogste niveau van de repo; add -uvoegt wijzigingen toe in de huidige map (recursief).

De sleutelregel vertelt git om de versie van het gegeven pad in de index (het staging-gebied voor de commit) te resetten naar de versie van HEAD (de momenteel uitgecheckte commit).

En waarschuwing vooraf voor een probleem voor anderen die dit lezen: add -uvoert alle wijzigingen uit, maar voegt geen niet-getrackte bestanden toe. Dit is hetzelfde als wat commit -adoet. Als je ook niet-bijgehouden bestanden wilt toevoegen, gebruik dan add .om allesrecursief toe te voegen.


Antwoord 2, autoriteit 68%

git rm --cachedzal het uit de commit-set verwijderen (“un-toevoegen”); dat klinkt als wat je wilt.


Antwoord 3, autoriteit 22%

als je je commit al hebt gepusht. doen

git checkout origin/<remote-branch> <filename>
git commit --amend

EN Als je de wijzigingen niet op de server hebt gepusht, kun je

git reset --soft HEAD~1

Antwoord 4, autoriteit 8%

Gebruik stash; zoals dit:

git add .
git reset Files/I/Want/To/Keep
git stash --keep-index
git commit -a -m "Done!"
git stash pop

Als je per ongelukeen bestand commit en je git-geschiedenis wilt herschrijven, gebruik dan:

git reset HEAD~1 path/to/file
git commit -a -m "rollback"
git rebase -i HEAD~2

en squash naar de twee leidende commits. Je kunt een helperscript schrijven om een ​​van deze twee te doen als je een bekende set bestanden hebt die je liever niet automatisch vastlegt.


Antwoord 5, autoriteit 2%

Misschien kunt u ook stash gebruiken om uw wijzigingen tijdelijk op te slaan in een patchbestand en het vervolgens opnieuw toe te passen (na het uitchecken om terug te keren naar de oude versie). Dit kan te maken hebben met dit andere onderwerp: Hoe kan ik een enkel bestand (of wijzigingen in een bestand) uit een git-stash extraheren?.


Antwoord 6, autoriteit 2%

Als je een git-add hebt gedaan en je hebt nog niets gepusht, hoef je dit alleen maar te doen om het uit je commit te halen.

git reset HEAD <file>


Antwoord 7

Antwoord:

git reset HEAD path/to/file

Antwoord 8

Je moet dat bestand terugzetten naar de originele staat en het opnieuw vastleggen met --amend. Dit gaat het gemakkelijkst met git checkout HEAD^.

Demo voorbereiden:

$ git init
$ date >file-a
$ date >file-b
$ git add .
$ git commit -m "Initial commit"
$ date >file-a
$ date >file-b
$ git commit -a -m "the change which should only be file-a"

Vermeld voor:

$ git show --stat
commit 4aa38f84e04d40a1cb40a5207ccd1a3cb3a4a317 (HEAD -> master)
Date:   Wed Feb 7 17:24:45 2018 +0100
    the change which should only be file-a
 file-a | 2 +-
 file-b | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

Hier komt het: herstel de vorige versie

$ git checkout HEAD^ file-b

vastleggen:

$ git commit --amend file-b
[master 9ef8b8b] the change which should only be file-a
 Date: Wed Feb 7 17:24:45 2018 +0100
 1 file changed, 1 insertion(+), 1 deletion(-)

Vermeld na:

$ git show --stat
commit 9ef8b8bab224c4d117f515fc9537255941b75885 (HEAD -> master)
Date:   Wed Feb 7 17:24:45 2018 +0100
    the change which should only be file-a
 file-a | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Antwoord 9

De meeste van deze antwoorden circuleren rond het verwijderen van een bestand uit de “staging area” pre-commit, maar ik merk dat ik hier vaak kijk nadat ik al een commit heb gedaan en ik wat gevoelige informatie wil verwijderen uit de commit die ik zojuist heb gemaakt.

Een makkelijk te onthouden truc voor jullie allemaal git commit --amendmensen die er zijn zoals ik, is dat je:

  1. Verwijder het per ongeluk vastgelegde bestand.
  2. git add .om de verwijdering toe te voegen aan de “staging area”
  3. git commit --amendom het bestand uit de vorige commit te verwijderen.

Je zult in het commit-bericht opmerken dat het ongewenste bestand nu ontbreekt. Hoera! (Commit SHAis gewijzigd, dus wees voorzichtig als je je wijzigingen al naar de afstandsbediening hebt gepusht.)

Other episodes