Ar yra būdas sutraiškyti kelis kartus, kurie neinteraktyviai įsipareigoja?

Aš stengiuosi nuvalyti kelis įsipareigojimus - HEAD HEAD ~ 3. Ar yra greitas būdas tai padaryti, ar turiu naudoti „interaktyvią“ versiją?

82
01 сент. rinkinys Phillip 01 sept. 2011-09-01 22:31 '11 ne 22:31 2011-09-01 22:31
@ 7 atsakymai

Įsitikinkite, kad darbinis medis yra švarus

 git reset --soft HEAD~3 git commit -m'new commit message' 
95
01 сент. atsakymas duotas wilhelmtell 01 Sep 2011-09-01 22:46 '11 ne 22:46 2011-09-01 22:46

Asmeniškai mėgstu wilhelmtell sprendimą :

 git reset --soft HEAD~3 git commit -m 'new commit message' 

Tačiau aš padariau slapyvardį su kai kuriais klaidų tikrinimais, kad galėtumėte tai padaryti:

 git squash 3 'my commit message' 

Aš rekomenduoju sukurti slapyvardžius, kurie iš tikrųjų vykdo scenarijus, kad būtų lengviau (a) koduoti savo scenarijus ir (b) atlikti sudėtingesnį darbą su klaidų tikrinimu. Žemiau yra scenarijus, kuris atlieka skvošo darbą, o tada yra mažesnis už scenarijų, kad nustatytumėte slapyvardžius.

border=0

Skripto platinimui (squash.sh)

 #!/bin/bash # #get number of commits to squash squashCount=$1 #get the commit message shift commitMsg=$@ #regular expression to verify that squash number is an integer regex='^[0-9]+$' echo "---------------------------------" echo "Will squash $squashCount commits" echo "Commit message will be '$commitMsg'" echo "...validating input" if ! [[ $squashCount =~ $regex ]] then echo "Squash count must be an integer." elif [ -z "$commitMsg" ] then echo "Invalid commit message. Make sure string is not empty" else echo "...input looks good" echo "...proceeding to squash" git reset --soft HEAD~$squashCount git commit -m "$commitMsg" echo "...done" fi echo exit 0 

Tada, norėdami prijungti šį „ squash.sh“ scenarijų į „git“ slapyvardį, sukurkite kitą scenarijų, kad sukonfigūruotumėte tokius slapyvardžius kaip šis ( create_aliases.command arba create_aliases.sh ):

 #!/bin/sh echo '-----------------------' echo 'adding git aliases....' echo '-----------------------' echo git config --global alias.squash "!bash -c 'bash <path to scripts directory>/squash.sh \$1 \$2' -" #add your other git aliases setup here #and here #etc. echo '------------------------------------' echo 'here is your global gitconfig file:' echo '------------------------------------' more ~/.gitconfig echo echo echo '----------------' echo 'end of script...' echo '----------------' 
25
03 июня '14 в 17:58 2014-06-03 17:58 atsakymas pateikiamas n8tr. birželio 03 d. 14 val. 17:58 2014-06-03 17:58

Naudoju:

 EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref> 

Dirbo gerai. Tiesiog nebandykite turėti fiksavimo žurnalo su eilute, prasidedančia „pick“ :)

4
20 сент. Julien Wajsberg atsakymas 20 rugsėjis 2013-09-20 13:05 '13, 13:05, 2013-09-20 13:05

Naudokite šią komandą, jei norite paskutinis 4 įvykis paskirti paskutinio įsipareigojimo metu:

 git squash 4 

Pseudonimas:

 squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f" sq = !git squash $1 sqpsf = !git squash $1  git psf 

https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

2
01 марта '15 в 5:13 2015-03-01 05:13 atsakymą pateikė brauliobo kovo 1 d. 15 d. 5:13 2015-03-01 05:13

Jei norite pridėti wilhelmtell atsakymą, surandu patogų „reset“ funkciją HEAD ~ 2, o tada pakeis įrašą į HEAD ~ 3:

 git reset --soft HEAD~2 git commit --all --amend --no-edit 

Tai yra visų įsipareigojimų, susijusių su HEAD ~ 3, susijungimas ir įsipareigojimo pranešimo naudojimas. Būtinai pradėkite švarų darbo medį.

2
20 авг. atsakymas yra harmoningas 20 rug. 2017-08-20 13:20 '17, 13:20 pm 2017-08-20 13:20

Čia yra vienas skvošas, skirtas dviem paskutiniams įvykiams. Šiame pavyzdyje bus išsaugotas antrojo paskutinio įvykio pranešimas. Galite pakeisti pranešimą, kaip norite.

 git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs  git reset --soft HEAD~2)" 

Ši komanda bus labai naudinga, jei sukursite šios komandos slapyvardį ir vietoj to naudosite slapyvardį.

1
28 июня '17 в 15:26 2017-06-28 15:26 Atsakymą Jasiras pateikia birželio 28 d. 17, 15:26 2017-06-28 15:26

Jūs galite gauti gana arti

  git rebase --onto HEAD ~ 4 HEAD ~ meistras 

Tai rodo, kad esate ant linijos su linijine istorija. Tai tikrai nėra skvošas, nes atmeta tarpinius įsipareigojimus. Jums reikės pakeisti naują HEAD, kad pakeistumėte įsipareigojimo pranešimą.

0
01 сент. atsakymas, kurį pateikė Greg Bacon, rugsėjo 01 d 2011-09-01 22:54 '11 10:54 val. 2011-09-01 22:54