Linux操作Git遠(yuǎn)程倉(cāng)庫(kù)與本地倉(cāng)庫(kù)同步的教程
創(chuàng)建本地倉(cāng)庫(kù)并同步到遠(yuǎn)程
git是非常強(qiáng)大的版本管理工具。接下來(lái)的時(shí)間里,我就和大家絮叨絮叨git的入門:如何在本地創(chuàng)建一個(gè)git倉(cāng)庫(kù),并把自己的本地代碼同步到遠(yuǎn)程。此教程是在mac上操作的,如果您的系統(tǒng)是Linux,那么操作方法相同;如果您的系統(tǒng)是windows,那么,只需要把git的bash窗口調(diào)出來(lái),以后的過(guò)程也都與Linux相同。
一、首先,您需要安裝git,此步就忽略了,自行安裝即可。
二、假設(shè)你目前還沒(méi)有創(chuàng)建一個(gè)工作目錄,那么,先創(chuàng)建一個(gè)目錄吧,就叫StudyGit。
三、現(xiàn)在的StudyGit目錄還只是一個(gè)本地目錄,和git沒(méi)有任何關(guān)聯(lián),那么,我們?cè)趺礃硬拍馨堰@個(gè)目錄和git關(guān)聯(lián)起來(lái)呢?只需要進(jìn)入StudyGit目錄,運(yùn)行如下命令:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git init
Initialized empty Git repository in /Users/yanyaozhen/Coding/Practice/StudyGit/.git/
提示已經(jīng)說(shuō)明我們初始化了一個(gè)空的本地git倉(cāng)庫(kù)。如果你查看StudyGit下的所有文件時(shí),會(huì)發(fā)現(xiàn)一個(gè).git 的隱藏文件,這個(gè)文件非常重要,版本的控制就靠它了。同時(shí),如果你要部署應(yīng)用程序到生產(chǎn)環(huán)境時(shí),切記不要把該目錄部署到服務(wù)器,因?yàn)檫@可是黑客的最愛(ài)??!
四、接下來(lái)我們來(lái)看一個(gè)基本可以說(shuō)是用的最頻繁的一個(gè)命令:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
沒(méi)錯(cuò),就是"git status"。這個(gè)命令用于查看當(dāng)前git的狀態(tài),比如,上面的例子中,我們剛創(chuàng)建了一個(gè)空的git倉(cāng)庫(kù),那么運(yùn)行該指令時(shí),git會(huì)提示我們,當(dāng)前沒(méi)有任何東西要提交,同時(shí)提示我們,可以創(chuàng)建或者復(fù)制文件后使用“git add”命令來(lái)跟蹤文件的變化。
五、現(xiàn)在讓我們來(lái)創(chuàng)建一個(gè)文件吧。我們創(chuàng)建一個(gè)叫“a.txt”的文本文件,并且內(nèi)容如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ cat a.txt
aaa
這個(gè)時(shí)候,讓我們?cè)賮?lái)運(yùn)行下git status吧。運(yùn)行如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
a.txt
nothing added to commit but untracked files present (use "git add" to track)
這時(shí)會(huì)提示我們有一個(gè)未追蹤的文件,叫a.txt。我們要把這個(gè)文件加入到版本控制中,于是,我們運(yùn)行如下命令:
git add a.txt
這個(gè)命令表示把我們指定的a.txt加入到git控制之下。add命令可以沒(méi)有參數(shù)(在windows下可以沒(méi)有參數(shù),在mac下需要指定當(dāng)前目錄即“.”),如果沒(méi)有參數(shù),則表示把目錄下的所有文件都加入到git倉(cāng)庫(kù)中。這個(gè)時(shí)候,我們?cè)龠\(yùn)行下“git status”:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: a.txt
提示我們有改變需要被提交。這個(gè)時(shí)候,a.txt這個(gè)文件就存在于所謂的“暫存區(qū)”中,暫存區(qū)中的文件可以被真正提交到git倉(cāng)庫(kù)。有同學(xué)可能說(shuō),如果我不想提交這個(gè)文件了,那怎么把剛才的文件從暫存區(qū)移除呢?其實(shí)答案就在剛才的提示中:
use "git rm --cached ..." to unstage。
那么,我們運(yùn)行下這個(gè)命令:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git rm --cached a.txt
rm 'a.txt'
再運(yùn)行g(shù)it status時(shí)就可以發(fā)現(xiàn),又回到文件沒(méi)有被提交時(shí)的狀態(tài)了。
六、當(dāng)我們的文件已經(jīng)通過(guò)“git add”加入到暫存區(qū)后,就可以把文件真正提交到git倉(cāng)庫(kù)了。如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git commit -m "提交a.txt"
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'yanyaozhen@macbookpro.(none)')
阿歐,報(bào)錯(cuò)了,查看給出的錯(cuò)誤原因,發(fā)現(xiàn)是因?yàn)闆](méi)有設(shè)置email和用戶名,所以git不讓我提交。git為什么要強(qiáng)制要求設(shè)置了這兩個(gè)配置才能提交呢?因?yàn)間it必須得知道是誰(shuí)提交的,如果連誰(shuí)提交的都不知道,那還怎么做版本管理啊,是不。所以我們根據(jù)提示設(shè)置下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --global user.email "youremail@example.com"
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --global user.name "yourusername"
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$
好了,我們?cè)偬峤幌拢?br />
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git commit -m "提交a.txt"
[master (root-commit) dab07d0] 提交a.txt
1 file changed, 1 insertion(+)
create mode 100644 a.txt
發(fā)現(xiàn)已經(jīng)可以提交成功了,提示一個(gè)文件被修改(就是我們的a.txt),一行(就是我們唯一的一行“aaa”)。
我們?cè)龠\(yùn)行下git status:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
nothing to commit, working directory clean
提示我們當(dāng)前沒(méi)有東西要提交,當(dāng)前工作目錄是干凈的,因?yàn)槲覀兌继峤坏絞it了。
好了,到這步后,git就可以完全跟蹤已經(jīng)被提交的文件了,以后,這個(gè)文件的任何修改,它都可以記錄下來(lái)。比如某個(gè)人對(duì)項(xiàng)目私自修改了一些東西,項(xiàng)目管理者根據(jù)git的版本記錄是一定可以找到是誰(shuí)修改了哪些文件的。
現(xiàn)在我們就可以把文件提交到遠(yuǎn)程服務(wù)器了。
七、當(dāng)我們要提交git倉(cāng)庫(kù)中的內(nèi)容到遠(yuǎn)程服務(wù)器時(shí),我們必須得先成為遠(yuǎn)程服務(wù)器受信任的用戶才行(服務(wù)器當(dāng)然不允許所有人都可以推送內(nèi)容,那樣就亂套了)。這個(gè)時(shí)候,我們需要先在本地生成一個(gè)公鑰,然后把公鑰放到遠(yuǎn)程服務(wù)器的賬戶列表中。生成公鑰的命令如下:
ssh-keygen -t rsa -C "youremail@example.com"
如果你是windows用戶,那么公鑰生成的目錄是C:\Users\用戶名.ssh下,里面有兩個(gè)文件 id_rsa 和 id_rsa.pub ,其中id_rsa.pub中的內(nèi)容就是我們需要的公鑰。如果你是Linux或者mac用戶,那么在用戶主目錄下也會(huì)有一個(gè).ssh目錄,里面放著的是私鑰和公鑰。假設(shè)我們現(xiàn)在要把github作為遠(yuǎn)程推送服務(wù)器地址,那么,我們首先把公鑰放在github的settings->SSH keys列表中(點(diǎn)擊新建一個(gè)ssh key,title隨意,把公鑰的全部?jī)?nèi)容復(fù)制進(jìn)行保存即可)。
八、現(xiàn)在我們可以給StudyGit項(xiàng)目在github上添加一個(gè)遠(yuǎn)程倉(cāng)庫(kù)了。在github上add new repository,名字我在這里也用StudyGit了(起其他名字也可以),建好后顯示如下:
可以看到有一個(gè)ssh地址是git@github.com:onlyanyz/StudyGit.git,這個(gè)就是我們的遠(yuǎn)程git倉(cāng)庫(kù)地址了,一會(huì)我們就會(huì)把文件推送到這里。
接下來(lái),我們需要把本地git倉(cāng)庫(kù)關(guān)聯(lián)到遠(yuǎn)程git倉(cāng)庫(kù),操作如下:進(jìn)入本地StudyGit根目錄,執(zhí)行如下命令:
git remote add origin git@github.com:onlyanyz/StudyGit.git
這個(gè)命令的意思是,我給遠(yuǎn)程倉(cāng)庫(kù)(就是git@github.com:onlyanyz/StudyGit.git)起了個(gè)別名,叫origin(其實(shí)叫別的名字也可以,你只要知道這是別名就行,以后就用別名來(lái)操作遠(yuǎn)程庫(kù))。操作后,我們可以使用“git remote”命令來(lái)查看當(dāng)前本地倉(cāng)庫(kù)關(guān)聯(lián)了哪些遠(yuǎn)程倉(cāng)庫(kù)(它會(huì)列出每個(gè)遠(yuǎn)程庫(kù)的簡(jiǎn)短名字。如果您之前會(huì)使用git clone命令的話,在克隆完某個(gè)項(xiàng)目后,至少可以看到一個(gè)名為 origin 的遠(yuǎn)程庫(kù),Git默認(rèn)使用這個(gè)名字來(lái)標(biāo)識(shí)你所克隆的原始倉(cāng)庫(kù))。
九、關(guān)聯(lián)了遠(yuǎn)程倉(cāng)庫(kù)之后,我們就可以推送了。將本地倉(cāng)庫(kù)push到遠(yuǎn)程倉(cāng)庫(kù)的命令如下:
git push origin master
命令解釋如下:
git push的語(yǔ)法為:git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
該語(yǔ)法表示把本地分支名push到遠(yuǎn)程主機(jī)名的遠(yuǎn)程分支。我們可以看到剛才執(zhí)行的語(yǔ)句并沒(méi)有遠(yuǎn)程分支名(被省略了),如果省略遠(yuǎn)程分支名,則表示將本地分支推送到與之存在”追蹤關(guān)系”的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在,則會(huì)被新建。所以剛才執(zhí)行的語(yǔ)句的意思是,把本地的master分支推送到遠(yuǎn)程主機(jī)的master分支。
關(guān)于git push命令以后還需要注意的地方:
a.如果省略本地分支名,則表示刪除指定的遠(yuǎn)程分支,因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支。例如:
$ git push origin :master
該命令等同于如下指令:$ git push origin --delete master,表示刪除遠(yuǎn)程主機(jī)的master分支。
b.git push 有時(shí)候本地分支和遠(yuǎn)程分支名都可以省略,有時(shí)候連主機(jī)名也可以省略,這個(gè)現(xiàn)在就不細(xì)說(shuō)了。
c.如果當(dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系,則可以使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push:
$ git push -u origin master
好了,現(xiàn)在我們已經(jīng)把StudyGit目錄中的內(nèi)容都推送到遠(yuǎn)程了,現(xiàn)在運(yùn)行g(shù)it status看下:
~/Coding/Practice/StudyGit$ git status
On branch master
nothing to commit, working directory clean
工作目錄還是干凈的,接下來(lái)您就可以繼續(xù)在本地進(jìn)行創(chuàng)建文件->提交到暫存區(qū)->提交到本地倉(cāng)庫(kù)->push到遠(yuǎn)程倉(cāng)庫(kù)的過(guò)程啦!
將遠(yuǎn)程倉(cāng)庫(kù)克隆到本地
下面我們來(lái)講一個(gè)新的玩法,就是先有遠(yuǎn)程倉(cāng)庫(kù),后有本地倉(cāng)庫(kù),即把遠(yuǎn)程倉(cāng)庫(kù)“克?。╟lone)”到本地。
假設(shè)現(xiàn)在你的團(tuán)隊(duì)其他成員已經(jīng)在git上建好了倉(cāng)庫(kù),并且也push過(guò)代碼,這個(gè)遠(yuǎn)程git倉(cāng)庫(kù)還叫“StudyGit”,有兩個(gè)文件:a.txt和README.md,現(xiàn)在,您也要開(kāi)始貢獻(xiàn)代碼了,那么,您首先需要把團(tuán)隊(duì)其他成員提交的所有東西都拉取到你的本地目錄,這個(gè)時(shí)候就會(huì)用到“clone”命令了:
git clone git@github.com:onlyanyz/StudyGit.git
只要執(zhí)行這句指令,就可以把遠(yuǎn)程倉(cāng)庫(kù)的所有東西都拉取到本地工作目錄了,當(dāng)然生成的本地目錄名和遠(yuǎn)程倉(cāng)庫(kù)名字是一樣的。
如果您現(xiàn)在查看下當(dāng)前本地git倉(cāng)庫(kù)的狀態(tài),如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
命令回顯表示,我的本地分支已經(jīng)更新為最新的遠(yuǎn)程master分支了。此后,我們就可以按照“git快速入門之一”這篇文章所述進(jìn)行添加代碼并提交了。
現(xiàn)在,讓我們?cè)倏聪聞偛與lone到本地的git項(xiàng)目,現(xiàn)在有兩個(gè)文件,如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ ll
total 16
-rw-r--r-- 1 yanyaozhen staff 21B 11 19 00:04 README.md
-rw-r--r-- 1 yanyaozhen staff 4B 11 19 00:04 a.txt
接下來(lái),假如A同學(xué)在github上的這個(gè)倉(cāng)庫(kù)中又新增了一個(gè)文件b.txt,那現(xiàn)在github遠(yuǎn)程倉(cāng)庫(kù)中就有三個(gè)文件(注意,現(xiàn)在本地倉(cāng)庫(kù)中的文件就已經(jīng)與遠(yuǎn)程倉(cāng)庫(kù)不同了)。
接下來(lái),我們?cè)诒镜乩^續(xù)我們的開(kāi)發(fā)工作,假如新建了一個(gè)文件“c.txt”,現(xiàn)在,讓我們來(lái)把"c.txt"文件加入暫存區(qū),然后commit到本地倉(cāng)庫(kù),這時(shí),我們想把剛才的工作成果再push到遠(yuǎn)程,執(zhí)行如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ git push origin master
To git@github.com:onlyanyz/StudyGit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:onlyanyz/StudyGit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
阿歐,報(bào)錯(cuò)了,懂點(diǎn)英文的同學(xué)可以從提示信息看出問(wèn)題所在,因?yàn)槲覀兊倪h(yuǎn)程已經(jīng)有更新了,我們?cè)趐ush到遠(yuǎn)程的時(shí)候,必須先把遠(yuǎn)程的改動(dòng)拉到本地合并起來(lái),才能再次提交我的修改。所以,以下的命令就出場(chǎng)了:
$ git fetch origin master
該指令意思是從遠(yuǎn)程origin倉(cāng)庫(kù)的master主分支更新最新的版本到origin/master分支上。
然后我們比對(duì)下當(dāng)前本地master分支和origin/master分支的區(qū)別:
$ git log -p master..origin/master
執(zhí)行的回顯結(jié)果會(huì)詳細(xì)列出這兩個(gè)分支的差異。
然后,我們需要把origin/master分支上的內(nèi)容合并到本地master分支:
git merge origin/master
執(zhí)行該指令后,可能會(huì)要求輸入合并的理由,填寫(xiě)后,我們就合并成功了。這個(gè)時(shí)候,我們就可以再次push了:
yanyaozhen@macbookpro:~/Coding/StudyGit$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 543 bytes | 0 bytes/s, done.
Total 5 (delta 2), reused 0 (delta 0)
To git@github.com:onlyanyz/StudyGit.git
6b3662f..6036a05 master -> master
表示push成功,現(xiàn)在你可以去github上看到我們?cè)诒镜匦陆ǖ腷.txt文件啦!
后記:有同學(xué)可能查了網(wǎng)上的資料,說(shuō)“git fetch”和“git merge”指令可以合二為一,叫“git pull”,在此強(qiáng)烈建議大家使用分開(kāi)的指令,因?yàn)?ldquo;git pull”會(huì)直接合并,而不會(huì)等你確認(rèn),如果一旦合并錯(cuò)了,還是比較麻煩的。寧可慢一點(diǎn),也別重頭再來(lái)。
相關(guān)文章

集成系統(tǒng)級(jí)Claw模式! Deepin 官宣發(fā)布 25.1 版本
deepin操作系統(tǒng)發(fā)布了最新的 25.1 版本更新,該版本基于 deepin 25 正式版積累的多輪內(nèi)測(cè)成果,在 AI 能力、內(nèi)核版本、桌面環(huán)境、文件管理器以及系統(tǒng)安全等方面進(jìn)行了更新2026-04-13
又一代老硬件退場(chǎng)! Linux 內(nèi)核正式放棄Intel 486 CPU
在過(guò)去的幾十年間,CPU 的架構(gòu)已經(jīng)經(jīng)歷了飛速發(fā)展,x86 系列就是其中之一,而 i486 則屬于該系列中的一個(gè),當(dāng)前,i486 的CPU處理器已經(jīng)夠老,從 Linux 7.1 開(kāi)始將不再有對(duì)2026-04-09
趕緊收藏! 全網(wǎng)最全 Linux 命令總結(jié)
我把 Linux 中最常用、最實(shí)用、最常被問(wèn)到的命令按照實(shí)際使用場(chǎng)景分類整理,方便你快速查閱和記憶,內(nèi)容覆蓋日常運(yùn)維、開(kāi)發(fā)調(diào)試、性能分析、文件處理、網(wǎng)絡(luò)、安全、系統(tǒng)管2026-04-08
一分鐘內(nèi)檢查L(zhǎng)inux服務(wù)器性能? 9個(gè)性能檢測(cè)常用的基本命令
今天我們來(lái)看看Linux系統(tǒng)中用于性能監(jiān)控的一系列命令,這些命令可以快速查看機(jī)器的負(fù)載情況,詳細(xì)請(qǐng)看下文介紹2026-03-18
從零基礎(chǔ)到精通! 適合高級(jí)用戶的15款Linux發(fā)行版推薦
Linux作為操作系統(tǒng)領(lǐng)域靈活性和可定制性的基石,提供了大量滿足不同用戶需求的發(fā)行版,今天分享適合高級(jí)用戶的15款Linux發(fā)行版2026-03-10
開(kāi)箱即用? 這4個(gè)高手級(jí)Linux發(fā)行版遠(yuǎn)沒(méi)你想象的那么安全易用
如果你正在糾結(jié)用哪個(gè)發(fā)行版?零基礎(chǔ)新手別被“高端”“極客”“聲明式”這些詞沖昏頭腦,先用好用的,再慢慢進(jìn)階2026-03-10
這幾款SSH工具真的夠用了! Linux好用的ssh工具推薦
在Linux上使用SSH,您需要安裝一個(gè)SSH客戶端,今天整理找到的8 款 SSH / 終端工具,從免費(fèi)開(kāi)源到企業(yè)級(jí)商用,從輕量化命令行到一站式工具箱,每款都做了介紹與對(duì)比,希望能2026-03-09
在Linux系統(tǒng)下有兩種用戶,即高級(jí)用戶root,普通用戶,高級(jí)用戶root可以在系統(tǒng)中做任何事情,普通用戶僅可在Linux系統(tǒng)中做有限的事情,下面我們就來(lái)看看切換方法2026-02-28
揭秘當(dāng)前登錄用戶的身份! Linux中使用logname命令的技巧
logname命令就是這樣一個(gè)簡(jiǎn)單但強(qiáng)大的工具,它能幫助我們輕松獲取當(dāng)前登錄用戶的用戶名,今天,我們就來(lái)深入探索一下這個(gè)命令的工作原理、使用方法和最佳實(shí)踐2026-02-26
在 Linux 系統(tǒng)中,DNS 緩存是一種將域名和 IP 地址映射關(guān)系緩存在本地的機(jī)制,可以加快域名解析速度,并減輕 DNS 服務(wù)器的負(fù)載2026-02-26



