Git Tips van de profs

U gebruikt al bronbeheer voor het beheren van uw code, toch? Misschien gebruikt u uw SCM zelfs als het centrale deel van uw workflow, zoals we bij New Relic doen.

In dit artikel gaan we niet in op de basisbeginselen van beheer van bronbesturingselementen, ongeacht welke u gebruikt. Laten we aannemen dat je al weet hoe je de weg leert. Wat we gaan bespreken is hoe de profs Git gebruiken. We zullen enkele van de geavanceerde functies en workflows bekijken die u misschien nog niet kent. Hopelijk loop je weg met je mond in de ban van de mogelijkheden die git biedt!

Als je op mij lijkt, vind je het leuk om te ontdekken hoe andere ontwikkelaars werken.

Voor niet-ingewijden, of degenen die afkomstig zijn van een andere SCM, is Git een gedistribueerd versiebeheersysteem. Het is gratis en open source, heeft een kleine footprint en past in de workflow die het beste bij u past. In het algemeen wordt u niet gedwongen om op een bepaalde manier te werken, wat betekent dat er veel verschillende methodologieën zijn voor het gebruik van de functies, zoals staging-gebieden, branching en tagging-releases. Als je op mij lijkt, vind je het leuk om te ontdekken hoe andere ontwikkelaars werken. Dus maak je klaar om te beginnen met het aanpassen van je .gitconfig, omdat je zin hebt om te trakteren. Laten we eens kijken hoe de profs Git gebruiken.


Fase je veranderingen in Hunks

U bent waarschijnlijk bekend met het per ongeluk wijzigen van een enkel bestand om twee verschillende redenen zonder tussentijds vast te leggen.

U bent zeker bekend met het toevoegen van bestanden aan het verzamelgebied met de toepasselijke naam toevoegen commando. En u bent waarschijnlijk bekend met het per ongeluk wijzigen van een enkel bestand om twee verschillende redenen zonder tussentijds vast te leggen. Dus je zult er zeker een hebben git log vol met berichten zoals "Bewerk X en verander niet-gerelateerde Y". Als dit klinkt als uw workflow, is interactief toevoegen uw nieuwe beste vriend.

Als u een patch interactief toevoegt of toevoegt, kunt u één voor één de wijzigingen doorlopen. Wanneer u een bestand toevoegt met de -p opdracht, wordt u om elke logische wijziging gevraagd (dat wil zeggen dat achtereenvolgens bewerkte regels worden gegroepeerd). Er zijn een aantal keuzes die je kunt maken op elke homp, van het splitsen van de huidige homp in kleinere, het overslaan van een homp, of zelfs handmatig bewerken. Gebruik de ? optie om een ​​volledige lijst met opdrachten te zien.

Aan de slag met het opzetten van hunks is net zo eenvoudig als:

git add -p 

Afrekenen uw laatste filiaal

Als een goede codeerburger, wanneer u iets tegenkomt dat snel moet worden opgeknapt of opgeschoond, moet u waarschijnlijk even de tijd nemen om het te wijzigen. Maar als u een zware feature-branch workflow gebruikt, dan wilt u die niet-gerelateerde fix niet in uw feature branch. Dit betekent dat u dit moet doen stash uw huidige wijzigingen, verander naar uw hoofdtak en maak daar de oplossing. Tussen takken stuiteren kan vervelend zijn, maar gelukkig is er een snelle snelkoppeling om over te schakelen naar je laatste filiaal. (via Zach Holman)

git uitchecken -

Deze syntaxis zou behoorlijk bekend moeten zijn voor * NIX-gebruikers. De CD opdracht heeft een vergelijkbare snelkoppeling (CD -) die naar de laatste map gaat waar u zich bevond. U hoeft nooit meer te onthouden wat u die kenmerktak noemde wanneer u terug moet schakelen; net git uitchecken -.


Laat zien welke vestigingen zijn samengevoegd (of niet)

Wanneer u met featuretakken werkt, kunt u snel zoveel maken dat de uitvoer van git branch - lijst. Af en toe wil je af van de takken die het tot meester hebben gemaakt. Maar je hebt waarschijnlijk een snelle pauze voordat je begint git branch -d , maar met de onderstaande opdrachten kunt u ze met een gerust hart verwijderen zonder erover na te denken. (via Zach Holman)

Als u wilt zien welke lokale vestigingen u hebt die zijn samengevoegd in de branch waar u zich momenteel bevindt, dan is alles wat u nodig heeft:

 git branch --merged

Het omgekeerde is ook beschikbaar. Laat zien welke takken niet zijn samengevoegd in de momenteel geselecteerde tak met:

git branch --no-merged

Mash dit met een paar eenvoudige UNIX-tools en je kunt snel alles verwijderen dat al is samengevoegd:

git branch --merged | xargs git branch -d

Pak een bestand van een andere tak zonder takken te wisselen

Laten we zeggen dat je aan het experimenteren bent met enkele refactorings, en je hebt een paar takken met verschillende veranderingen die je hebt aangebracht. Als u wijzigingen hebt in een bestand in een verre vertakking die u in uw huidige werkvestij wilt brengen, kunt u een willekeurig aantal stappen uitvoeren. Zonder de onderstaande tip zou je waarschijnlijk je huidige wijzigingen opslaan, van tak veranderen en de inhoud van het bestand pakken die je wilt veranderen, terugschakelen (met git uitchecken - natuurlijk) en maak je bewerkingen. Of u kunt gewoon dat bestand uitchecken dat het in uw huidige kantoor (via Zach Holman) zal samenvoegen:

git uitchecken  -- path / to / file.rb

Git Branches gesorteerd op Last Commit

Dus je hebt de rommelige branchelijst waar we het eerder over hadden; sommige van degenen die je hebt opgeruimd met de --samengevoegd vlag. Maar hoe zit het met al die andere takken? Hoe weet u welke nuttig of volledig verouderd zijn? De for-each-ref commando zal een lijst voor elke tak uitvoeren en de referentie-informatie voor de laatste commit weergeven. We kunnen de uitvoer aanpassen om wat nuttige informatie te bevatten, maar wat nog belangrijker is, we kunnen de lijst sorteren op datum. Deze opdracht geeft ons een lijst van takken met het laatste commit bericht en committer, gesorteerd in dalende datum volgorde. (via Rein Henrichs)

git for-each-ref --sort = -committerdate --format = '% (committerdate: short)% (refname: short) [% (committername)]'

Hoewel je elke keer dit commando zou kunnen typen, raad ik je aan om het een alias te maken en jezelf een aantal ernstige hoofdpijn te besparen.

git config --global alias.latest "for-each-ref --sort = -committerdate --format = '% (committerdate: short)% (refname: short) [% (committername)]'"

Mensen in glazen huizen mogen Git Blame niet gebruiken

Of ze zouden in ieder geval niet moeten gebruiken de schuld zonder een van de onderstaande opties-flags. Git de schuld is krachtig; het is eigenlijk alsof je wetenschap gebruikt om te bewijzen dat je gelijk hebt. Maar pas op, veel veranderingen zijn oppervlakkig en het vinden van de echte bron van de in-vraagcode kost wat meer jacht. Dingen zoals het verwijderen van witruimte, het verplaatsen van tekst naar nieuwe regels of zelfs het verplaatsen van tekst uit een ander bestand kunnen worden genegeerd om de oorspronkelijke auteur van de code veel gemakkelijker te bereiken.

Voordat je iemand de schuld geeft, moet je een van deze controleren:

git blame -w # negeert witte ruimte git blame -M # negeert bewegende tekst git blame -C # negeert bewegende tekst naar andere bestanden

Zoek een string in de gehele Git-geschiedenis (en verwijder deze)

Van tijd tot tijd moet je een regel code opsporen waarvan je weet dat je die hebt geschreven, maar die je gewoon niet kunt vinden. Het kan vastzitten in een verre tak, lang geleden verwijderd of verborgen op een eenvoudige site; maar hoe dan ook, je kunt elke string in je hele git-geschiedenis vinden door een paar commando's te maaien. Eerst gaan we een lijst van alle commits krijgen en dan grepen ze elk voor onze string.

git rev-list - alles | xargs git grep -F ''

U hebt waarschijnlijk een vriend die per abuis vertrouwelijke gegevens heeft doorgegeven aan een repo: toegangssleutels, wachtwoorden, het geheime marinararcept van uw grootmoeder. Het eerste wat ze moeten doen is hun wachtwoorden wijzigen en de toegang met die sleutels intrekken (en zich verontschuldigen bij je grootmoeder). Vervolgens wil je het aanstootgevende bestand opsporen en verwijderen uit de hele git-geschiedenis, wat veel eenvoudiger klinkt dan het in werkelijkheid is. Nadat dit proces is voltooid, zal iedereen die de schoongemaakte wijzigingen binnenhaalt ook de gevoelige gegevens verwijderen. Vorken van je repo die je stroomopwaartse wijzigingen niet samenvoegen, bevatten nog steeds de besmette bestanden (dus sla geen wachtwoorden over en toegangstekens intrekken).

Eerst zullen we de git-geschiedenis voor elke branch herschrijven, waarbij het bestand met de gevoelige gegevens wordt verwijderd.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch '--prune-empty --tag-name-filter cat - --all

Voeg het bestand toe aan .gitignore en commit om te updaten .gitignore.

echo  >> .gitignore git add .gitignore git commit -m "Voeg gevoelig toe  bestand naar gitignore "

Aangezien we de geschiedenis herschrijven, moet u de wijzigingen op uw afstandsbediening pushen.

git push origin master --force

De besmette bestanden bestaan ​​nog steeds in je lokale repo, dus je moet een paar opruimtaken uitvoeren om ze volledig te verwijderen.

rm -rf .git / refs / original / git reflil expire --expire = now --all git gc --prune = now git gc --aggressive --prune = now

De repo van je vriend moet vrij zijn van gevoelige gegevens en je zult de held zijn om hen te helpen met je professionele kennis. (via StackOverflow en GitHub)


Wijzigingen in een bijgehouden bestand negeren

Werken met de code van iemand anders in uw omgeving kan betekenen dat u een onbeperkt aantal configuratiewijzigingen moet aanbrengen om de toepassing te laten werken. Het is maar al te gemakkelijk om per ongeluk een verandering aan te brengen in die configs die exclusief voor uw omgeving waren bedoeld. Dus in plaats van altijd uit te kijken naar die bestanden en ze te laten blijven hangen in het "gewijzigde" fasegebied, kun je de git-index eenvoudig vertellen om wijzigingen in dat bestand te negeren. Je kunt dit enigszins beschouwen als een git genegeerd bestand dat bij de repo blijft. (via Arnaud Coomans)

git update-index --assume-unchanged 

Zero Out a Branch's History

Soms is helemaal opnieuw beginnen precies wat u moet doen, om een ​​aantal redenen. Misschien heb je een codebase geërfd waarvan je niet zeker weet dat deze veilig is om de bron te openen, misschien ga je gewoon iets geheel nieuws proberen, of misschien voeg je een filiaal toe dat een afzonderlijk doel dient dat je wilt onderhouden met de repo (zoals GitHub Pages). Voor dit geval is er een heel eenvoudige manier om een ​​nieuw filiaal in je repo aan te maken dat in essentie geen geschiedenis heeft. (via Nicola Paolucci)

git uitchecken --orphan 

Aliassen waar je niet zonder kunt

Stop met het verspillen van het typen van lange opdrachten en maak een paar nuttige aliassen.

Geen bespreking van git zou compleet zijn zonder te praten over verschillende aliassen die je letterlijk minuten per jaar zullen besparen in opgeslagen toetsaanslagen. Stop met het verspillen van het typen van lange opdrachten en maak een paar nuttige aliassen. Aliassen kunnen worden gemaakt door ze toe te voegen aan uw .gitconfig-bestand of door de opdrachtregel te gebruiken git config --global alias. "". Hieronder ziet u slechts een voorbeeld van een alias die u als springplank voor ideeën kunt gebruiken.

co: met een workflow met een kenmerktak, ga je regelmatig tussen filialen. Bespaar jezelf elke keer zes karakters.

co = afrekenen

ds: het is altijd de beste gewoonte om de wijzigingen die u gaat plegen opnieuw te bekijken voordat u de daadwerkelijke commit maakt. Hiermee kunt u typfouten, toevallige opname van gevoelige gegevens en groepscode in logische groepen vastleggen. Voer uw wijzigingen uit en gebruik vervolgens git ds om de diff van die veranderingen te zien.

ds = diff --staged

st: je zou goed bekend moeten zijn met de uitgebreide output van git status. Op een gegeven moment wilt u alle formaliteit overslaan en aan de slag gaan. Dit alias toont de korte vorm van status en bevat de details van de filiaal.

st = status -sb

wijzigen: ben je vergeten om een ​​bestand bij je laatste commit op te nemen, of had je misschien een tweak die je moest maken? Wijzig de gefaseerde wijzigingen in je laatste commit.

amenderen = commit - amend -C HEAD

ongedaan maken: Soms is het aanpassen van je laatste commit niet genoeg en moet je het in plaats daarvan ongedaan maken. Deze alias zal één commit een stap terug doen en de veranderingen van die commit geënsceneerd laten. Nu kunt u aanvullende wijzigingen aanbrengen of opnieuw een nieuw bericht gebruiken.

undo = reset --soft HEAD ^

ls: werken aan een codebase met een groep ontwikkelaars betekent proberen bij te houden waar mensen aan werken. Deze alias zal een git-log met één regel bieden, inclusief datum en naam van de committer.

ls = log --pretty = indeling: "% C (geel)% h% C (blauw)% ad% C (rood)% d% C (reset)% s% C (groen) [% cn]" - versieren --date = kort

sta op: dit alias is geweldig om te bekijken waar je gisteren aan hebt gewerkt voor elk type dagelijkse opschorting, of gewoon om je geheugen 's ochtends op te frissen.

standup = log - sinds '1 dag geleden' --online --author 

graph: een complexe git-geschiedenis kan moeilijk te beoordelen zijn in een rechte lijn. Als u de grafiekmarkering gebruikt, ziet u hoe en wanneer commits aan de huidige tak werden toegevoegd.

graph = log --graph --pretty = format ':% C (geel)% h% Cblue% d% Creset% s% C (wit)% an,% ar% Creset'

In Closing

Git kan zowel verbazingwekkend eenvoudig als verbluffend complex zijn. U kunt beginnen met de basis en uzelf in de loop van de tijd aan meer complexe grafische manipulatie werken. Het is niet nodig om alles te laten groeien voordat je het kunt gebruiken. Het commando dat het krachtigst zal zijn zoals je leert is man git--. Probeer het te gebruiken voordat u naar Google verwijst voor een antwoord.

Je kunt meer leren over hoe het bedrijf waar ik voor je werk, New Relic, git gebruikt op onze blog, of New Relic Pro gratis proberen. Bedankt voor het lezen! Laat het ons hieronder weten als u vragen heeft!