Git: Hoe te pooien Alle commits op tak

Ik maak nieuwe tak van masterMET:

git checkout -b testbranch

Ik maak 20 erin.

Nu wil ik die 20 commits pooien. Ik doe dat met:

git rebase -i HEAD~20

Hoe zit het als ik niet weet hoeveel commits? Is er een manier om iets te doen als:

git rebase -i all on this branch

Antwoord 1, Autoriteit 100%

Nog een manier om al uw commits te pooien is om de index opnieuw in te stellen op Master:

git checkout yourBranch
 git reset $(git merge-base master $(git branch --show-current))
 git add -A
 git commit -m "one commit on yourBranch"

Dit is niet perfect omdat het inhoudt dat je weet van waaruit tak “Yourbranch” komt.
Opmerking: het vinden van die Origin Branch is niet eenvoudig / mogelijk met git (de visuele manier is vaak de gemakkelijkste , zoals hier gezien ).

OPMERKING: git branch --show-currentIS geïntroduceerd met GIT 2.22 (Q1 20219) .


EDIT: U moet git push --force

gebruiken


Karlotcha Hoa voegt In de opmerkingen :

Voor de reset kunt u

doen

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 

[dat] wordt automatisch gebruikt de tak waaraan u momenteel bevindt.
En als je dat gebruikt, je kunt ook een alias gebruiken, omdat het commando niet afhankelijk is van de branchnaam.


Antwoord 2, autoriteit 44%

Bekijk de branch waarvoor je alle commits in één commit wilt pletten. Laten we zeggen dat het feature_branchheet.

git checkout feature_branch

Stap 1:

Voer een zachte reset uit van uw origin/feature_branchmet uw lokale main-filiaal (afhankelijk van uw behoeften kunt u ook resetten met origin/main). Dit zal alle extra commits in je feature_branchresetten, maar zonder enige van je bestandswijzigingen lokaal te veranderen.

git reset --soft main

Stap 2:

Voeg alle wijzigingen in je git repo directory toe aan de nieuwe commit die gemaakt gaat worden. En beloof hetzelfde met een bericht.

git add -A && git commit -m "commit message goes here"

Antwoord 3, autoriteit 23%

Wat u doet is behoorlijk foutgevoelig. Gewoon doen:

git rebase -i master

die automatisch alleen de commits van je branch rebaset op de huidige laatste master.


Antwoord 4, autoriteit 17%

Een andere eenvoudige manier om dit te doen: ga naar de origin branch en doe een merge --squash. Dit commando doet de “squashed” commit niet. als je het doet, worden alle commit-berichten van yourBranch verzameld.

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...

Antwoord 5, autoriteit 7%

Ervan uitgaande dat u vertakt vanaf de master, hoeft u niet altijd yourBranchin de resetstap in te voeren:

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"

Uitleg:

  • git rev-list --count HEAD ^mastertelt de commits sinds je je feature branch hebt gemaakt van de master, f.ex. 20.
  • git reset --soft HEAD~20zal een zachte reset uitvoeren van de laatste 20 commits. Dit laat je wijzigingen in de bestanden, maar verwijdert de commits.

Gebruik:

In mijn .bash_profile heb ik een alias toegevoegd voor gisquashom dit met één commando te doen:

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

Na het resetten en committen moet je een git push --forcedoen.

Hint:

Als je Gitlab >= 11.0 gebruikt, hoef je dit niet meer te doen omdat het een squashing-optiebij het samenvoegen van branches.


Antwoord 6, autoriteit 3%

Op basis van het lezen van verschillende vragen en antwoorden van Stackoverflow over squashen, denk ik dat dit een goede oneliner is om alle commits op een branch te squashen:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

Dit veronderstelt dat master de basistak is.


Antwoord 7, autoriteit 3%

Oplossing voor mensen die liever klikken:

  1. Installeer sourcetree(het is gratis)

  2. Controleer hoe uw commits eruit zien. Hoogstwaarschijnlijk heb je iets vergelijkbaars met dit

  3. Klik met de rechtermuisknop op ouder commit. In ons geval is het hoofdtak.

  1. U kunt plakken met vorige door op een knop te klikken. In ons geval moeten we 2 keer klikken. Je kunt ook het commit-bericht wijzigen

  2. Resultaten zijn geweldig en we zijn klaar om te duwen!

Side Opmerking: als u uw gedeeltelijke commits op afstand duwde, moet u Force Push na Squash

gebruiken


Antwoord 8, Autoriteit 3%

Sinds ik wat moeite had met de hier voorgestelde oplossingen, wil ik een heel eenvoudige oplossing delen (die echt werkt, ongeacht):

git merge origin/master && git reset --soft origin/master

De voorgaande Merge CMD zorgt ervoor dat er geen recente wijzigingen van Master op uw hoofd (omgekeerd) gaan bij het plegen! Daarna plegen dan de wijzigingen en doe git push -f


Antwoord 9

Als u Jetbrains Based Ide houdt als Intellij-idee en prefare met GUI over opdrachtregel:

  1. Ga naar Version Control-venster (ALT + 9 / opdracht + 9) – “Log” -tab.
  2. Kies een punt in de boom van waaruit je je tak hebt gemaakt
  3. Klik er met de rechtermuisknop op -> Reset huidige tak naar hier -> Kies zacht (!!!)(het is belangrijk dat u uw wijzigingen niet kwijtraakt)
  4. Druk op de Reset-knop onder in het dialoogvenster.

Dat is het. U hebt al uw wijzigingen ongedaan gemaakt. Als je nu een nieuwe commit maakt, wordt deze geplet


Antwoord 10

U kunt de tool gebruiken die ik speciaal voor deze taak heb gemaakt:

https://github.com/sheerun/git-squash

In principe moet je git squash masteraanroepen en je bent klaar


Antwoord 11

Git-reset, zoals eerder in veel antwoorden vermeld, is verreweg de beste en eenvoudigste manier om te bereiken wat je wilt. Ik gebruik het in de volgende workflow:

(op ontwikkelingstak)

git fetch
git merge origin/master  #so development branch has all current changes from master
git reset origin/master  #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it

Antwoord 12

Al deze git-reset, hard, zacht en al het andere dat hier wordt genoemd, werkt waarschijnlijk (het werkte niet voor mij) als je de stappen correct en een soort van geest uitvoert.

Als je de gemiddelde Joe smo bent, probeer dan dit:
Hoe gebruik je git merge –squash?

Heeft mijn leven gered, en ik ga squashen, ik heb dit 4 keer gebruikt sinds ik erachter kwam. Eenvoudig, schoon en eigenlijk 1 commando.
In het kort:

Als u op een filiaal bent, kunt u het noemen “My_new_feature” uit Ontwikkeling en uw pull-aanvraag heeft 35 commits (of echter veel) en u wilt dat het 1 is.

A. Zorg ervoor dat uw filiaal up-to-date is, ontwikkelt u, ontvang de nieuwste en samenvoeging en las eventuele conflicten op met “My_new_Feature”
(Deze stap zou je echt moeten nemen zodra je hoe dan ook kunt worden)

B. Krijg het nieuwste van ontwikkelen en takken naar een nieuwe tak noemen
“My_new_feature_squashed”

c. Magie is hier.
Je wilt je werk nemen van “my_new_feature” naar “my_new_feature_squashed”
Dus doe het gewoon (terwijl we tijdens je nieuwe branche ontwikkelden zich ontwikkelen):
Git Merge –Squash My_new_Feature

Al uw wijzigingen zijn nu op uw nieuwe tak, voel je vrij om het te testen, dan doe je je 1 enkele commit, duw, nieuwe PR van die tak – en wacht op herhaling de volgende dag.
Hou je niet van codering? 🙂


Antwoord 13

Een andere oplossing zou zijn om alle commit-logs op te slaan op een bestand

Git log & GT; tak.log

Nu tak.log heeft alle commit-ID’s sinds het begin .. Scroll naar beneden en neem de eerste commit (dit is moeilijk in terminal)
gebruik van de eerste commit

Git Reset –Soft

Alle commits worden ingepakt


Antwoord 14

Hoewel dit antwoord een beetje uitgebreid is, staat u toe dat u een enkele commit-tak maakt door een enkele samenvoeging met een andere tak te doen. (Geen rebasing / squashing / samenvoegende individuele commits).

Omdat we niet om de tussencommangen geven, kunnen we een eenvoudige oplossing gebruiken:

# Merge and resolve conflicts
git merge origin/master
# Soft reset and create a HEAD with the version you want
git reset --soft origin/master
git commit -m "Commit message"
git push origin your-branch -f

… vervolgens om de geschiedenis te verwijderen …

# Get the most up-to-date master
git checkout master
git reset --hard
# Create a temporary branch
git checkout -b temp-branch
# Retrieve the diff between master and your-branch and commit with a single commit
git checkout origin/your-branch
git commit -m "Feature commit"
# Force push to the feature branch
git push origin temp-branch:your-branch -f
# Clean up
git checkout your-branch
git branch -D temp-branch

Dit kan allemaal in een bash-functie worden geplaatst met 3 params zoals de squashall --their master --mine your-branch --msg "Feature commit"En het zal zo lang als jij werken heb de juiste versie van bestanden lokaal.


Antwoord 15

In het geval dat u in orde bent met een antwoord met een andere tak, probeer dan git checkout --orphan <new_branch>Hierdoor konden ik eenvoudig alle bestanden uit de vorige branche plegen als één commit.

Dit is zoiets als een git-merge squash maar niet helemaal hetzelfde.

Other episodes