Verwijder commits van een branch in Git

Ik zou graag willen weten hoe ik een commit kan verwijderen.

Met delete bedoel ik dat het is alsof ik die commit niet heb gemaakt, en als ik in de toekomst een push doe, zullen mijn wijzigingen niet naar de remote branch worden gepusht.

Ik heb git help gelezen, en ik denk dat het commando dat ik moet gebruiken git reset --hard HEAD is. Klopt dit?


Antwoord 1, autoriteit 100%

Let op: git reset --hard VERWIJDERT UW WERKLIJST WIJZIGINGEN. Zorg ervoor dat u alle lokale wijzigingen die u wilt behouden opslaat voordat u deze opdracht uitvoert.

Ervan uitgaande dat je op die commit zit, dan zal dit commando hem uitlachen…

git reset --hard HEAD~1

De HEAD~1 betekent de commit voor head.

Of je zou naar de uitvoer van git log kunnen kijken, de commit id vinden van de commit waarvan je een back-up wilt maken, en dan dit doen:

git reset --hard <sha1-commit-id>

Als je er al op hebt geduwd, moet je geforceerd duwen om er vanaf te komen…

git push origin HEAD --force

Echter, als anderen het misschien hebben gehaald, dan zou je beter een nieuwe branch kunnen beginnen. Omdat wanneer ze trekken, het het gewoon in hun werk zal samenvoegen, en je zal het weer omhoog duwen.

Als je al gepusht hebt, is het misschien beter om git revert te gebruiken, om een ​​”mirror image” commit te maken die de wijzigingen ongedaan zal maken. Beide commits staan ​​echter in het logboek.


Ter info — git reset --hard HEAD is geweldig als je WORK IN PROGRESS wilt verwijderen. Het zal je terugzetten naar de meest recente commit en alle wijzigingen in je werkboom en index wissen.


Ten slotte, als je een commit moet vinden die je hebt “verwijderd”, is deze meestal aanwezig in git reflog, tenzij je je repository hebt verzameld.


Antwoord 2, autoriteit 17%

Als je de commit nog nergens hebt gepusht, kun je git rebase -i om die commit te verwijderen. Zoek eerst uit hoe ver terug die commit is (ongeveer). Doe dan:

git rebase -i HEAD~N

De ~N betekent rebase de laatste N commits (N moet een getal zijn, bijvoorbeeld HEAD~10). Vervolgens kun je het bestand dat Git je presenteert bewerken om de beledigende commit te verwijderen. Bij het opslaan van dat bestand, zal Git alle volgende commits herschrijven alsof degene die je verwijderde niet bestond.

Het Git Book heeft een goede sectie over rebasen met afbeeldingen en voorbeelden.

Wees hier echter voorzichtig mee, want als je iets verandert dat je ergens anders hebt gepusht, is een andere aanpak nodig, tenzij je van plan bent om een ​​force push uit te voeren.


Antwoord 3, autoriteit 12%

Een andere mogelijkheid is een van mijn persoonlijke favoriete commando’s:

git rebase -i <commit>~1

Dit zal de rebase starten in interactieve modus -i op het punt net voor de commit die je wilt meppen. De editor zal beginnen met het opsommen van alle commits sindsdien. Verwijder de regel met de commit die je wilt wissen en sla het bestand op. Rebase doet de rest van het werk, verwijdert alleen die commit en speelt alle andere opnieuw af in het logboek.


Antwoord 4, autoriteit 8%

Ik voeg dit antwoord toe omdat ik niet begrijp waarom iemand die zojuist heeft geprobeerd werk te committen, al dat werk zou willen verwijderen vanwege een fout bij het gebruik van Git!

Als je je werk wilt behouden en dat commit-commando gewoon ‘ongedaan wilt maken’ (je betrapt voordat je naar repo pushte):

git reset --soft HEAD~1

Gebruik de –hard vlag niet tenzij je je werk in uitvoering sinds de laatste commit wilt vernietigen.


Antwoord 5, autoriteit 5%

Een volledige commit verwijderen

git rebase -p --onto SHA^ SHA

Vervang uiteraard “SHA” door de referentie die u wilt verwijderen. De “^” in dat commando is letterlijk.

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep


Antwoord 6, autoriteit 2%

Stel dat we commits 2 & 4 van de repo. (Hoe hoger hoe nieuwer de commit; 0 is de oudste commit en 4 is de laatste commit)

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Opmerking: U moet beheerdersrechten hebben over de repo aangezien u --hard en -f gebruikt.

  • git checkout b3d92c5 Check de laatste bruikbare commit.
  • git checkout -b repair Maak een nieuwe branch om aan te werken.
  • git cherry-pick 77b9b82 Doorloop commit 3.
  • git cherry-pick 2c6a45b Doorloop commit 1.
  • git checkout master Checkout master.
  • git reset --hard b3d92c5 Master resetten naar laatste bruikbare commit.
  • git merge repair Voeg onze nieuwe branch samen met master.
  • git push -f origin master Push master naar de externe repo.

Antwoord 7

Als je geen wijzigingen hebt gepubliceerd, kun je de laatste vastlegging verwijderen

$ git reset --hard HEAD^

(merk op dat hierdoor ook alle niet-vastgelegde wijzigingen worden verwijderd; wees voorzichtig).

Als je de te verwijderen commit al hebt gepubliceerd, gebruik dan git revert

$ git revert HEAD

Antwoord 8

git reset --hard commitId
git push <origin> <branch> --force

PS: CommitId verwijst naar degene waarnaar u wilt terugkeren


Antwoord 9

Geschiedenis krachtig wijzigen

Ervan uitgaande dat je niet alleen de laatste commit wilt verwijderen, maar ook specifieke commits van de laatste n commits, ga dan met:

git rebase -i HEAD~<number of commits to go back>, dus git rebase -i HEAD~5 als je de laatste vijf commits wilt zien .

Verander in de teksteditor het woord pick in drop naast elke commit die je wilt verwijderen. Sla op en sluit de editor af. Voilà!

Geschiedenis aanvullend wijzigen

Probeer git revert <commit hash>. Revert zal een nieuwe commit maken dat maakt de opgegeven commit ongedaan.


Antwoord 10

Als je je laatste commit wilt verbeteren, kun je de commit ongedaan maken en de bestanden erin ongedaan maken door het volgende te doen:

git reset HEAD~1

Dit zal je repository terugbrengen naar de staat voor de git add-commando’s die de bestanden hebben gestaged. Uw wijzigingen staan ​​in uw werkmap. HEAD~1 verwijst naar de commit onder de huidige tip van de branch.

Als je N commits wilt decommitteren, maar de codewijzigingen in je werkdirectory wilt behouden:

git reset HEAD~N

Als je van je laatste commit af wilt en de wijzigingen in de code niet wilt behouden, kun je een “harde” reset uitvoeren.

git reset --hard HEAD~1

Evenzo, als je de laatste N commits wilt weggooien en de codewijzigingen niet wilt behouden:

git reset --hard HEAD~N

Antwoord 11

[Snel antwoord]

Je hebt veel alternatieven, bijvoorbeeld:

  • Alternatief 1:

    git rebase -i <YourCommitId>~1
    

    Wijzig YourCommitId voor het nummer van de commit waarnaar je wilt terugkeren.

  • Alternatief 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Wijzig YourCommitId voor het nummer van de commit waarnaar je wilt terugkeren.

    Ik raad deze optie niet aan omdat u uw werk in uitvoering kunt verliezen.

  • Alternatief 3:

    git reset --soft HEAD~1
    

    Je kunt je werk behouden en alleen de vastlegging ongedaan maken.


Antwoord 12

git rebase -i HEAD~2

Hier is ‘2’ het aantal commits dat je wilt rebasen.

'git rebase -i HEAD`

als je alle commits opnieuw wilt baseren.

Dan kun je een van deze opties kiezen.

p, pick = use commit

r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit

Deze regels kunnen opnieuw worden geordend; ze worden van boven naar beneden uitgevoerd.
Als u hier een regel verwijdert, GAAT DEZE COMMIT VERLOREN.
Als u echter alles verwijdert, wordt de rebase afgebroken.
Merk op dat lege commits worden uitgecommentarieerd

Je kunt die commit eenvoudig verwijderen met optie “d” of Een regel verwijderen met jouw commit.


Antwoord 13

Gebruik

. om in de lokale vestiging te verwijderen

git reset --hard HEAD~1

Om te verwijderen in een vertakking op afstand, gebruik

git push origin HEAD --force

Antwoord 14

Bron: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf22966cf79d8

Verwijder de laatste commit

Bijvoorbeeld je laatste commit

git push origin +aa61ab32^:master

Nu wil je deze commit verwijderen en een gemakkelijke manier om dit als volgt te doen

Stappen

  1. Reset eerst de branch naar de ouder van de huidige commit

  2. Duw hem met kracht naar de afstandsbediening.

git reset HEAD^ --hard
git push origin -f

Voor een bepaalde commit die je wilt resetten volgt

git reset bb676878^ --hard
git push origin -f

Antwoord 15

Hier is een andere manier om dit te doen:

Bekijk de branch die je wilt terugzetten, en reset dan je lokale werkkopie terug naar de commit die je als laatste wilt hebben op de remote server (alles daarna gaat tot ziens). Om dit te doen, heb ik in SourceTree met de rechtermuisknop geklikt op de en selecteerde “Reset BRANCHNAME to this commit”. Ik denk dat de opdrachtregel is:

git reset --hard COMMIT_ID

Omdat je zojuist je branch op afstand hebt uitgecheckt, hoef je je geen zorgen te maken over lokale wijzigingen. Maar dit zou ze kwijtraken als je dat deed.

Navigeer vervolgens naar de lokale map van uw repository en voer deze opdracht uit:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Hiermee worden alle commits gewist na de huidige in je lokale repository, maar alleen voor die ene branch.


Antwoord 16

Alle bovenstaande commando’s herstellen de staat van uw werkboom en index zoals ze waren voordat u de vastlegging maakte, maar herstellen niet de staat van de repository. Als je ernaar kijkt, wordt de “verwijderde” commit niet echt verwijderd, het is gewoon niet degene op het puntje van de huidige branch.

Ik denk dat er geen manier is om een ​​commit te verwijderen met porseleinen commando’s. De enige manier is om het uit de log en reflog te verwijderen en dan een git prune --expire -now uit te voeren.


Antwoord 17

De fout:

Ik git rebase -i --root‘ed mijn branch aan, onwetend denkend dat ik de eerste commit anders kon formuleren dan de master (de standaardweergave van GitHub voor Windows is de vergelijking met meester, het verbergen van het geheel).

Ik liet een baard in Silicon Valley groeien terwijl 900+ commits zichzelf in Sublime laadden. Afsluiten zonder wijzigingen, ik laadde mijn batterij op en ging verder met scheren, terwijl alle 900+ individuele commits nonchalant opnieuw werden gebaseerd – hun commit-tijden resetten naar nu.

Vastbesloten om Git te verslaan en de originele tijden te behouden, heb ik deze lokale repository verwijderd en opnieuw gekloond vanaf de afstandsbediening.

Nu had het een meest recente onnodige commit aan master toegevoegd die ik wilde verwijderen, dus ging zo verder.

Uitputtende opties:

Ik wilde niet git revert – het zou een extra commit creëren, waardoor Git de overhand zou krijgen.

git reset --hard HEAD deed niets, na het controleren van de reflog was de laatste en enige HEAD de kloon – Git wint.

Om de meest recente SHA te krijgen, heb ik de externe repository op github.com gecontroleerd – kleine overwinning.

Na te hebben gedacht dat git reset --hard <SHA> had gewerkt, heb ik een andere branch geüpdatet naar master en 1… 2… poef! de commit was terug – Git wint.

Terug naar master, tijd om git rebase -i <SHA> te proberen, verwijder dan de regel… het mocht niet baten, helaas. “Als je hier een regel verwijdert, GAAT DIE COMMIT VERLOREN“. Ah… de nieuwe functie troll the n00b verdoezeld in de 2.8.3 release-opmerkingen.

De oplossing:

git rebase -i <SHA> dan d, drop = remove commit.

Om te verifiëren, heb ik uitgecheckt naar een andere branch, en voila – geen verborgen commit om op te halen/trekken van de master.

https://twitter.com/holman/status/706006896273063936

Goedendag voor jou.


Antwoord 18

Als je de geschiedenis wilt behouden, met daarin de commit en het terugzetten, gebruik dan:

git revert GIT_COMMIT_HASH

voer het bericht in dat uitlegt waarom je teruggaat en dan:

git push  

Als je git log uitgeeft, zie je zowel de “verkeerde” commit als de logberichten terugzetten.


Antwoord 19

Als je zojuist je laatste commit hebt verprutst (verkeerd bericht, vergeten wat wijzigingen toe te voegen) en je wilt dit repareren voordat je het naar een openbare opslagplaats pusht, waarom gebruik je dan niet:

git commit --amend -m "New message here"

Als je nieuw gestagede wijzigingen hebt, worden ze gecombineerd met de laatste commit (waar je vanaf probeert te komen) en zullen ze die commit vervangen.

Als je een commit wijzigt nadat je het hebt gepusht, herschrijf je natuurlijk de geschiedenis, dus als je dat doet, zorg er dan voor dat je de implicaties begrijpt.

Je kunt ook de ‘–no-edit’ optie doorgeven in plaats van ‘-m’ als je liever het bericht van de vorige commit wilt gebruiken.

Documenten:
http://git-scm.com/docs/git-commit.html


Antwoord 20

Wat ik meestal doe als ik commit en push (als iemand zijn commit pusht, lost dit het probleem op):

git reset --hard HEAD~1
git push -f origin

hoop dat dit helpt


Antwoord 21

Ik heb al geduwd. Moet op afstand een aantal commits terugsturen.
Heb veel variaties geprobeerd,
maar alleen dit van Justin via git bush werkt prima voor mij:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Antwoord 22

Als je al gepusht hebt, zoek dan eerst de commit die je wilt hebben op HEAD ($GIT_COMMIT_HASH_HERE), en voer dan het volgende uit:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Vervolgens elke plaats waar de repo is gekloond, voer je uit:

git reset --hard origin/master

Antwoord 23

Reset op lokale vestiging

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Duwen naar oorsprong forceren

git push -f origin

Antwoord 24

// display git commit log    
$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

Referentie: Hoe om een ​​commit te verwijderen in git, lokaal en op afstand


Antwoord 25

git reset --hard HEAD~1

Je bent nu bij het vorige hoofd. Trek aan de tak. Nieuwe code pushen. Commit wordt verwijderd uit git


Antwoord 26

Maak een back-up van uw code in de tijdelijke map. Het volgende commando zal hetzelfde resetten als de server.

git reset --hard HEAD
git clean -f
git pull

Als je je wijzigingen wilt behouden en recente toezeggingen wilt verwijderen

git reset --soft HEAD^
git pull

Antwoord 27

verwijder lokale commit

Zoals je op bovenstaande afbeelding kunt zien, wil ik revert”test change 2″ commit(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2(je kunt SHA1 ID verkrijgen met de opdracht gitk) verwijderen in git bash)).

Daarvoor kan ik gebruiken (alle onderstaande commando’s werken alleen op lokaal. je moet drukken na het verwijderen):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //het maakt een back-up van die commit (SHA1 ID van test change 4 commit is 515b5220c50e3dfbb1063f23789d92ae )
  2. git reset --hard HEAD~1 // het maakt een back-up van je voordat je een commit doet.
  3. git reset --hard HEAD^ // Om de laatste commit van git te verwijderen

na verwijderen:

na verwijderen commit


Antwoord 28

Hier plaats ik slechts één duidelijke pijplijn om dit te doen

Stap1: Gebruik git log om de commit ID te krijgen.

git log

voer hier de afbeeldingsbeschrijving in

Stap2: Gebruik git reset om terug te gaan naar de vorige versie:

git reset --hard <your commit id>

Antwoord 29

git reset –hard

git push oorsprong HEAD –force

Als een of meer van de commits getagd zijn, verwijder dan eerst de tag(s). Anders wordt de getagde commit niet verwijderd.


Antwoord 30

Voor mij deed rebase het goed

$ git rebase -i HEAD~98
# Delete everything except for the most recent commit on the shown editor caused by "rebase"
$ git push origin -f production-static

OPMERKING:
Na het forceren van de push om mijn opmerkingen te verminderen. Ik heb toen een andere set bestanden gepusht en vervolgens geprobeerd met dezelfde “repository & branch” op een andere computer te pullen. Verrassend genoeg is er geen conflict. Dit werd mijn manier om de omvang van de repository te verkleinen en tegelijkertijd pull-conflicten te vermijden bij mijn andere lokale bewoners die dezelfde git gebruiken

LEAVE A REPLY

Please enter your comment!
Please enter your name here

one × 5 =

Other episodes