在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
创建本地仓库并同步到远程 二、假设你目前还没有创建一个工作目录,那么,先创建一个目录吧,就叫StudyGit。 三、现在的StudyGit目录还只是一个本地目录,和git没有任何关联,那么,我们怎么样才能把这个目录和git关联起来呢?只需要进入StudyGit目录,运行如下命令: 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git init Initialized empty Git repository in /Users/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 use "git add" to track) 五、现在让我们来创建一个文件吧。我们创建一个叫“a.txt”的文本文件,并且内容如下: 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ cat a.txt aaa 这个时候,让我们再来运行下git status吧。运行如下: 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git status On branch master Initial commit Untracked files: a.txt nothing added to commit but untracked files present (use "git add" to track) 复制代码 代码如下:git add a.txt 这个命令表示把我们指定的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: new file: a.txt 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git rm --cached a.txt rm 'a.txt' 再运行git status时就可以发现,又回到文件没有被提交时的状态了。 六、当我们的文件已经通过“git add”加入到暂存区后,就可以把文件真正提交到git仓库了。如下: 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git commit -m "提交a.txt" *** Please tell me who you are. Run git config --global user.email "[email protected]" to set your account's default identity. fatal: unable to auto-detect email address (got 'yanyaozhen@macbookpro.(none)') 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --global user.email "[email protected]" yanyaozhen@macbookpro:~/Coding/Practice/StudyGit$ git config --global user.name "yourusername" 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 insertion(+) create mode 100644 a.txt 发现已经可以提交成功了,提示一个文件被修改(就是我们的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仓库中的内容到远程服务器时,我们必须得先成为远程服务器受信任的用户才行(服务器当然不允许所有人都可以推送内容,那样就乱套了)。这个时候,我们需要先在本地生成一个公钥,然后把公钥放到远程服务器的账户列表中。生成公钥的命令如下: 复制代码 代码如下:如果你是windows用户,那么公钥生成的目录是C:\Users\用户名.ssh下,里面有两个文件 id_rsa 和 id_rsa.pub ,其中id_rsa.pub中的内容就是我们需要的公钥。如果你是Linux或者mac用户,那么在用户主目录下也会有一个.ssh目录,里面放着的是私钥和公钥。假设我们现在要把github作为远程推送服务器地址,那么,我们首先把公钥放在github的settings->SSH keys列表中(点击新建一个ssh key,title随意,把公钥的全部内容复制进行保存即可)。 八、现在我们可以给StudyGit项目在github上添加一个远程仓库了。在github上add new repository,名字我在这里也用StudyGit了(起其他名字也可以),建好后显示如下: 可以看到有一个ssh地址是[email protected]:onlyanyz/StudyGit.git,这个就是我们的远程git仓库地址了,一会我们就会把文件推送到这里。 复制代码 代码如下:这个命令的意思是,我给远程仓库(就是[email protected]: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到远程仓库的过程啦! 将远程仓库克隆到本地 复制代码 代码如下:只要执行这句指令,就可以把远程仓库的所有东西都拉取到本地工作目录了,当然生成的本地目录名和远程仓库名字是一样的。 如果您现在查看下当前本地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 21B 11 19 00:04 README.md -rw-r--r-- 1 yanyaozhen staff 4B 11 19 00:04 a.txt 接下来,假如A同学在github上的这个仓库中又新增了一个文件b.txt,那现在github远程仓库中就有三个文件(注意,现在本地仓库中的文件就已经与远程仓库不同了)。 接下来,我们在本地继续我们的开发工作,假如新建了一个文件“c.txt”,现在,让我们来把"c.txt"文件加入暂存区,然后commit到本地仓库,这时,我们想把刚才的工作成果再push到远程,执行如下: 复制代码 代码如下:yanyaozhen@macbookpro:~/Coding/StudyGit$ git push origin master To [email protected]:onlyanyz/StudyGit.git ! [rejected] master -> master (fetch first) error: failed to push some refs to '[email protected]: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. 阿欧,报错了,懂点英文的同学可以从提示信息看出问题所在,因为我们的远程已经有更新了,我们在push到远程的时候,必须先把远程的改动拉到本地合并起来,才能再次提交我的修改。所以,以下的命令就出场了: 复制代码 代码如下:$ git fetch origin master 该指令意思是从远程origin仓库的master主分支更新最新的版本到origin/master分支上。 然后我们比对下当前本地master分支和origin/master分支的区别: 复制代码 代码如下:$ git log -p master..origin/master 执行的回显结果会详细列出这两个分支的差异。 然后,我们需要把origin/master分支上的内容合并到本地master分支: 复制代码 代码如下:git merge origin/master 执行该指令后,可能会要求输入合并的理由,填写后,我们就合并成功了。这个时候,我们就可以再次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 [email protected]:onlyanyz/StudyGit.git 6b3662f..6036a05 master -> master 表示push成功,现在你可以去github上看到我们在本地新建的b.txt文件啦! 后记:有同学可能查了网上的资料,说“git fetch”和“git merge”指令可以合二为一,叫“git pull”,在此强烈建议大家使用分开的指令,因为“git pull”会直接合并,而不会等你确认,如果一旦合并错了,还是比较麻烦的。宁可慢一点,也别重头再来。 |
请发表评论