Gabay

Git repository: paano gumawa gamit ang git init at ikabit ang remote

Na-update: · Skillaria.Top

Ang git repository ay folder ng project kasama ang nakatagong folder na .git, kung saan iniimbak ng Git ang buong history, branch, at setting. Ginagawa ito gamit ang git init sa folder ng project, o kinukuha nang buo gamit ang git clone. Ang remote repository ay ikinakabit gamit ang git remote add origin address.

Ang git repository ay project na sinusubaybayan ng Git. Sa pisikal na aspeto, ito ay ordinaryong folder na may mga file ninyo, kasama ang nakatagong folder na .git, kung saan nakaimbak ang buong history: mga commit, branch, tag, at setting. Burahin ang .git, at matitira ang mga file na walang anumang bersyon sa nakaraan.

Ano ang bumubuo sa repository

Kapag gumagamit ng Git, makabubuting tandaan ang tatlong lugar na nilalakbayan ng mga pagbabago:

  • working directory: ang mga file na nakikita at ine-edit ninyo;
  • index (staging area): ang draft ng susunod na commit, kung saan napupunta ang mga pagbabago sa pamamagitan ng git add;
  • history: ang database ng mga commit sa loob ng .git, kung saan napupunta ang mga pagbabago sa pamamagitan ng git commit.

Mahigpit na pagsasalita, ang repository mismo ay ang nilalaman ng .git. Ang working directory ay isang "nailabas" na bersyon ng project na kinukuha ng Git mula sa history.

Paano gumawa ng git repository gamit ang git init

Pumunta sa folder ng project at patakbuhin ang isang command:

cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/

Puwedeng gumawa ng repository sa walang laman na folder, o sa folder na may mga file na. Sa huling kaso, walang mawawala: ang mga umiiral na file ay magiging untracked hanggang idagdag ninyo ang mga ito gamit ang git add.

Mga kapaki-pakinabang na variant ng command:

# Gumawa ng folder at repository dito nang sabay
git init my-app

# Itakda ang pangalan ng unang branch (kung hindi, master o ang halagang nasa settings)
git init -b main

# Gawing default na branch ang main sa lahat ng bagong repository
git config --global init.defaultBranch main

Unang commit

Walang saysay ang repository na walang commit. Karaniwang ganito ang ginagawa pagkatapos ng git init:

git config --global user.name "Juan Dela Cruz"
git config --global user.email "juan@example.com"

git status
git add .
git commit -m "Unang istruktura ng project"

Isang beses lang itakda ang pangalan at email sa computer; isinusulat ang mga ito sa bawat commit. Kung wala ang mga ito, tatanggi ang Git na mag-commit at hihingi ng pagpapakilala.

Idagdag agad ang .gitignore

Bago ang unang git add ., gumawa ng file na .gitignore na naglilista ng mga bagay na hindi dapat mapunta sa repository: dependencies, build, secret, at mga file ng IDE.

node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/

Kung nakapasok na sa commit ang file, hindi ito tatanggalin ng .gitignore. Kailangan itong itigil sa pagtrack habang nananatili sa disk: git rm --cached .env, tapos mag-commit.

Ano ang nasa loob ng folder na .git

Hindi kailangang pumasok dito sa karaniwang trabaho, pero nakakaalis ng maraming tanong ang pag-unawa sa istruktura:

ElementoAno ang iniimbak
objects/Mga naka-compress na object: nilalaman ng file (blob), istruktura ng folder (tree), mga commit
refs/heads/Mga branch: mga file na may hash ng huling commit
refs/tags/Mga tag
HEADPointer sa kasalukuyang branch, halimbawa ref: refs/heads/main
configMga setting ng repository na ito, kasama ang listahan ng remote
indexEstado ng staging area
hooks/Mga script na tumatakbo sa mga pangyayari (pre-commit, pre-push)

Mula dito, mahalagang konklusyon: ang branch sa Git ay maliit na file na may iisang hash. Kaya agad at libre ang paggawa ng branch.

Paano malaman kung repository ang folder

git status
# o mas tiyak
git rev-parse --is-inside-work-tree

Kapag wala sa repository, makakakuha kayo ng fatal: not a git repository (or any of the parent directories): .git. Pansinin ang "parent directories": naghahanap ang Git ng .git paakyat sa mga folder. Kung nagkataong nagpatakbo kayo ng git init sa home directory, magiging repository ang buong folder na iyon. Burahin ang ganoong .git.

Lokal at remote na repository

Ang repository na ginawa gamit ang git init ay umiiral lang sa computer ninyo. Para makapagbahagi ng code at magkaroon ng backup, ikinakabit dito ang remote repository (remote): isang kopya sa server, sa GitHub, GitLab, Bitbucket, o sa sarili ninyong Git server.

Ang remote repository ay hindi "pangunahin" para sa Git: bawat kopya ay ganap at may buong history. Nagiging sentral lang ito dahil sa kasunduan ng team.

git remote: pagkakabit ng remote repository

Ang remote ay maikling pangalan para sa address ng server. Ang karaniwang pangalan ayon sa kasunduan ay origin.

# Magdagdag ng remote
git remote add origin git@github.com:username/my-app.git

# Tingnan ang listahan kasama ang mga address
git remote -v
origin  git@github.com:username/my-app.git (fetch)
origin  git@github.com:username/my-app.git (push)

Pagkatapos, ipadala ang branch at ikabit ito sa remote:

git push -u origin main

Mga pangunahing command ng git remote

CommandAno ang ginagawa
git remote -vListahan ng remote na may mga address
git remote add <pangalan> <url>Ikabit ang bagong remote repository
git remote set-url origin <url>Palitan ang address, halimbawa mula HTTPS papuntang SSH
git remote rename origin oldPalitan ang pangalan ng remote
git remote remove oldAlisin ang remote (hindi nagagalaw ang server mismo)
git remote show originMga detalye: mga branch, tracking, kung ano ang nahuhuli

Mga format ng address

  • https://github.com/user/repo.git: HTTPS, gumagana kahit saan, kailangan ng token para sa pagsulat;
  • git@github.com:user/repo.git: SSH, kailangan ng key, pagkatapos ng setup, hindi na hihingi ng password;
  • /srv/git/repo.git o file:///srv/git/repo.git: lokal na path, maginhawa para sa eksperimento.

Karaniwang mga error

"error: remote origin already exists". May remote na ganoon nang pangalan. Kung gusto ninyong palitan ang address, gamitin ang git remote set-url origin <url>, hindi ang paulit-ulit na add.

"failed to push some refs" / "Updates were rejected". May commit sa server na wala sa inyo, madalas na README na nagawa noong ginawa ang repository sa website. Patakbuhin ang git pull --rebase origin main at ulitin ang push. Kung ganap na hiwalay ang history, sasabihin ng Git ang "refusing to merge unrelated histories", at kailangan ang --allow-unrelated-histories para sa git pull. Mas simple kung walang laman ang repository na ginawa sa website.

"src refspec main does not match any". Sinusubukan ninyong ipadala ang branch na wala pa: alinman ay walang commit pa, o master ang pangalan ng branch. Tingnan ang git branch.

Sariling Git server: bare repository

Hindi kailangan ang GitHub. Maaaring maging remote ang anumang makina kung saan may SSH access kayo. Para dito, gumagawa sa server ng "hubad" (bare) na repository: walang working directory, ang nilalaman lang ng .git:

# Sa server
ssh user@server
git init --bare /srv/git/my-app.git

# Sa inyong computer
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main

Para makapagtrabaho ang tatlong tao sa ganitong server, sapat nang bigyan ng SSH access sa folder ng repository ang mga katrabaho at magkaroon ng shared group na may write permission. Pero para sa paghahati ng karapatan ayon sa branch at project, hindi na sapat ito, at kailangan na ng buong Git hosting.

Hindi maaaring "pasukin at ayusin ang file" sa bare repository: para lang ito sa palitan sa pamamagitan ng push at fetch. Ganito rin ang estruktura ng mga repository sa anumang Git hosting. Kung kailangan ng web interface, review, at task, mag-install ng self-hosted na solusyon gaya ng GitLab, Gitea, o Forgejo.

Tracking branch: paano nakikita ng lokal na repository ang server

Pagkatapos ikabit ang remote at ang unang git fetch o git push, lilitaw sa repository ang mga remote branch gaya ng origin/main. Hindi ito mga branch sa server; ang mga ito ay lokal na "larawan" ng nakita ninyo sa server noong huling pag-sync. Ina-update lang ang mga ito sa fetch, pull, at push.

Dito nagkakaiba ang tatlong command ng palitan:

CommandAno ang binabago
git fetchIna-update ang origin/*; hindi ginagalaw ang mga branch at file ninyo
git pullfetch + pagsasama ng origin/main sa kasalukuyang branch
git pushIpinapadala ang mga commit ninyo at ina-update ang branch sa server

Para malaman kung gaano kalayo ang nauna o nahuli ng branch ninyo:

git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]

Ibig sabihin nito: may dalawang commit kayo na wala sa server, at may isang commit sa server na wala sa inyo. Bago mag-push, kunin muna ang commit na iyon.

Ang koneksyon ng lokal na branch sa remote branch (upstream) ay itinatakda ng flag na -u sa unang push. Kung nakalimutan, puwede itong itakda nang hiwalay: git branch --set-upstream-to=origin/main. Para makita ang lahat ng koneksyon, gamitin ang git branch -vv.

Maraming repository: monorepo o isa bawat project

Karaniwang tanong ng baguhan: ilang Git repository ang dapat gawin. Simpleng tuntunin: isang repository para sa bawat yunit na independiyenteng binubuo at inilalabas. Ang mga pag-aaral na project, personal na project, at hiwalay na serbisyo ay magkakahiwalay na repository. Huwag gumawa ng iisang repository para sa buong folder na "Mga Project Ko": magkakahalo ang history, at mahirap nang ilathala ang isang project lang sa portfolio.

Minsan, pinapanatili ng malalaking kumpanya ang lahat ng code sa iisang monorepo para sa mga sabay-sabay na pagbabago at iisang build, pero ito ay sadyang desisyon sa arkitektura na may sariling mga kasangkapan. Para sa baguhan, magsimula sa tuntuning "isang project, isang repository", at huwag ilagay ang isang repository sa loob ng isa pa nang walang submodule.

git init o git clone

SitwasyonCommand
Bagong project mula sa simulagit init
May folder ng code na walang version controlgit init sa folder na iyon
Nasa GitHub o server na ang projectgit clone <url>
Kailangan ng sentral na repository sa sariling servergit init --bare

Pagkatapos ng git clone, nakaset na ang remote na origin, kaya hindi na ito kailangang idagdag nang manwal.

Hakbang-hakbang: mula sa folder hanggang sa repository sa GitHub

  1. Gumawa ng folder ng project at patakbuhin ang git init -b main.
  2. Idagdag ang .gitignore at README.
  3. Gumawa ng unang commit: git add . at git commit -m "Initial commit".
  4. Gumawa sa GitHub ng walang lamang repository: walang README, lisensya, o .gitignore.
  5. Ikabit ito: git remote add origin <address>.
  6. Ipadala ang code: git push -u origin main.
  7. Pagkatapos, magtrabaho sa siklo: mga edit → git add → git commit → git push.

Buod

Ang git repository ay ang inyong project kasama ang folder na .git na may buong history. Ginagawa ito gamit ang git init, at ang koneksyon sa server ay itinatakda gamit ang git remote add origin at ang unang git push -u. Ang remote ay puwedeng GitHub, GitLab, o sarili ninyong Git server na may bare repository. Ang paggawa ng unang repository, ang index, at ang pagkakabit ng remote ay itinuturo nang praktikal sa kursong Git namin.

Mga madalas itanong

Paano tanggalin ang git repository pero panatilihin ang mga file?

Burahin ang nakatagong folder na .git sa ugat ng project: rm -rf .git sa Linux at macOS. Mananatili ang mga file, pero mawawala ang buong history ng mga bersyon.

Puwede bang patakbuhin ang git init sa folder na may repository na?

Oo, ligtas ito: sasabihin ng Git na "Reinitialized existing Git repository" at hindi nito gagalawin ang history. Dinadagdagan lang nito ang mga kulang na service file.

Ilang remote ang puwedeng ikabit sa iisang repository?

Kahit ilan. Halimbawa, ang origin para sa sarili ninyong fork, at ang upstream para sa orihinal na project; ganito kadalasang nagtatrabaho sa open source.

Saan nakalagay ang mga setting ng partikular na repository?

Sa file na .git/config. Ang pandaigdigang setting ng user ay nasa ~/.gitconfig, at itinatakda gamit ang git config --global.

Ano ang pagkakaiba ng bare repository sa karaniwan?

Walang working directory na may mga file ang bare repository, kundi ang mga serbisyong data lang ng Git. Ginagamit ito bilang sentral na repository sa server na pinagpupusuhan ng push.

Pag-aralan ito sa video

Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Git с нуля до уверенного разработчика”.

Pumunta sa kurso