Git入门-Part-1
这是我刚开始接触Git时写下的一篇文章,时隔1年,重新拿出来修改了许多的地方,可以作为一个新手入门的guide.当然我也有许多不足的地方,望诸位多多指教.
不会谈到的:
- Git 安装:(略)
- Git 初次运行配置:(略)参见官网的配置
会谈到的:
- 新建本地的repos的过程
- 如何关联本地仓库和远程仓库
- 如何提交代码到托管平台
- 知识点补充
Repository操作
新建一个文件夹
我们先在本地新建一个文件夹作为repos,然后在这个目录下右键 GitBash Here(MacOS环境下 ,可以打开iTerm2 然后进入到对应的目录下)
git init #初始化Git的环境 ls #查看当前目录的文件列表
这里我们可以看到多了一个文件夹.git,然后来看下官方的描述:
“所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。”
我暂时将它理解为Git的Runtime Environment ,接下来的文档就开始描述track文件。
提交代码到暂存区
README.md是怎么回事呢 ?如果你从来没有用过github或者类似的代码托管平台 ,并且你也没有接触过markdown语法 ,可能你确实不熟悉这个.md结尾的文件.
其实很简单,就像你是一位大厨,现在你做了一道很牛的菜,现在你把这道菜(成品)放在了样品台上(代码托管平台) .
现在有很多的人都在吃你做的菜, 但是他们想知道这道菜应该怎么做,怎么吃?现在你就需要提供一个菜谱(README.md)也就是一个用markdown语法所写的说明书.而这个README的命名也就是“请读我”
明白了这个文件的含义,我们继续操作:
vim README #新建一个README文件 vi README #编辑这个文件的内容
在编辑完成之后我曾经一度傻呵呵的不知道怎么保存退出,其实编辑好内容之后ESC 或者 ctrl + c 可以结束编辑,然后:wq 保存并且退出,注意:wq前面是有个:号的.
接上之前所说的,下一条是commit指令,后面的-m "message body"指的是针对这次的提交的说明,这里的提交并不是提交到你的托管服务器上,而是提交到本地暂存区.
那怎么提交代码到远程的仓库呢? 别着急我们慢慢来.
git add . 将当前有修改的文件都添加到暂存区 git add README git commit -m 'initial project version'
关于远程仓库的一些配置
创建远程仓库
要推送(push)代码到远程仓库, 你首先需要一个远程仓库, 在这个例子里面 , 我们用Github 作为我们代码托管平台,如果你还没有一个Github的账号,那么你可以注册一个,因为这是作为一只程序猿必不可少的.
注册完成后,我们可以在自己的账号下创建一个repository.叫什么名字好呢? 我选择的名字是 GitExample 然后你可能想输入一些描述.然后点击Create repository
创建后你还需要配置一下公共秘钥 ,因为Github上免费的仓库都是公开的 ,那么我们怎么来限制其他的人提交代码到我们的仓库呢?这就是密钥的用处了.
密钥就像凭据 ,就像中国古代的虎符,你的电脑这边生成出来他独特的密钥之后, 要把这个密钥给你的Github账号也分配一份.这样你可以直接提交代码到这个Github账号下的仓库里了.
具体怎么生成,Github又怎样配置,你可以百度”为github帐号添加SSH keys” 有很多的介绍,笔者就不在这里赘述了.
Clone Repository到本地
我们已经创建好自己的仓库,并且配置好了密钥,现在我们可以来把远程的仓库克隆到本地了, 到这里你可能会想, 那我们之前创建的本地仓库有什么用呢? 别急, 到后面我们添加远程仓库的时候可以用得上.
固定的Clone指令的格式应该是git clone [url] 这个url是你的repos的远程路径,下面是例子
git clone git://github.com/dendiSe7enGitHub/testAboutGit.git Testgit #不要clone我的项目到本地,因为这个项目已经删除了...
这里最后的Testgit是我给本地repos取的名字,如果不写默认与源同名。这里值得一提的是,在之前搭建hexo的过程中,我已经有clone过很多次项目到本地,但是我都是用的:
git clone [email protected]:DendiSe7enGitHub/moreTestAboutGit.git #不要clone我的项目到本地,因为这个项目已经删除了...
是不是不一样?这是因为git支持多种传输协议:
- 官方的文档中是
git://
- "http://" HTTP协议
- "user@server:/path.git" SSH协议
如何提交更改到远程的Git仓库中
首先我们进入到我们clone下来的仓库里面.
很明显,现在我们在一个空仓库里面,因为我们在创建之后,什么代码都没有提交过.后面有一个小括号显示我们是在master分支上.也就是主分支(至于什么是分支,如果操作分支,之后的博文会谈到的)
现在我们可以在这目录下创建一个文件,名字叫README.md和之前一样.
创建好之后,我们输入git status
发现: 我们刚刚创建的文件被标为了红色, status = 状态, 也就是说现在我们本地的仓库相对于它被创建之后,有了变化,而这些变化的文件就会标为红色.
接下来我们输入git add
. 请注意,这个add
后面是有一个英文的句号.
的.
输入完成后,我们用 git status
命令再次查看我们的本地master分支的状态.
发现什么不一样了吗 ?原本是红色的README.md变成了绿色,这证明,我们把修改加入到了暂存区.
现在我们要提交这个更改,并且将这个更改推送到远程分支.
现在我们用git commit -m
提交了代码,并且用push
命令吧代码推送到了远程仓库.origin
这里指的我们远程仓库的名字.
你可能会想,我们并没有添加过远程仓库,也没有给它命名啊?但是事实是,我们在clone远程仓库到本地的这个过程中,我们本地的master
分支直接获取到了远程的分支(就是我们输入的指令的最后一个参数master),并且把远程的仓库默认取名为origin
.
那么为什么有-u
呢,[-u
=--set-upstream
] 那它是什么意思呢?
其实当我们本地的项目只追踪了一个远程分支的时候,我们是可以省略-u
的,但是当我们远程有多个分支,且本地的一个分支可能tracking了不同的远程分支的时候,就需要我们用-u来指定这个本地分支应该tracking哪个远程分支.
举个例子:本地你有一个小金库,比如叫做master,同时远程有三家银行,分别叫master银行,feature银行,develop银行.
首先,你把金库的钱存到了master银行里,并且你希望下次你的金库钱都自动存到这个master银行里.
然后过了一段时间,你觉得feature银行更好,你把金库的钱存到了feature银行里,并且希望下次金库的钱自动转到master银行.
这时候你执行了
git push -origin feature
那么下次你金库的钱变多了.你想存入到feature银行,你可以省略很多命令,你只需要:
git push
因为这时候,你已经把金库和feature银行关联起来了.
回到我们刚刚的问题,这里的银行就是远程分支,金库就是你的本地仓库,那-u就是指定你现在tracking的仓库是什么,也就是你把现在的本地分支关联到哪个远程分支.
知识点
图 1-1.GIT中文件的状态变化周期
指令及说明:
git status# 检查当前文件状态 git add README # 跟踪新文件
git diff --staged 看已经暂存起来的文件和上次提交时的快照之间的差异 git commit 提交更新 git commit -a #跳过使用暂存区域 git rm grit.gemspec #移除文件 从暂存区域移除
#忽略某些文件 vim .gitignore#创建一个名为.gitignore的文件 vi .gitignore #编辑文件内容 *.[oa] #在提交时忽略.o 或者 .a 的文件 *~ #在提交时忽略.~ 的文件 # 此为注释 – 将被 Git 忽略 # 忽略所有 .a 结尾的文件 *.a # 但 lib.a 除外 !lib.a # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO /TODO # 忽略 build/ 目录下的所有文件 build/ # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt # ignore all .txt files in the doc/ directory doc/**/*.txt
有任何问题欢迎邮件或者讨论~
原发于我的个人博客