Wil je veilig aan open source meebouwen zonder het origineel te breken? Deze blog laat zien wat een fork is, wanneer je ervoor kiest (van vrij experimenteren tot een eigen variant), en hoe je ‘m strak beheert: upstream koppelen, featurebranches, PR’s, rebase/mergeconflicten oplossen en CI/CD goed inrichten. Je krijgt praktische tips voor security (tokens, workflows) en het respecteren van licenties, zodat samenwerken soepel en verantwoord blijft.

Wat is een fork in Git en Github
Een fork is jouw eigen kopie van een bestaande Git-repository op GitHub, onder je eigen account, met de volledige commitgeschiedenis. Met een fork werk je onafhankelijk van het origineel: je kunt vrij experimenteren, features bouwen of bugs fixen zonder risico voor de bron. Zodra je klaar bent, kun je je wijzigingen terug voorstellen aan het originele project via een pull request, terwijl de link met het “upstream” project intact blijft. Belangrijk om te weten: “fork” is vooral een platformconcept (zoals op GitHub); in pure Git bestaat er geen fork-commando. Je bereikt hetzelfde door te clonen en extra remotes toe te voegen. Een fork verschilt van een branch, want een branch leeft binnen dezelfde repository, terwijl een fork een volledig eigen repository is met eigen rechten en instellingen.
Het verschilt ook van alleen lokaal clonen: klonen maakt een kopie op je computer, forken maakt een kopie op GitHub die je zelf beheert en waar je naar kunt pushen. Je houdt je fork up-to-date door de upstream-remote te configureren en regelmatig te fetchen en te mergen of te rebasen. Forks zijn ideaal als je geen schrijfrechten hebt op het originele project, maar wel wilt bijdragen, of als je bewust een eigen variant wilt onderhouden met andere keuzes of een eigen releasecyclus.
[TIP] Tip: Fork, stel upstream in, fetch en rebase regelmatig voor schone bijdragen.

Wanneer kies je voor een fork
Deze vergelijking helpt je bepalen wanneer je in Git/GitHub beter voor een fork kiest dan voor werken op een branch binnen dezelfde repository, inclusief de belangrijkste afwegingen en risico’s.
| Situatie / doel | Kies voor fork | Alternatief | Waarom / kernoverweging |
|---|---|---|---|
| Geen schrijfrechten op bronrepo (open-source bijdrage) | Ja | Branch in bronrepo (niet mogelijk zonder rechten) | Fork maakt bijdragen via PR mogelijk zonder toegang tot de hoofdrepo; maintainer behoudt controle. |
| Experimenteren zonder risico voor de main-branch | Ja, vooral voor spikes/prototypes | Branch met draft PR in dezelfde repo | Fork isoleert werk, issues en releases; voorkomt ruis en onbedoelde impact op de hoofdrepo. |
| Langdurig eigen variant onderhouden (downstream) | Ja, met upstream sync | Plug-in/extensie, of periodieke patches i.p.v. long-lived branch | Autonomie in roadmap en releases; let op drift en mergeconflicten-regelmatig upstream pullen. |
| Kleine fix/feature binnen hetzelfde team (met rechten) | Nee | Branch in dezelfde repo | Snellere reviews, gedeelde CI/secrets en minder beheer-overhead dan een fork. |
| CI/CD vereist repo-secrets (bij PR’s) | Meestal nee | Branch in dezelfde repo of pull_request_target met zorg | Fork-PR’s hebben standaard geen toegang tot upstream secrets op GitHub; branch gebruikt gedeelde secrets en volledige pipelines. |
Kern: kies een fork voor bijdragen zonder rechten, risicoloos experimenteren en langdurige varianten; kies branches voor teamwerk met snelle integratie en wanneer CI-secrets nodig zijn. Houd bij forks rekening met upstream synchronisatie om divergeren te beperken.
Je kiest voor een fork zodra je wilt bijdragen aan een project waar je geen schrijfrechten op hebt, maar wel veranderingen wilt voorstellen via een pull request. Een fork is ook ideaal als je grootschalig wilt experimenteren met risicovolle of brekende wijzigingen zonder het origineel te verstoren, bijvoorbeeld bij een grote refactor, een nieuwe architectuur of een ingrijpende dependency-upgrade. Werk je met een team buiten de kernmaintainers, dan geeft een fork je eigen CI/CD-instellingen, issues en releasebeheer, zodat je in je eigen tempo kunt testen en releasen.
Soms wil je bewust een langdurig afwijkende variant onderhouden met eigen keuzes of patches die upstream nog niet accepteert; ook dan is een fork logischer dan een branch. Binnen één team met schrijfrechten op dezelfde repository is een feature branch vaak sneller, maar zodra je isolatie, eigen permissies of extra controle nodig hebt, biedt een fork meer zekerheid. Bovendien helpt een fork om gevoelige instellingen en secrets gescheiden te houden van het oorspronkelijke project, wat je security en governance ten goede komt.
Bijdragen en experimenteren zonder risico
Met een fork maak je jouw eigen kopie van een project, zodat je vrij kunt bouwen en testen zonder het origineel te raken. Je werkt in branches binnen je fork, voert je eigen CI-tests uit en probeert gerust grote refactors of nieuwe features uit. Gaat er iets mis, dan kun je je branch of zelfs je fork eenvoudig opruimen zonder gevolgen voor het bronproject.
Ben je tevreden, dan open je vanuit je fork een pull request naar het originele project en vraag je om review. Door een extra remote naar “upstream” (de bronrepo) toe te voegen, haal je updates binnen en houd je je werk actueel. Zo combineer je maximale speelruimte met gecontroleerde bijdragen en minimale risico’s voor de hoofdrepo.
Een eigen variant langdurig onderhouden
Kies je voor een blijvende fork, dan run je in feite je eigen distributie van het project. Je bepaalt je eigen roadmap en releases, maar je blijft het beste dicht bij upstream (de bron), zodat je beveiligingspatches en bugfixes snel kunt overnemen. Plan vaste sync-momenten, rebase of merge regelmatig en gebruik waar nodig cherry-pick (gericht een specifieke commit overnemen) om ruis te beperken. Documenteer afwijkingen, onderhoud een changelog en houd semantische versies aan zodat gebruikers weten wat verandert.
Automatiseer tests en builds met je eigen CI/CD en scan afhankelijkheden op kwetsbaarheden. Bewaak licentie-eisen en attributie, zeker bij hergebruik van code of assets. Reken op onderhoudskosten: hoe verder je afwijkt, hoe meer conflicten je oplost en hoe belangrijker duidelijke governance en code-eigenaren worden.
[TIP] Tip: Fork bij ontbrekende toegang, trage reviews of afwijkende productdoelen.

Zo maak en beheer je een fork stap voor stap
Volg deze korte workflow om een fork te maken, te synchroniseren met het bronproject en je wijzigingen netjes aan te bieden. Zo houd je controle over je eigen kopie en werk je soepel samen met upstream.
- Een repository forken en lokaal klonen: Klik op Fork in GitHub, kies je account of organisatie en clone je fork lokaal zodat origin naar jouw fork wijst. Controleer je remotes (bijv. met git remote -v) en werk vanaf een schone main.
- Upstream toevoegen, synchroniseren en conflicten oplossen: Voeg een extra remote toe naar het originele project (upstream), haal wijzigingen op (git fetch upstream) en werk je main bij via rebase of merge op upstream/main. Push je bijgewerkte main naar origin en herhaal dit periodiek om drift te voorkomen; los eventuele conflicten lokaal op, test met je CI en gebruik bij voorkeur branch protection en verplichte statuschecks in je fork.
- Wijzigingen voorstellen met een pull request (PR): Start elke wijziging op een nieuwe featurebranch vanaf een actuele main, commit klein en duidelijk, push de branch naar je fork en open een PR richting het upstream-project. Houd je branch up-to-date met upstream, reageer op reviews en zorg dat alle checks slagen; gebruik desgevraagd squash of rebase voor een nette geschiedenis.
Met deze routine blijft je fork actueel en blijven je PR’s klein en overzichtelijk. Dat versnelt reviews en voorkomt lastige conflicten.
Een repository forken en lokaal klonen
Je fork maak je op GitHub door op Fork te klikken en je eigen account of organisatie te kiezen. Daarna kopieer je de URL van je fork en clone je lokaal via HTTPS of, liever, via SSH als je een sleutel hebt ingesteld. Na het clonen wijst origin automatisch naar jouw fork, zodat pushen direct naar je eigen repo gaat. Controleer je remotes en zet desnoods de default branch op main als dat afwijkt.
Heb je grote projecten, dan kun je een shallow clone doen voor snelheid, en LFS gebruiken voor grote bestanden. Werk je op meerdere machines, zorg dan dat je Git-config (gebruikersnaam, e-mail) en je SSH-sleutels kloppen, zodat commits goed worden toegeschreven en je zonder gedoe kunt pushen.
Upstream toevoegen, synchroniseren en conflicten oplossen
Na het klonen van je fork voeg je de bronrepo toe als extra remote met de naam upstream, zodat je eenvoudig updates kunt binnenhalen. Controleer je remotes, voeg upstream toe met het juiste GitHub-pad en haal wijzigingen op met fetch. Werk vervolgens je main bij door te rebasen op of te mergen met upstream/main; zo houd je je geschiedenis schoon en voorkom je grote drifts. Begin nieuwe werkbranches altijd vanaf een bijgewerkte main en synchroniseer regelmatig om verrassingen te vermijden.
Krijg je een mergeconflict, open de bestanden met de conflictmarkeringen, kies per stuk of je jouw wijzigingen, die van upstream of een combinatie behoudt, los alles op en commit het resultaat. Test opnieuw, push je branch en gebruik eventueel force-with-lease na een rebase om je remote netjes bij te werken.
Wijzigingen voorstellen met een pull request (PR)
Je start met een schone branch in je fork, gebaseerd op een up-to-date main die gesynchroniseerd is met upstream. Push je branch en open een PR van jouw fork naar de juiste targetbranch van het originele project. Schrijf een duidelijke titel en beschrijving: wat is het probleem, wat heb je aangepast en waarom, plus eventuele risico’s. Verwijs naar issues met bijvoorbeeld “Fixes #123”, voeg tests, screenshots of logica toe als dat helpt.
Controleer of alle CI-checks groen zijn en vraag reviewers aan volgens de contributing guidelines en het PR-template. Krijg je feedback, push dan extra commits of verbeter je voorstel; houd je branch in sync door te rebasen op upstream/main en los conflicten op. Markeer je PR als draft als je nog werkt, en gebruik de merge-methode (squash, rebase of merge) die het project voorschrijft.
[TIP] Tip: Voeg upstream-remote toe en rebase regelmatig je main branch.

Best practices, veiligheid en licentie
Werk gestructureerd: begin elke wijziging in een aparte featurebranch, schrijf kleine, duidelijke commits en houd je fork continu in sync met upstream zodat je PR’s klein en reviewbaar blijven. Schrijf een heldere PR-beschrijving met context en testresultaten, en gebruik desnoods een draft om vroeg feedback te verzamelen. Beveiliging begint bij minimale rechten: gebruik tokens met zo weinig mogelijk scopes, commit nooit secrets, zet ze in een secretsmanager en voeg bestanden met gevoelige info toe aan je .gitignore. In GitHub Actions beperk je standaard permissies, draai onbetrouwbare code via het pull_request-event en wees terughoudend met pull_request_target, omdat die workflows met verhoogde rechten kan uitvoeren.
Schakel dependency-updates en scans in, zoals kwetsbaarheidsscans en secret-scanning, en overweeg CODEOWNERS, branch protection en verplichte statuschecks voor consistente kwaliteit. Voor licenties check je altijd de voorwaarden van het bronproject: bewaar copyright-headers, voeg de LICENSE en eventuele NOTICE toe in je fork en noem aanpassingen. Bij copyleftlicenties zoals GPL moet je bij distributie de bron beschikbaar maken, terwijl permissieve licenties zoals MIT en Apache 2.0 vooral attributie en behoud van licentietekst vragen. Respecteer ook merknamen en logo’s. Door zorgvuldig te werken, veilig te automatiseren en licenties serieus te nemen, bouw je duurzaam verder op een fork en blijft samenwerken soepel.
Branch- en commit-strategie voor overzichtelijke prs
Begin met korte, doelgerichte featurebranches en start altijd vanaf een up-to-date main die met upstream/main is gesynchroniseerd. Maak kleine, atomaire commits die elk één logische verandering bevatten, met duidelijke boodschappen in de gebiedende wijs of volgens Conventional Commits, zodat reviewers snel de intentie begrijpen. Houd je PR smal in scope en splits werk op als je meerdere onderwerpen aanraakt. Rebase je branch regelmatig op upstream/main om ruis te beperken en conflicten vroeg te vangen, en voorkom onnodige mergecommits.
Ruim tussentijdse “fix”-commits op met interactive rebase (squash/fixup) zodat de geschiedenis helder blijft. Laat linters en tests lokaal én in CI draaien voor stabiele, groene checks. Kies bij het mergen voor squash om de hoofdgeschiedenis compact te houden, of rebase-merge als de individuele commits inhoudelijke waarde hebben.
Beveiliging en CI/CD bij forks
Bij forks draait je CI/CD idealiter veilig en voorspelbaar. Workflows op pull_request vanuit een fork krijgen standaard een read-only token en geen secrets, waardoor je onbetrouwbare code kunt testen zonder risico. Moet je toch secrets gebruiken, doe dat alleen in je eigen fork of via een workflow_call naar een herbruikbare workflow in de baserepo die pas draait op vertrouwde codepaden. Wees voorzichtig met pull_request_target, want die draait met repo-rechten; voer nooit ongeteste code van de contributor daarin uit.
Pin acties op een commit-SHA, beperk permissies van de GITHUB_TOKEN en zet handmatige goedkeuring aan voor eerste-keer bijdragers. Activeer code-scanning, Dependabot en secret-scanning, en vereist groene statuschecks met branch protection. Gebruik waar mogelijk OIDC voor cloud-toegang en geef tokens minimale scopes.
Licenties respecteren en credits geven
Als je een fork onderhoudt, moet je de licentie van het bronproject ongewijzigd meenemen en zichtbaar houden. Plaats de LICENSE in je repo, behoud copyright-headers in bestanden en voeg een NOTICE toe als de licentie (bijvoorbeeld Apache-2.0) dat vraagt. Bij permissieve licenties zoals MIT en BSD volstaat meestal attributie en het opnemen van de licentietekst; bij copyleft (zoals GPL) moet je bij distributie de broncode en wijzigingen beschikbaar maken onder dezelfde voorwaarden.
Geef duidelijke credits in je README: link naar upstream, beschrijf afwijkingen en noem auteurs. Verwijder geen auteursnamen uit de commitgeschiedenis. Let op merknamen en logo’s: die vallen vaak onder aparte voorwaarden. Controleer ook licentiecompatibiliteit van dependencies voordat je binaries of images publiceert, zodat je veilig en transparant blijft werken.
Veelgestelde vragen over fork
Wat is het belangrijkste om te weten over fork?
Een fork is jouw eigen kopie van een GitHub-repository. Je kunt veilig experimenteren, bijdragen zonder schrijfrechten en langdurig een variant onderhouden. Werk in branches, synchroniseer met upstream, dien PR’s in, en respecteer licenties/credits.
Hoe begin je het beste met fork?
Fork de repository op GitHub, clone lokaal, voeg upstream toe: git remote add upstream <url>. Fetch en sync regelmatig, werk in featurebranches, commit klein, push naar je fork en open een pull request met tests.
Wat zijn veelgemaakte fouten bij fork?
Valkuilen: niet upstream synchroniseren (conflicten), werken op main i.p.v. featurebranches, te grote of samengeraapte PR’s, ontbrekende tests, gelekte secrets in CI, licentieregels negeren en geen credits geven, of onduidelijke commitberichten/geschiedenis.