Linux操作Git远程仓库与本地仓库同步的教程
创建本地仓库并同步到远程
git是⾮常强⼤的版本管理⼯具。接下来的时间⾥,我就和⼤家絮叨絮叨git的⼊门:如何在本地创建⼀个git仓库,并把⾃⼰的本地代码同步到远程。此教程是在mac上操作的,如果您的系统是Linux,那么操作⽅法相同;如果您的系统是windows,那么,只需要把git的bash窗⼝调出来,以后的过程也都与Linux相同。
⼀、⾸先,您需要安装git,此步就忽略了,⾃⾏安装即可。
⼆、假设你⽬前还没有创建⼀个⼯作⽬录,那么,先创建⼀个⽬录吧,就叫StudyGit。
三、现在的StudyGit⽬录还只是⼀个本地⽬录,和git没有任何关联,那么,我们怎么样才能把这个⽬录和git关联起来呢?只需要进⼊StudyGit⽬录,运⾏如下命令:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git init
Initialized empty Git repository in /Urs/yanyaozhen/Coding/Practice/StudyGit/.git/
提⽰已经说明我们初始化了⼀个空的本地git仓库。如果你查看StudyGit下的所有⽂件时,会发现⼀个.git 的隐藏⽂件,这个⽂件⾮常重要,版本的控制就靠它了。同时,如果你要部署应⽤程序到⽣产环境时,切记不要把该⽬录部署到服务器,因为这可是⿊客的最爱啊!
四、接下来我们来看⼀个基本可以说是⽤的最频繁的⼀个命令:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
Initial commit
nothing to commit (create/copy files and u "git add" to track)
没错,就是"git status"。这个命令⽤于查看当前git的状态,⽐如,上⾯的例⼦中,我们刚创建了⼀个
空的git仓库,那么运⾏该指令时,git会提⽰我们,当前没有任何东西要提交,同时提⽰我们,可以创建或者复制⽂件后使⽤“git add”命令来跟踪⽂件的变化。
五、现在让我们来创建⼀个⽂件吧。我们创建⼀个叫“a.txt”的⽂本⽂件,并且内容如下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$
aaa
这个时候,让我们再来运⾏下git status吧。运⾏如下:
复制代码
代码如下:
yanyaozh乘坐高铁流程
en@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch 网络安全英语
master
Initial commit
Untracked files:
(u "git add <file>..." to include in what will be committed)
nothing added to commit but untracked files prent (u "git add" to track)
这时会提⽰我们有⼀个未追踪的⽂件,叫a.txt。我们要把这个⽂件加⼊到版本控制中,于是,我们运⾏如下命令:
复制代码
代码如下:
git
这个命令表⽰把我们指定的a.txt加⼊到git控制之下。add命令可以没有参数(在windows下可以没有参数,在mac下需要指定当前⽬录即“.”),如果没有参数,则表⽰把⽬录下的所有⽂件都加⼊到git仓库中。这个时候,我们再运⾏下“git status”:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
Initial commit
Changes to be committed:
(u "git rm --cached <file>..." to unstage)
new file: a.txt
提⽰我们有改变需要被提交。这个时候,a.txt这个⽂件就存在于所谓的“暂存区”中,暂存区中的⽂件可以被真正提交到git仓库。有同学可能说,如果我不想提交这个⽂件了,那怎么把刚才的⽂件从暂存区移除呢?其实答案就在刚才的提⽰中:
u "git rm --cached ..." to unstage。
那么,我们运⾏下这个命令:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git rm --
rm 'a.txt'
再运⾏git status时就可以发现,⼜回到⽂件没有被提交时的状态了。
六、当我们的⽂件已经通过“git add”加⼊到暂存区后,就可以把⽂件真正提交到git仓库了。如下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git commit -m "提交a.txt"
*** Plea tell me who you are.
Run
git config --ail ""
git config --global ur.name "Your Name"
to t your account's default identity.
Omit --global to t the identity only in this repository.
fatal: unable to auto-detect email address (got 'yanyaozhen@macbookpro.(none)')
阿欧,报错了,查看给出的错误原因,发现是因为没有设置email和⽤户名,所以git不让我提交。git为什么要强制要求设置了这两个配置才能提交呢?因为git必须得知道是谁提交的,如果连谁提交的都不知道,那还怎么做版本管理啊,是不。所以我们根据提⽰设置下:
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --ail "" yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --global ur.name "yoururname"
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$
好了,我们再提交下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git commit -m "提交a.txt"
[master (root-commit) dab07d0] 提交a.txt
1 file changed, 1 inrtion(+)
create mode
发现已经可以提交成功了,提⽰⼀个⽂件被修改(就是我们的a.txt),⼀⾏被插⼊(就是我们唯⼀的⼀⾏“aaa”)。
我们再运⾏下git status:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status
On branch master
nothing to commit, working directory clean
提⽰我们当前没有东西要提交,当前⼯作⽬录是⼲净的,因为我们都提交到git了。
好了,到这步后,git就可以完全跟踪已经被提交的⽂件了,以后,这个⽂件的任何修改,它都可以记录下来。⽐如某个⼈对项⽬私⾃修改了⼀些东西,项⽬管理者根据git的版本记录是⼀定可以找到是谁修改了哪些⽂件的。
现在我们就可以把⽂件提交到远程服务器了。
七、当我们要提交git仓库中的内容到远程服务器时,我们必须得先成为远程服务器受信任的⽤户才⾏(服务器当然不允许所有⼈都可以推送内容,那样就乱套了)。这个时候,我们需要先在本地⽣成⼀个公钥,然后把公钥放到远程服务器的账户列表中。⽣成公钥的命令如下:
复制代码
代码如下:
ssh-keygen -t rsa -C ""
如果你是windows⽤户,那么公钥⽣成的⽬录是C:\Urs\⽤户名.ssh下,⾥⾯有两个⽂件 id_rsa 和 id_rsa.pub ,其中
id_rsa.pub中的内容就是我们需要的公钥。如果你是Linux或者mac⽤户,那么在⽤户主⽬录下也会有⼀个.ssh⽬录,⾥⾯放着的是私钥和公钥。假设我们现在要把github作为远程推徒步登山
送服务器地址,那么,我们⾸先把公钥放在github的ttings->SSH keys列表中(点击新建⼀个ssh key,title随意,把公钥的全部内容复制进⾏保存即可)。
⼋、现在我们可以给StudyGit项⽬在github乌鸦喝水教案
上添加⼀个远程仓库了。在github上add new repository,名字我在这⾥也⽤StudyGit了(起其他名字也可以),建好后显⽰如下:
可以看到有⼀个ssh地址是:onlyanyz/StudyGit.git,这个就是我们的远程git仓库地址了,⼀会我们就会把⽂件推送到这⾥。
接下来,我们需要把本地git仓库关联到远程git仓库,操作如下:进⼊本地StudyGit根⽬录,执⾏如下命令:
复制代码
代码如下:
git remote add origin :onlyanyz/StudyGit.git
这个命令的意思是,我给远程仓库(就是:onlyanyz/StudyGit.git)起了个别名,叫origin(其实叫别的名字也可以,你只要知道这是别名就⾏,以后就⽤别名来操作远程库)。操作后,我们可以使⽤“git remote”命令来查看当前本地仓库
关联了哪些远程仓库(它会列出每个远程库的简短名字。如果您之前会使⽤git clone命令的话,在克隆完某个项⽬后,⾄少可以看到⼀个名为 origin 的远程库,Git默认使⽤这个名字来标识你所克隆的原始仓库)。
九、关联了远程仓库之后,我们就可以推送了。将本地仓库push到远程仓库的命令如下:
复制代码
代码如下:
git push origin master
命令解释如下:
git push的语法为:git push <;远程主机名> <;本地分⽀名>:<;远程分⽀名>
该语法表⽰把本地分⽀名push到远程主机名的远程分⽀。我们可以看到刚才执⾏的语句并没有远程分⽀名(被省略了),如果省略远程分⽀名,则表⽰将本地分⽀推送到与之存在”追踪关系”的远程分⽀(通常两者同名),如果该远程分⽀不存在,则会被新建。所以刚才执⾏的语句的意思是,把本地的master分⽀推送到远程主机的master分党的誓词
⽀。
关于git push命令以后还需要注意的地⽅:
a.如果省略本地分⽀名,则表⽰删除指定的远程分⽀,因为这等同于推送⼀个空的本地分⽀到远程分⽀。例如:
复制代码
代码如下:
$ git push origin :master
该命令等同于如下指令:$ git push origin --delete master,表⽰删除远程主机的master分⽀。
b.git push 有时候本地分⽀和远程分⽀名都可以省略,有时候连主机名也可以省略,这个现在就不细说了。
c.如果当前分⽀与多个主机存在追踪关系,则可以使⽤-u选项指定⼀个默认主机,这样后⾯就可以不加任何参数使⽤git push:
复制代码
代码如下:
$ git push -u origin master
好了,现在我们已经把StudyGit⽬录中的内容都推送到远程了,现在运⾏git status看下:
复制代码
代码如下:
~/Coding/Practice/StudyGit$ git status
On branch master
nothing to commit, working directory clean
⼯作⽬录还是⼲净的,接下来您就可以继续在本地进⾏创建⽂件->提交到暂存区->提交到本地仓库->push到远程仓库的过程啦!
将远程仓库克隆到本地
下⾯我们来讲⼀个新的玩法,就是先有远程仓库,后有本地仓库,即把远程仓库“克隆(clone)”到本地。
假设现在你的团队其他成员已经在git上建好了仓库,并且也push过代码,这个远程git仓库还叫“StudyGit”,有两个⽂件:a.txt和README.md,现在,您也要开始贡献代码了,那么,您⾸先需要把团队其他成员提交的所有东西都拉取到你的本地⽬录,这个时候就会⽤到“clone”命令了:
复制代码
代码如下:
git clone :onlyanyz/StudyGit.git
只要执⾏这句指令,就可以把远程仓库的所有东西都拉取到本地⼯作⽬录了,当然⽣成的本地⽬录名和远程仓库名字是⼀样的。
如果您现在查看下当前本地git仓库的状态,如下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
命令回显表⽰,我的本地分⽀已经更新为最新的远程master分⽀了。此后,我们就可以按照“git快速⼊门之⼀”这篇⽂章所述进⾏添加代码并提交了。
现在,让我们再看下刚才clone到本地的git项⽬,现在有两个⽂件,如感恩节吃火鸡
下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ ll
total 16
-rw-r--r-- 1 yanyaozhen staff 2戒烟英语
1B 11 19 00:04 README.md
-rw-r--r-- 1 yanyaozhen staff 4B 11 19 00:
接下来,假如A同学在github上的这个仓库中⼜新增了⼀个⽂件b.txt,那现在github远程仓库中就有三个⽂件(注意,现在本地仓库中的⽂件就已经与远程仓库不同了)。
接下来,我们在本地继续我们的开发⼯作,假如新建了⼀个⽂件“c.txt”,现在,让我们来把"c.txt"⽂件加⼊暂存区,然后commit到本地仓库,这时,我们想把刚才的⼯作成果再push到远程,执⾏如下:
复制代码
代码如下:
yanyaozhen@macbookpro:~/Coding/StudyGit$ git push origin master
To :onlyanyz/StudyGit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to ':onlyanyz/StudyGit.git'
hint: Updates were rejected becau the remote contains work that you do
hint: not have locally. This is usually caud 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.
阿欧,报错了,懂点英⽂的同学可以从提⽰信息看出问题所在,因为我们的远程已经有更新了,我们在push到远程的时候,必须先把远程的改动拉到本地合并起来,才能再次提交我的修改。所以,以下的命令就出场了:
复制代码
代码如下:
$ git fetch origin master
该指令意思是从远程origin仓库的master主分⽀更新最新的版本到origin/master分⽀上。
然后我们⽐对下当前本地master分⽀和origin/master分⽀的区别:
复制代码
代码如下:
$ git log -igin/master
执⾏的回显结果会详细列出这两个分⽀的差异。
然后,我们需要把origin/master分⽀上的内容合并到本地master分⽀:
复制代码
代码如下:
git merge origin/master
执⾏该指令后,可能会要求输⼊合并的理由,填写后,我们就合并成功了。这个时候,我们就可以再次push了: