本文主要介绍Github的基本操作,包括Git的工作流程、基本概念、创建仓库、基本操作等。
1、Git 工作流程
在实际的应用中,Git的一般工作流程如下:
1)克隆git资源作为工作目录
2)在克隆的资源上添加或修改文件
3)如果其他人修改了,你可以更新资源
4)在提交前查看修改
5)提交修改
6)在修改完成后,如果发现错误,可以撤回提交并再次修改并提交
2、Git 基本概念
工作区:电脑里能看到的目录
暂存区:一般存放在.git目录下的index文件中
索引库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
3、Git 创建仓库
使用方法
使用当前目录作为 Git 仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
图一
使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
注: 在 Linux 系统中,commit 信息使用单引号 ‘,Windows 系统,commit 信息使用双引号 “。
所以在 git bash 中 git commit -m ‘提交说明’ 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m “提交说明”。
git clone
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式为:
git clone <repo>
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory>
参数说明:
- repo:Git 仓库。
- directory:本地目录。
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
配置
git 的设置使用 git config 命令。
显示当前的 git 配置信息:
$ git config --list
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
编辑 git 配置文件:
$ git config -e # 针对当前仓库
或者:
$ git config -e --global # 针对系统上所有仓库
设置提交代码时的用户信息:
$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com
如果去掉 –global 参数只对当前仓库有效。
4、Git 基本操作
常见的6个命令:git clone、git push、git add、git commit、git pull、pull request。
说明:
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库一个简单的操作步骤:
$ git init
$ git add .
$ git commit
- git init - 初始化仓库。
- git add . - 添加文件到暂存区。
- git commit - 将暂存区内容添加到仓库中。
git init 与git clone已在前文阐述
git add
添加文件到暂存区
# 添加文件
git add [file1] [file2]...
# 添加指定目录
git add [dir]
# 添加当前目录下的所有文件
git add .
以下实例我们添加两个文件:
$ touch README # 创建文件
$ touch hello.php # 创建文件
$ ls
README hello.php
$ git status -s
?? README
?? hello.php
$
git status 命令用于查看项目的当前状态。
接下来我们执行 git add 命令来添加文件:
$ git add README hello.php
现在我们再执行 git status,就可以看到这两个文件已经加上去了。
$ git status -s
A README
A hello.php
$
新项目中,添加所有文件很普遍,我们可以使用 git add . 命令来添加当前项目的所有文件。
现在我们修改 README 文件:
$ vim README
在 README 添加以下内容:# Runoob Git 测试,然后保存退出。
再执行一下 git status:
$ git status -s
AM README
A hello.php
AM 状态的意思是这个文件在我们将它添加到缓存之后又有改动。改动后我们再执行 git add . 命令将其添加到缓存中:
$ git add .
$ git status -s
A README
A hello.php
文件修改后,我们一般都需要进行 git add 操作,从而保存历史版本。
git status
git status 是一个用于查看 Git 仓库当前状态的命令。
git status 命令可以查看在你上次提交之后是否有对文件进行再次修改。
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
new file: hello.php
git status 命令会显示以下信息:
- 当前分支的名称。
- 当前分支与远程分支的关系(例如,是否是最新的)。
- 未暂存的修改:显示已修改但尚未使用
git add
添加到暂存区的文件列表。 - 未跟踪的文件:显示尚未纳入版本控制的新文件列表。
根据 git status 的输出,你可以判断当前工作目录中的文件状态,并采取适当的操作。
通常我们使用 -s 参数来获得简短的输出结果:
$ git status -s
AM README
A hello.php
AM 状态的意思是这个文件在我们将它添加到缓存之后又有改动
git commit
git commit 命令将暂存区内容添加到本地仓库中。
提交暂存区到本地仓库中:
git commit -m [message]
[message] 可以是一些备注信息。
提交暂存区的指定文件到仓库区:
$ git commit [file1] [file2] ... -m [message]
-a 参数设置修改文件后不需要执行 git add 命令,直接来提交
$ git commit -a
设置提交代码时的用户信息
开始前我们需要先设置提交的用户信息,包括用户名和邮箱:
$ git config --global user.name 'runoob'
$ git config --global user.email test@runoob.com
如果去掉 –global 参数只对当前仓库有效。
提交修改
接下来我们就可以对 hello.php 的所有改动从暂存区内容添加到本地仓库中。
以下实例,我们使用 -m 选项以在命令行中提供提交注释。
$ git add hello.php
$ git status -s
A README
A hello.php
$ git commit -m '第一次版本提交'
[master (root-commit) d32cf1f] 第一次版本提交
2 files changed, 4 insertions(+)
create mode 100644 README
create mode 100644 hello.php
现在我们已经记录了快照。如果我们再执行 git status:
$ git status
# On branch master
nothing to commit (working directory clean)
以上输出说明我们在最近一次提交之后,没有做任何改动,是一个 “working directory clean”,翻译过来就是干净的工作目录。
如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。屏幕会像这样:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: hello.php
#
~
~
".git/COMMIT_EDITMSG" 9L, 257C
如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下:
git commit -a
我们先修改 hello.php 文件为以下内容:
<?php
echo '菜鸟教程:www.runoob.com';
echo '菜鸟教程:www.runoob.com';
?>
再执行以下命令:
$ git commit -am '修改 hello.php 文件'
[master 71ee2cb] 修改 hello.php 文件
1 file changed, 1 insertion(+)
git pull
git pull 命令用于从远程获取代码并合并本地的版本。
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。
命令格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
实例
更新操作:
$ git pull
$ git pull origin
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin master
上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。
上面的 pull 操作用 fetch 表示为:
以我的 https://github.com/tianqixin/runoob-git-test 为例,远程载入合并本地分支。
$ git remote -v # 查看信息
origin https://github.com/tianqixin/runoob-git-test (fetch)
origin https://github.com/tianqixin/runoob-git-test (push)
$ git pull origin master
From https://github.com/tianqixin/runoob-git-test
* branch master -> FETCH_HEAD
Already up to date.
上面命令表示,取回 origin/master 分支,再与本地的 master 分支合并。
git push
git push 命令用于从将本地的分支版本上传到远程并合并。
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
实例
以下命令将本地的 master 分支推送到 origin 主机的 master 分支。
$ git push origin master
相等于:
$ git push origin master:master
如果本地版本与远程版本有差异,但又要强制推送可以使用 –force 参数:
git push --force origin master
删除主机的分支可以使用 –delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete master
以我的 https://github.com/tianqixin/runoob-git-test 为例,本地添加文件:
$ touch runoob-test.txt # 添加文件
$ git add runoob-test.txt
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 runoob-test.txt
$ git push origin master # 推送到 Github
将本地的 master 分支推送到 origin 主机的 master 分支。
重新回到我们的 Github 仓库,可以看到文件已经提交上来了:
pull request
以实验室网站建设为例,网站源码保存在https://gitee.com/nnsslab/nnsslab.com.git中,该仓库仅有一名管理员,当代码修改后需要上传进行审批,通过之后进行代码更新。需要点击该仓库右上角的Forked按键
图二
Fork 是对一个仓库的克隆。克隆一个仓库允许你自由试验各种改变,而不影响原始的项目。
一般来说,forks 被用于去更改别人的项目(贡献代码给已经开源的项目)或者使用别人的项目作为你自己想法的初始开发点。
提出更改别人的项目
使用 forks 提出改变的一个很好的例子是漏洞修复。与其记录一个你发现的问题,比如:
●Fork 这个仓库
●进行修复
●向这个项目的拥有者提交一个 pull requset
如果这个项目的拥有者认同你的成果,他们可能会将你的修复更新到原始的仓库中!
使用别人的项目作为你自己想法的初始开发点
然后在本地使用git clone命令将Fork的仓库复制克隆到本地,在代码修改完成后,利用git push将修改上传到自己的远端,之后在自己克隆的仓库点击+pull request将自己的修改提交上去。注意每次进行代码修改之前注意先git pull保证版本更新
图三