Bumalik sa blog

Git Sync Fork With Upstream: 3 Ligtas na Paraan

Setyembre 6, 2026

TL;DR: i-run ang git fetch upstream && git merge upstream/main && git push origin main at nahabol na ng fork mo. Yan ang buong “git sync fork with upstream” workflow sa isang linya — hakuin ang mga changes mula sa project na finork mo, tapos i-push sa kopya mo. Kung linear history ang gusto mo, palitan mo ng git rebase upstream/main ang merge at mag-force-push. At kung hindi mo pa kailanman na-wire ang upstream remote, simulan mo sa step 1 sa ibaba, dahil iyon ang number one na dahilan kung bakit “hindi nagse-sync” ang isang fork. Ang lahat ng iba — rebasing, GitHub sync button, diverged branches na ayaw ma-push — detalye lang sa ibabaw ng tatlong commands na iyan.

Ano ang ibig sabihin ng pag-sync ng fork sa upstream?

Ang fork ay kopya mo ng repository ng iba sa GitHub. Ang orihinal ang upstream; ang kopya mo ang origin. Hindi nag-a-update ang mga sarili ng GitHub fork — kapag nag-merge ang maintainers ng pull request, nananatiling kahapon ang code ng kopya mo. Ang pag-sync ng fork ay ang paghakot ng mga bagong commit ng upstream papunta sa fork mo para tumugma — o kahit man lang maglaman — ang branch mo sa kasalukuyang estado ng project.

Dalawang dahilan bakit mahalaga ito. Una, mga contribution: bawat pull request na bubuksan mo mula sa stale na fork ay may dala-dalang extra noise, at papagagan ka ng maintainers na i-update muna bago ang merge. Pangalawa, self-hosting o pag-aaral: kung tumatakbo ang isang fork sa production o binabasa mo lang ang code, ang fork na isang buwang gulang ay isang buwan ng bug fixes na wala ka.

Paano ko i-sync ang fork sa upstream mula sa command line?

Tatlong hakbang: ideklara ang upstream nang isang beses, mag-fetch mula dito, tapos merge at push. Permanente ang wiring — steps 2 at 3 na lang ang itatype mo next time.

Step 1 — idagdag ang upstream remote (isang beses kada clone).

# inside your local clone of the fork
git remote add upstream https://github.com/ORIGINAL_OWNER/REPO.git
git remote -v   # confirm: origin -> your fork, upstream -> the original

Hanapin ang tamang URL sa page ng orihinal na repo: ang berdeng Code button. Karaniwang pagkakamali: parehong remote nakaturo sa fork mo — tapos ang “sync” ay tahimik na walang ginagawa, dahil kumukuha ka mula sa kopyang kasing-luma lang nito.

Step 2 — i-fetch at i-merge ang upstream branch.

git checkout main
git fetch upstream
git merge upstream/main
git push origin main

Yan ang standard na sagot sa “git sync fork with upstream command line”. Normal na resulta ang fast-forward — walang bago ang main ng fork mo, kaya dumadausgos itong umusog papunta sa upstream/main at walang ginagawang merge commit.

Step 3 — ulitin kung kailan mo gusto. Walang dapat matandaan bukod sa git fetch upstream && git merge upstream/main && git push origin main. Para makita kung gaano ka naiwan sa likod bago ang merge, i-run ang git rev-list --count main..upstream/main pagkatapos ng fetch.

Rebase ba o merge kapag nagse-sync ng fork?

Parehong papasok ang same code sa fork mo; nagkakaiba sila sa history na maiiwan. Pumili ng isang policy kada repo at manatili ka roon:

ParaanCommandResulta ng historyPinakamainam para sa
Mergegit merge upstream/mainKaragdagang merge commit sa diverged branchesFeature branches na may bukas na PR — walang binabago kahit kailan
Rebasegit rebase upstream/mainNa-replay ang mga commit mo sa ibabaw, linear na historyPananatiling malinis ang main ng fork mo; diverged forks na gusto mong i-reset
GitHub UISync branch button / PR mergeSame sa mergeMabilis na paghabol nang walang buksan na clone

Ang rebase variant ng sync:

git fetch upstream
git rebase upstream/main
git push --force-with-lease origin main

Kailangan ang force push dahil nagre-rewrite ang rebasing ng mga commit ID — hindi na nagmula sa local branch mo ang remote branch ng fork mo. Laging piliin ang --force-with-lease kaysa --force: tumatanggi itong i-overwrite ang remote kung may nag-push (o isa pang machine mo) sa pagitan, kaya ligtas na by default ang delikadong command.

Isang rule na worth i-tattoo sa wrist mo: huwag kailanman mag-rebase ng branch na may bukas na pull request maliban kung alam mo ang ginagawa mo — nagpapalit ang rebasing ng mga commit ID, na pwedeng maka-detach ng bukas na PR mula sa mga commit nito. I-sync ang main gamit ang merge (o i-rebase ito bago magsimula ng bagong trabaho), at ilayo ang mga PR branch.

Bakit hindi nagse-sync ang fork ko sa upstream?

Apat na karaniwang suspek, sa ayos ng paglitaw nila sa totoong terminals:

  1. Walang upstream remoteorigin lang ang ipinapakita ng git remote -v. Sintomas: bumabagsak ang git fetch upstream na may 'upstream' does not appear to be a git repository. Fix: step 1 sa itaas.
  2. Nag-fetch ka pero hindi kailanman nag-merge — ina-update ng fetch ang upstream/main sa local repo mo pero walang ginagalaw na working branch. Sintomas: mukhang luma ang git log matapos ang matagumpay na fetch. Fix: git merge upstream/main.
  3. Diverged history — nag-commit ka sa main ng fork mo, at gumalaw din ang upstream. Magrereklamo ang git pull tungkol sa unrelated histories o magfo-force ng merge. Fix, kung mananalo ang upstream: git reset --hard upstream/main (itinatapon ang mga local main-only commits mo — tingnan ang git stash list o mag-backup gamit ang branch muna; kung nangyari na ang bad reset, same ang recovery path sa git undo last commit: alam pa rin ng git reflog ang lumang tip).
  4. Tinanggihan ang push bilang non-fast-forward pagkatapos ng rebase — nag-rebase ka pero normal ang push mo. Fix: git push --force-with-lease origin main.

Ikalima, bihira: pinalitan ng pangalan o binura ang upstream repo, kaya pati ang URL ng step 1 ay 404. Nagre-redirect ang GitHub ng mga repo na pinalitan ng pangalan, kaya ang matinding kabiguan karaniwang ibig sabihin ay binura o ginawang private — walang pwedeng pag-synchronize-an.

Pwede bang i-sync ang fork mula sa GitHub website?

Oo. Sa page ng fork mo, may Sync fork button ang branch dropdown tuwing naiwan sa likod ang branch mo; isang click, pasok ang upstream. Sa ibaba ng fold, gumagana rin ang same bilang pull request: bumukas ka ng PR mula sa upstream/main papunta sa main ng fork mo at i-merge.

Ipinapaliwanag ng mga limit ng button kailan bumaling sa CLI: fast-forward o merge lang ang ginagawa nito — hindi ito magre-rebase, at tumatanggi ito outright kapag diverged ang mga branches, sinasabihan ka pang itapon ang mga commit o gumamit ng command line. Default branch lang din ang sine-sync nito. Para sa lahat ng lampas sa simpleng paghabol, ang tatlong commands sa itaas ang tool.

Gaano kadalas dapat mag-sync ng fork?

Bago ang bawat bagong piraso ng trabaho ang tapat na sagot: mag-branch ka mula sa sariwang main, at walang PR na magsisimula sa “batay ito sa bersyon mula tatlong linggo ang nakalipas”. Para sa mga forks na aktibo kang inaambag-an, isang araw o per-session na sync ng main ay ilang segundo lang. Para sa fork na binabasa mo lang o dine-deploy, mag-sync kapag may inilabas ang upstream na gusto mo — mag-subscribe sa releases feed ng orihinal na repo at mag-sync sa release. Murang-mura ang sync dahil routine lang ito; ang fork na anim na buwang naiwan sa likod ay kadalasang nangangailangan ng surgery kaysa merge, kaya ganiyon nagiging hapon ang “sync my fork”.

Cheat sheet

# one-time setup
git remote add upstream https://github.com/ORIGINAL_OWNER/REPO.git

# routine sync (merge policy)
git fetch upstream && git merge upstream/main && git push origin main

# routine sync (rebase policy, linear history)
git fetch upstream && git rebase upstream/main && git push --force-with-lease origin main

# how far behind am I?
git fetch upstream && git rev-list --count main..upstream/main

# diverged beyond repair — make main identical to upstream (destructive)
git fetch upstream && git reset --hard upstream/main && git push --force-with-lease origin main

Panatilihing nasa muscle memory mo ang routine two-liner at ang diverged fork ay mananatiling curiosidad na binabasa mo, hindi problemang inaayos mo. Kung umaabot din sa mga server ang git housekeeping mo, saklaw ng journalctl cheat sheet ang kabilang kalahati ng pananatiling nababasa ang history ng isang machine.

FAQ

Paano ko i-sync ang fork ko sa upstream nito?

git fetch upstream, tapos mag-rebase o mag-merge ng upstream/main papunta sa branch mo at mag-push. Hinarap ng Sync fork button ng GitHub ang mga plain fast-forward.

Merge ba o rebase ang gagamitin sa upstream changes?

Pinapanatili ng rebase ang linear at review-friendly na PR history; mas ligtas ang merge sa shared branches. Huwag kailanman mag-rebase ng branch na pinagbubuhatan ng iba.

Bakit naiwan pa rin sa likod ang fork ko pagkatapos mag-sync?

Mga branches lang ang ginagalaw ng sync, hindi tags o releases. Mag-fetch gamit ang --tags --prune at ikumpara ang branch heads, hindi ang GitHub banner.

— mrsaynothing

— mrsaynothing

Mga field note sa AI, Linux at self-hosting.

Pag-usapan ang post na ito sa dev.to dev.to ↗

Ang susunod na how-to sa email

Isang email kada post. Ayusin, tuloy sa susunod.

self-hosted · walang third parties · one-click unsubscribe

ano ito?

ss vs netstat: Aling Linux Port Command ang Gagamitin

Nag-e-enjoy ka ba sa mga sulat na ito? Ito ang tinatayo ko para sa trabaho. i-hire ako