{"id":473,"date":"2023-05-24T16:48:03","date_gmt":"2023-05-24T14:48:03","guid":{"rendered":"https:\/\/jbsoft.nl\/site\/?p=473"},"modified":"2023-05-24T16:48:03","modified_gmt":"2023-05-24T14:48:03","slug":"using-git","status":"publish","type":"post","link":"https:\/\/jbsoft.nl\/site\/nl\/using-git\/","title":{"rendered":"Git gebruiken"},"content":{"rendered":"<p>Als ontwikkelaar werk ik mee aan meerdere projecten. In veel gevallen is het nodig om een fork van het stroomopwaartse project te maken en een pull-aanvraag toe te voegen. De eerste stappen (een fork maken) enz. zijn niet moeilijk, en in eerste instantie heb je een up-to-date kloon van de originele website waarop je kunt werken en pull-aanvragen kunt openen voor het stroomopwaartse project. De meeste van deze stappen kunnen worden uitgevoerd met behulp van de web-UI (bijv. bij gebruik van Github). Maar tijdens het werken aan een pull request is het vaak nodig om je gevorkte kloon te synchroniseren, bijvoorbeeld om een nieuwe branch te openen. Dan begint de ellende. Wat kan gebeuren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Je bent een nieuwe branch gestart, maar de hoofd branch liep niet synchroon<\/li>\n\n\n\n<li>U moet rebaseen en mogelijk is er een conflict<\/li>\n<\/ul>\n\n\n\n<p>Mensen beginnen met rebasen, maar halen vaak niet-gerelateerde commits binnen die andere problemen veroorzaken. In dit bericht wil ik enkele methoden delen die ik heb om met dergelijke gevallen om te gaan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Een nieuwe `branch` openen<\/h2>\n\n\n\n<p>Wanneer je een nieuwe pull request wilt openen wil je dat dit correct gebeurt. Ik neem hier aan dat je al een ontwikkelomgeving hebt opgezet met je gekloonde git-repository, klaar om commits te pushen.<\/p>\n\n\n\n<p>Om ervoor te zorgen dat uw fork gesynchroniseerd is, moet u alle upstream-updates ophalen. Dat kunnen we doen met:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch --all<\/code><\/pre>\n\n\n\n<p>of als het gewoon is <code>upstream<\/code>, we kunnen gebruiken<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch upstream<\/code><\/pre>\n\n\n\n<p>welke sneller is.<\/p>\n\n\n\n<p>De volgende stap is het uitchecken van de doelvertakking waartegen je de pull request wilt maken. Dit kan zijn <code>main<\/code>, <code>master<\/code> of de <code>dev<\/code>, maar soms kan dit zelfs anders zijn. In ons voorbeeld gebruiken we <code>main<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout main <\/code><\/pre>\n\n\n\n<p>Nu willen we resetten <code>main<\/code> naar dezelfde staat als <code>upstream\\main<\/code>, omdat dit de branch is waar we het pull-verzoek naartoe willen sturen. We moeten ervoor zorgen dat er geen niet-vastgelegde bestanden zijn, aangezien deze zullen worden verwijderd!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git reset --hard upstream\/main<\/code><\/pre>\n\n\n\n<p>Als we de <code>--hard<\/code> markeer dan zal git niet-vastgelegde bestanden maken voor alle wijzigingen tussen de oude en nieuwe staat. Dit kan handig zijn als we commits willen terugdraaien, maar niet bij het starten van een nieuwe branch.<\/p>\n\n\n\n<p>Vanaf hier kunnen we de lokale vestiging naar onze vork duwen met:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push<\/code><\/pre>\n\n\n\n<p>Nu zijn we op hetzelfde niveau als de doelvestiging en kunnen we een nieuwe vertakking openen die synchroon loopt met <code>upstream<\/code>. We kiezen een nieuwe branchenaam die de naam van ons pull-verzoek weerspiegelt, in dit voorbeeld zal ik gebruiken <code>test-pull-verzoek<\/code> als filiaalnaam.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b test-pull-request<\/code><\/pre>\n\n\n\n<p>Dit cre\u00ebert een nieuwe lokale branch, vanaf hier kun je beginnen met coderen en je commits toevoegen. Als je er klaar voor bent, kun je je branch naar je fork publiceren (ik gebruik <code>origin<\/code> als naam voor de gekloonde repository). Vanaf dat moment wordt elke nieuwe commit gepusht <code>origin<\/code> ook. Wanneer we onze nieuwe lokale branch publiceren, moeten we ook de stroomopwaartse branch instellen, zodat we later een pull-aanvraag kunnen openen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push --set-upstream origin test-pull-request<\/code><\/pre>\n\n\n\n<p>Wanneer alle commits zijn gedaan en we al onze commits hebben gepusht (<code>git push<\/code>), dan zijn we klaar om een pull request te openen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Open een nieuwe pull prequest<\/h2>\n\n\n\n<p>Wanneer u Github gebruikt, is het raadzaam om een pull-aanvraag te openen met behulp van de web-UI of met behulp van een plug-in <code>vscode<\/code> of andere ontwikkelomgeving. In de meeste gevallen is er een sjabloon die moet worden ingevuld. Zorg ervoor dat de juiste commits worden weergegeven en dat u de juiste doeltak hebt geselecteerd!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rebasen en oplossen van problemen met `mergen`<\/h2>\n\n\n\n<p>Soms moeten we `rebasen`. Dit kan gebeuren als de PR te oud is en we moeten synchroniseren met onze target branch. Persoonlijk zou ik de originele commits bovenop de rebased branch willen forceren in plaats van een merge-commit toe te voegen. Force-push maakt het gemakkelijker om de commits in het pull-verzoek bij te houden en vermijdt extra merge-commits. Om correct te kunnen rebasen, moeten we eerst de nieuwste updates ophalen. We kunnen hiervoor gebruiken:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch upstream<\/code><\/pre>\n\n\n\n<p>Nu zorgen we ervoor dat we bij het juiste filiaal zijn uitgecheckt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout test-pull-request<\/code><\/pre>\n\n\n\n<p>Om te rebaseen met onze stroomopwaartse doeltak starten we een rebase-opdracht.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase upstream\/dev<\/code><\/pre>\n\n\n\n<p>Als je de commits wilt selecteren die moeten worden opgenomen (bijvoorbeeld wanneer je sommige commits wilt terugdraaien), zou je moeten overwegen om de <code>-i<\/code> vlag om interactief rebasen te starten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase -i upstream\/dev<\/code><\/pre>\n\n\n\n<p>Voor elke commit zal git proberen te rebaseen, als dit niet lukt, dan moet je je bestanden corrigeren, opslaan en stagen om git te vertellen welke wijzigingen moeten worden aangebracht. Na staging kun je doorgaan met rebasen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase --continue<\/code><\/pre>\n\n\n\n<p>Zorg ervoor dat je alleen wijzigingen aanbrengt in commits die direct gerelateerd zijn aan de samenvoegconflicten en die de gewenste wijzigingen voor die bepaalde commit weergeven. Herhaal dit voor de andere commits (indien van toepassing) totdat de rebase met succes is voltooid.<\/p>\n\n\n\n<p>Als alles een puinhoop wordt, is er een redding door het `merge` commando af te breken.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase --abort<\/code><\/pre>\n\n\n\n<p>De volgende stap is dat we niet alleen commits nu pullen en pushen, maar alleen rebased commits forceren. Dit kan onlogisch zijn, maar we willen ervoor zorgen dat we de exacte lokale situatie naar onze hand zetten <code>origin<\/code> tak.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push --force<\/code><\/pre>\n\n\n\n<p>Nu zou onze branch opnieuw moeten worden gebaseerd en in het pull-verzoek zouden we alleen de commits van onze PR moeten zien, of de geselecteerde commits uit het bestand (bij gebruik van de <code>-i<\/code> keuze).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nieuwe schone commits maken van eerder werk<\/h2>\n\n\n\n<p>Als je een grotere PR hebt met meerdere bestanden en je bestaande commits wilt vervangen of ongedaan wilt maken zonder je werk te verliezen, kun je dit gebruiken <code>git reset<\/code>.<\/p>\n\n\n\n<p>Met <code>git log<\/code> we kunnen de commits die we hebben gemaakt bovenop onze branch laten zien. Om deze commits te vervangen moeten we rebaseen naar de commit van waar we opnieuw willen beginnen.<\/p>\n\n\n\n<p>Stel dat we twee commits hebben die we over willen doen. Laat ze zien met <code>git log<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>commit 6090d321e3926ad9c5ffdd026f7c2fb046cdbbf2 (HEAD -&gt; test2) Auteur: jij Datum: wo 24 mei 14:19:24 2023 +0000 commit 2 commit a0ad22921fb8f5797aeb4e414cf3403b80027a3d Auteur: jij Datum: wo 24 mei 14:18:03 2023 +0000 commit 1 commit abf08f66a4c7e01955213c228542884951d45a11 (upstream\/dev, origin\/test2, origin\/dev, origin\/HEAD, dev) Auteur: gebruiker Datum: wo 24 mei 01:38:16 2023 -0500 Update upstream<\/code><\/pre>\n\n\n\n<p>Ervan uitgaande dat we geen niet-vastgelegde bestanden hebben, kunnen we rebaseen om vast te leggen <code>abf08f66a4c7e01955213c228542884951d45a11 <\/code>(upstream\/dev, origin\/test2, origin\/dev, origin\/HEAD, dev).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git reset abf08f66a4c7e01955213c228542884951d45a11<\/code><\/pre>\n\n\n\n<p>Nu zul je zien dat de wijzigingen van de laatste 2 commits nu unstaged bestanden zijn. Je kunt nu de wijzigingen voor je nieuwe commit stagen, of, als je wilt, dit in meer commits doen totdat alle wijzigingen zijn gestaged en vastgelegd. Nu, om de oude commits te vervangen door de nieuwe, kunnen we ze forceren om ze naar onze te pushen <code>origin<\/code> tak.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push --force<\/code><\/pre>\n\n\n\n<p>Nu zijn je commits vervangen door de nieuwe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tijdelijk niet opgeslagen werk opslaan<\/h2>\n\n\n\n<p>Soms moet je tussen branches wisselen, maar heeft u niet-vastgelegde bestanden. Als pre-commit wordt gebruikt, is het misschien niet mogelijk om te committen. In plaats daarvan kunt u uw wijzigingen op de stapel opslaan. U kunt uw wijzigingen later terugkrijgen door ze uit de stapel te halen. Dit werkt ook als u niet-vastgelegde wijzigingen wilt toepassen op een andere branch.<\/p>\n\n\n\n<p>Om uw niet-toegewijde werk op te bergen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git stash<\/code><\/pre>\n\n\n\n<p>Om de wijzigingen terug te laten komen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git stash pop<\/code><\/pre>\n\n\n\n<p>Er is veel meer dat je kunt doen met git stash, maar ik zal het hier kort houden.<\/p>\n\n\n\n<p>Voor meer git-commando's <a href=\"https:\/\/git-scm.com\/docs\" data-type=\"URL\" data-id=\"https:\/\/git-scm.com\/docs\" target=\"_blank\" rel=\"noreferrer noopener\">gebruik je de online documentatie<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Als ontwikkelaar werk ik mee aan meerdere projecten. In veel gevallen is het nodig om een fork van het stroomopwaartse project te maken en een pull-aanvraag toe te voegen. De eerste stappen (een fork maken) etc zijn niet moeilijk, en in eerste instantie heb je een up-to-date kloon van de originele website waarop \u2026 <a href=\"https:\/\/jbsoft.nl\/site\/nl\/using-git\/\" class=\"more-link\">Lees verder <span class=\"screen-reader-text\">\u201cGit gebruiken\u201d<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28],"tags":[],"class_list":["post-473","post","type-post","status-publish","format-standard","hentry","category-github"],"_links":{"self":[{"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/posts\/473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/comments?post=473"}],"version-history":[{"count":2,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/posts\/473\/revisions"}],"predecessor-version":[{"id":475,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/posts\/473\/revisions\/475"}],"wp:attachment":[{"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/media?parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/categories?post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jbsoft.nl\/site\/nl\/wp-json\/wp\/v2\/tags?post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}