走近 github 王国,git 入门教程
写在前面
一个稳定简单,空间大,关注度高的博客分享平台是提高博客浏览量的必要条件,当然内容充实才是关键,废话不多说,今天我们就来搞定 git 和 github,相信程序猿们都懂。
简介
GIT
Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 的读音为/gɪt/。 Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- 官网:https://git-scm.com/
- Git 教程:廖雪峰的官方网站
github
作为开源代码库以及版本控制系统,Github 拥有 140 多万开发者用户。随着越来越多的应用程序转移到了云上,Github 已经成为了管理软件开发以及发现已有代码的首选方法。 GitHub 可以托管各种 git 库,并提供一个 web 界面,但与其它像 SourceForge 或 Google Code 这样的服务不同,GitHub 的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将 GitHub 称为代码玩家的 MySpace。
- 官网:https://github.com/
准备环节
Git 安装配置
在使用 Git 前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac 和 Windows 平台上运行。Git 各平台安装包下载地址为:http://git-scm.com/downloads。
安装教程:https://git-scm.com/book/zh/v2/起步-安装-Git
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。在开始菜单里找到"Git"->"Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。
用户信息
配置个人的用户名称和电子邮件地址:
git config --global user.name "xxxxx"
git config --global user.email xxxxxxx@qq.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
查看配置信息
要检查已有的配置信息,可以使用 $ git config --list 命令:
core.symlinks=false
core.autocrlf=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=f:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
credential.helper=manager
user.name=zhaomenghuan
user.email=1028317108@qq.com
gui.recentrepo=E:/coding/zhaomenghuan/github
也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:
git config user.name
Git 工作流程详解
Git 一般工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git 工作区、暂存区和版本库
我们先来理解下 Git 工作区、暂存区和版本库概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage, 或 index。一般存放在"git 目录"下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行
git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。 - 当执行提交操作
git commit
时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。 - 当执行
git reset HEAD
命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。 - 当执行
git rm --cached <file>
命令时,会直接从暂存区删除文件,工作区则不做出改变。 - 当执行
git checkout .
或者git checkout -- <file>
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。 - 当执行
git checkout HEAD .
或者git checkout HEAD <file>
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
常用命令说明
git init (初始化仓库)
git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
进入目标目录,右键单击选择 Git Bash Here 然后就可以输入命令。使用当前目录作为 Git 仓库,我们只需使它初始化。
git init
该命令执行完后会在当期目录生成一个 .git 目录。
使用我们指定目录作为 Git 仓库。
git init folderPath
folderPath 为目录地址,初始化后,会在 folderPath 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后使用 git commit 命令提交。
Git 提交文件到版本库有两步:
- 第一步:使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
- 第二步:使用 git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
下面将详细介绍这两条命令:
git add(添加工作区文件到暂存区)
比如在当前目录下新建 README.md 文件,然后输入下列命令:
git add README.md
注:添加当前目录下的所有文件和子目录为:
git add .
git commit(将暂存区内容提交到当前版本库)
$ git commit -m "README.md提交成功"
结果显示:
[master (root-commit) f174e25] README.md提交成功
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
当多个文件被修改时使用这个命令提交:
git commit -a -m <file>;
说明:-a, --all commit all changed files(提交所有被修改的文件)
$ git commit -a -m .
[master f155b28] .
5 files changed, 14 insertions(+), 8 deletions(-)
git rm (移除当前版本库文件)
$ git rm README.md
rm 'README.md'
执行完这句会发现 README.md 文件在工作区消失了,但是这个时候在版本库是否还存在呢?
git status(查看当前仓库状态)
git status 以查看在你上次提交之后是否有修改,可以让我们时刻掌握仓库的状态,此时我们输入 git status 命令会得到下面的结果:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: README.md
此时显示了 README.md 文件被删除但还没有被提交,与 git add 命令一样,git rm 只有经过 git commit 命令之后才会真正在版本库被删除。
git diff
执行 git diff 来查看执行 git status 的结果的详细信息。 git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff --stat
git clone (克隆其他仓库)
使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。 执行命令:
$ git clone [url]
[url] 为你想要复制的项目地址。默认情况下,Git 会按照你提供的 URL 所指示的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。
版本管理
1.查看远程分支
git branch -a
2.查看本地分支
git branch
3.创建分支
git branch <name>
4.切换分支到 test
git checkout test
5.删除本地分支
git branch -d xxxxx
6.快速切换到 master 分支
git checkout master
当然上面这条命令是常规的,我们的快速切换回去的命令才是重点,可用它代替上面git checkout <分支名>
的命令。
我们上面讲解了如何把当前工作区文件添加并提交到本地版本仓库,这里并没有讲解如何修改和撤销文件,版本比较之类的命令,因为考虑到作为入门级别教程不要求过于详细,所以更多的 git 命令会在后面深入探讨。
如何添加远程库?
由于网上关于如何新建 github 仓库或博客的教程很多,我这里暂时不做赘述,直接引用几篇文章,后期如果有空再做补充。
设置 NPM 淘宝代理镜像
npm config set registry https://registry.npm.taobao.org
git push
$ git remote add origin 仓库地址
$ git push -u origin master
仓库地址为你在 github 上面建的仓库的地址。
错误处理
error: failed to push some refs
当 github 上被改变了,有时候会发现直接使用 git push -u origin master 会出错,这个时候先使用 git pull --rebase origin master 更新就会解决。
fatal: Unable to create 'E:/coding/pop/.git/index.lock': File exists.
执行下面的可以解决:
rm -f ./.git/index.lock
fork 出来的仓库同步
我们在进行 Github 协同开发的时候,往往会去 fork 一个仓库到自己的 Github 中,过一段时间以后,原仓库可能会有各种提交以及修改,很可惜,Github 本身并没有自动进行同步的机制,这个需要我们手动去执行,现在我来演示一下如何进行自己的仓库和原仓库进行 Gith 同步的操作。
- 首先在终端中配置原仓库的位置,进入项目目录,查看你的远程仓库的路径,执行如下命令:
git remote -v
- 配置原仓库的路径:
git remote add upstream <原仓库路径>
- 再次查看远程目录的位置:
git remote -v
- 抓取原仓库的修改文件:
git fetch upstream
- 切换到 master 分支:
git checkout master
- 合并远程的 master 分支:
git merge upstream/master
此时,你的本地库已经和原仓库已经完全同步了,但是注意,此时只是你电脑上的本地库和远程的 github 原仓库同步了,你自己的 github 仓库还没有同步,此时需要使用“git push”命令把你本地的仓库提交到 github 中。
写这些代码也许就一两个小时的事,写一篇大家好接受的文章需要几天的酝酿,如果文章对您有帮助请我喝杯咖啡吧!
