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:
| Paraan | Command | Resulta ng history | Pinakamainam para sa |
|---|---|---|---|
| Merge | git merge upstream/main | Karagdagang merge commit sa diverged branches | Feature branches na may bukas na PR — walang binabago kahit kailan |
| Rebase | git rebase upstream/main | Na-replay ang mga commit mo sa ibabaw, linear na history | Pananatiling malinis ang main ng fork mo; diverged forks na gusto mong i-reset |
| GitHub UI | Sync branch button / PR merge | Same sa merge | Mabilis 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:
- Walang
upstreamremote —originlang ang ipinapakita nggit remote -v. Sintomas: bumabagsak anggit fetch upstreamna may'upstream' does not appear to be a git repository. Fix: step 1 sa itaas. - Nag-fetch ka pero hindi kailanman nag-merge — ina-update ng fetch ang
upstream/mainsa local repo mo pero walang ginagalaw na working branch. Sintomas: mukhang luma anggit logmatapos ang matagumpay na fetch. Fix:git merge upstream/main. - Diverged history — nag-commit ka sa
mainng fork mo, at gumalaw din ang upstream. Magrereklamo anggit pulltungkol 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 anggit stash listo mag-backup gamit ang branch muna; kung nangyari na ang bad reset, same ang recovery path sa git undo last commit: alam pa rin nggit reflogang lumang tip). - 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.
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