A. Github常见操作和常见错误!
一、如果输入$ git remote add origin [email protected] :djqiang(github帐号名)/gitdemo(项目名).git
解决办法如下:
1、先输入$ git remote rm origin
2、再输入$ git remote add origin [email protected] :djqiang/gitdemo.git 就不会报错了!
3、如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section 'remote.origin'. 我们需要修改gitconfig文件的内容
4、找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_\etc
5、找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行删掉就好了!
二、如果输入$ ssh -T [email protected] 出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
1、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。
2、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。
3、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
三、如果输入$ git push origin master 提示出错信息:error:failed to push som refs to .......
解决办法如下:
1、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
2、再输入$ git push origin master
3、如果出现报错 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository. 4、则需要重新输入$ git remote add origin [email protected] :djqiang/gitdemo.git
四、使用git在本地创建一个项目的过程
$ makdir ~/hello-world //创建一个项目hello-world
$ cd ~/hello-world //打开这个项目
$ git init //初始化
$ touch README
$ git add README //更新README文件
$ git commit -m 'first commit' //提交更新,并注释信息“first commit”
$ git remote add origin [email protected] :defnngj/hello-world.git //连接远程github项目
$ git push -u origin master //将本地项目更新到github项目上去
五、gitconfig配置文件
Git有一个工具被称为git config,它允许你获得和设置配置变量;
这些变量可以控制Git的外观和操作的各个方面。
这些变量可以被存储在三个不同的位置:
1./etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’--system’ 给 git config,它将明确的读和写这个文件。
2.~/.gitconfig 文件 :具体到你的用户。你可以通过传递--global 选项使Git 读或写这个特定的文件。
3.位于git目录的config文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。因此,在.git/config中的值覆盖了在/etc/gitconfig中的同一个值。 在Windows系统中,Git在$HOME目录中查找.gitconfig文件(对大多数人来说,位于C:\Documents and Settings$USER下)。它也会查找/etc/gitconfig,尽管它是相对于Msys 根目录的。这可能是你在Windows中运行安装程序时决定安装Git的任何地方。
4.1当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:$ git config --global user.name "John Doe"$ git config --global user.email [email protected]
4.2 你的编辑器(Your Editor)现在,你的标识已经设置,你可以配置你的缺省文本编辑器,Git在需要你输入一些消息时会使用该文本编辑器。缺省情况下,Git使用你的系统的缺省编辑器,这通常可能是vi 或者 vim。如果你想使用一个不同的文本编辑器,例如Emacs,你可以做如下操作:$ git config --global core.editor emacs
4.3 检查你的设置(Checking Your Settings)如果你想检查你的设置,你可以使用 git config --list 命令来列出Git可以在该处找到的所有的设置:$ git config --list 你也可以查看Git认为的一个特定的关键字目前的值,使用如下命令 git config {key}:$ git config user.name
4.4 获取帮助(Getting help)如果当你在使用Git时需要帮助,有三种方法可以获得任何git命令的手册页(manpage)帮助信息:$ git help <verb>$ git <verb> --help$ man git-<verb>例如,你可以运行如下命令获取对config命令的手册页帮助:$ git help config
六、push到github时,每次都要输入用户名和密码的问题
在github.com上 建立了一个小项目,可是在每次push 的时候,都要输入用户名和密码,很是麻烦 原因是使用了https方式 push 在termail里边 输入 git remote -v 可以看到形如一下的返回结果
origin https://github.com/dengVictor/learngit.git (fetch)
origin https://github.com/dengVictor/learngit.git (push)
下面把它换成ssh方式的。
七、常用命令
假如你现在新创建了一个项目,想把它提交到github上面? 假设你创建好了一个项目,并切换到项目的根目录下面:
$ git status //查看当前项目下所有文的状态,如果第一次,你会发现都红颜色的,因为它还没有交给git/github管理。
$ git add . //(.)点表示当前目录下的所有内容,交给git管理,也就是提交到了git的本地仓库。 Ps:git的强大之处就是有一个本地仓库的概念,在没有网络的情况下可以先将更新的内容提交到本地仓库。
$ git commit –m”discription ” //对你更新或修改了哪些内容做一个描述。
$ git remote add origin [email protected] :xiahouzuoxin/zx-libsvm.git // 如果你是第一次提交项目,这一句非常重要,这是你本地的当前的项目与远程的哪个仓库建立连接。 Ps: origin可以改为别人的名字,但是在你下一次push(提交)时,也要用你修改之后的名字。
$ git remote -v //查看你当前项目远程连接的是哪个仓库地址。
$ git push -u origin master //将本地的项目提交到远程仓库中。 ------------------------------------------------------------ 假如,你回到了家,想把公司提交的项目克隆到本地? 如果你是第一次想把github上面的项目克隆到本地或者要克隆别人的项目到地。
$ git clone [email protected] :xiahouzuoxin/zx-libsvm.git //在git下面切换到想存放此项目的文件目录下,运行这条命令就可以将项目克隆下来。
假如本地已经存在了这个项目,而仓库中又有一新的更新,如何把更的合并到本地的项目中?
$ git fetch origin //取得远程更新,这里可以看做是准备要取了
$ git merge origin/master //把更新的内容合并到本地分支/master ------------------------------------------- 项目中删除了一些文件,如何提交? 假如远程仓库中已经存了aaa这个文件,我fetch了下来,并删除了aaa这个文件,想再push上到远程仓库中,并使远程仓库中的项目被新的修改覆盖(也就是远程仓库中 的aaa也被删除)
$ git status //可以看到我们删除的哪些文件
$ git add . //删除之后的文件提交git管理。
$ git rm src/com/hzh/hibernate//aaa.java //移除我们删除的那个文件,不然git不允许我们往远程仓库提交。 Ps: 如果你想删除的是某个目录(java包),这里想移除整个目录的内容。
$ git rm src/com/hzh/hibernate/bbb/ -r // -r 会把bbb/目录下的所有内容一次性移动。 ------------------------------------------------------------------------ 远程创建了一个新仓库,本地创建了一个新项目,如何使新的项目与仓库对应起来? 其实,这个也很简单,只是我当时对那些命令不太理解,所以比较模糊,不知如何对应。
$ git remote add origin [email protected] :xiahouzuoxin/zx-libsvm.git //还是这个命令,在你push项目之前加上这一句就OK了。 [email protected] :xiahouzuoxin/zx-libsvm.git 就是你常见的新仓库的地址啊。git切换到新项目下,在push之前,加上这一句,我们创建的新仓库就与新项目建立了连接。
B. 如何在github上搭建自己的博客
1.建立一个项目
先在GitHub创建一个项目,名字随意,尽量全部小写字母,避免随后会碰到的URL冲突问题。
1.1 在自己github右上角上,点击+号按钮,在出现的菜单中选择 New repository
1.2 进入到创建仓库页面,给仓库命名并给于描述之后,点击create repository按钮创建仓库
项目创建完毕。
2.安装Git
git是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。
git的安装地址(http://msysgit.github.io/)
关于git的具体安装步骤可参考http://jingyan..com/article/90895e0fb3495f64ed6b0b50.html
关于git的常用命令可参考http://www.bootcss.com/p/git-guide/
3.clone项目
本地运行Git,随意选个目录,将刚才创建的项目clone下来。
例:
cd /e/blog
git clone https://github.com/stxwd46/EX.github-io.git
cd EX.github-io
4.建立配置文件_config.yml
注意:之后建立的所有文档务必使用UTF-8 无 BOM(隐藏字符) 的编码保存
在项目的根目录下打开git命令行界面,输入命令 >> _config.yml 新建文件 _config.yml ,填写 baseurl: /blogdemo , blogdemo是你的项目名称,这一行内容规定了整个网站的根路径。
例:
baseurl: /EX.github-io
目录结构变为
/EX.github-io
|--_config.yml
5.建立主页
在根目录下新建文件 index.html , 内容如下:
---
title: Hello, My Blog
---
{{ page.title }}
每篇文章的头部,必须有一个yaml文件头,用来设置一些元数据。它用三根短划线"---",标记开始和结束,里面每一行设置一种元数据。"title: Hello, My Blog",表示该文章的标题是"Hello, My Blog",如果不设置这个值,默认使用嵌入文件名的标题,即"hello world"。
在yaml文件头后面,就是文章的正式内容,{{}}这些是Liquid模板语言,在{{}}里面我们可以使用模板变量。{{ page.title }} 表示“本页面的标题”,因为我们前面设置了title为Hello, My Blog。所以到时候进入到博客首页,title 就会显示相应的文案。
目录结构变成:
/EX.github-io
|--_config.yml
|-- index.html
6.在_posts内撰写文章,并在首页加入文章列表
现在首页有了,那我们怎么发博文上去呢?
回到项目根目录, 打开git bash,运行 mkdir _posts 新建一个目录,看名字也知道啦,这里存放你所有的文章。
进入_posts目录,新建一篇文章。注意默认的文件名格式是 year-month-day-postTitle 这样。比如 2015-05-05-my_first_article.md,尽量避免空格或者其他乱七八糟的字符,这个文件名将作为URL的生成依据。文件名的格式可以通过修改 _config.yml中的 permalink 属性而改变,默认值为 date ,也就是我们刚刚创建的文件的样子,具体的规则可以看这里。
如果你发现了我刚才创建的文件后缀名是 .md ,熟悉GitHub或者StackOverFlow的朋友应该知道Markdown 格式。对于不熟悉前端的人来说,用markdown可以避开HTML,转而使用更加直观的Markdown语法。如果不熟悉Markdown语法也没关系,可以参见这份Markdown 语法说明,应该说是相当易学,并且在熟悉之后非常易用的。而作为一个前端开发者来讲,我还是更倾向于用html。
回到主题,打开刚才创建的文件,输入如下内容:
---
title: 我的第一篇文章
---
# {{ page.title }}
## 目录
+ [第一部分](#partI)
+ [第二部分](#partII)
+ [第三部分](#partIII)
----------------------------------
## 第一部分
这里是第一部分的内容
----------------------------------
## 第二部分
这里是第二部分的内容
----------------------------------
## 第三部分
这里是第三部分的内容
{{ page.date|date_to_string }}
这段内容中使用了最常用的几种Markdown语法,比如使用 # ,## 表示 HTML 中的 <h1></h1> , <h2></h2>。使用[text](link)创建超链接,使用 连续多个 - 创建水平线(注意:不包括最上端包围title所使用的横线,那里表示一个页面的“头属性”),等等。更多详细的语法可以在之前提到的页面查询,这里不再赘述,总之,这是一种更加贴近真实写作的语法,推荐大家尝试。
页面最后面的那个 {{ page.date|date_to_string }} 是指显示本页的日期属性,并且转换为可读的字符串形式。同样也是Liquid语法。
OK,第一篇文章就写好了,然后到主页给文章加上入口链接。
打开我们的 index.html 文件,添加内容,变成下面这样:
---
title: My Blog
---
{{ page.title }}
{% for post in site.posts %}
{{ post.date|date_to_string }} <a href='{{ site.baseurl }}{{ post.url }}'>{{ post.title }}</a>
{% endfor %}
简单解释一下,Liquid标记最主要分为两种,一种是直接输出变量内容,像这样:
{{ page.title }}
另一种则是逻辑命令形式的,像这样:
{% for x in y %} ... {% endfor %}
而刚才写进主页的内容,就是遍历所有post文件,然后逐一显示在页面上,这里需要注意的一点就是在创建文章的超链接时,除了 post.url 之外,也要注意在前面加上site.url ,原因前面也有提到过,我们正在创建的是 Project Pages 类型的网站,其最终生成的网址根目录是:username.github.com/projectname,而 post.url 生成的超链接仅仅会自动加上 username.github.com/ 这样的前缀。
现在检查一下更改的所有内容,确认不要犯下愚蠢的错误,比如把 “.” 打成 “。“或者单词拼错之类的。
目录结构变为
/EX.github-io
|--_config.yml
|-- index.html
|-- _posts
| |--2015-05-05-my_first_article.md
7.配置SSH keys
为什么要配置ssh keys?因为github和本地代码做推送和拉取时,需要用到ssh的密钥对进行数据加解密,由于github上新建的项目没有添加密钥,所以本地仓库连接不到远程仓库。
那么如何配置ssh keys呢?
7.1 我们需要检查你电脑上现有的ssh key:
cd ~/.ssh
如果提示:No such file or directory 说明你是第一次使用git。
7.2 生成新的ssh keys:
ssh-keygen -t rsa -C "邮件地址@youremail.com"
注意1: 此处的邮箱地址,你可以输入自己的邮箱地址;注意2: 此处的“-C”的是大写的“C”。
按回车后出现
再按一次回车即可。
然后系统会要你输入密码:
Enter passphrase (empty for no passphrase):<输入加密串>
Enter same passphrase again:<再次输入加密串>
在回车中会提示你输入一个密码,这个密码会在你提交项目时使用,如果为空的话提交项目时则不用输入。这个设置是防止别人往你的项目里提交内容。
注意:输入密码的时候没有*字样的,你直接输入就可以了。
最后看到这样的界面,就成功设置ssh key了:
7.3 添加ssh key到GitHub
在本机设置SSH Key之后,需要添加到GitHub上,以完成SSH链接的设置。
1、打开本地C:\Documents and Settings\Administrator.ssh\id_rsa.pub文件。此文件里面内容为刚才生成人密钥。如果看不到这个文件,你需要设置显示隐藏文件。准确的复制这个文件的内容,才能保证设置的成功。
2、登录你的GitHub个人主页。点击右上角的 Settings进入设置页面,然后点击SSH Keys页面中的Add SSH key按钮
3、把你本地生成的密钥复制到里面(key文本框中), 点击 add key 就ok了
8.发布到GitHub
这个时候我们就可以把页面提交到github上了,到根目录打开git命令行界面
8.1 把刚创建的所有文件添加到本地git库
git add -A
8.2 保持良好的习惯,每次提交都提交添加描述
git commit -m "create my blog"
8.3 推送到GitHub,这里注意,因为我们使用的是GitHub Pages中的 Project Pages,GitHub规定,只有该分支中的页面,才会生成网页文件。即GitHub仅会将分支 gh-pages 下的内容进行自动生成操作, 所以本地的 master 分支应推送到远端的 gh-pages 分支
git push origin master:gh-pages
输入账号和密码,账号即你的GitHub账号(不是昵称,是账号名!),输入密码的时候命令行界面不会有任何的变化,所以在输入密码的时候要谨慎小心。之后按回车即可。
好了,那现在我们要如何查看我们的博客页面呢。打开GitHub,进入到自己博客的仓库,右侧菜单栏有一个setting选项
点击进入之后会看到这个页面
GitHub Pages中显示的链接就是你的博客地址啦。
9.增加模板套装_layouts
其实到第8步博客的构建就已经完成了,只是没有样式的博客实在太难看。GitHub Pages有提供一些主题给我们使用。但作为一个前端开发者,肯定更希望自己给自己的博客布局和创建样式。
回到项目根目录,新建文件夹 _layouts,顾名思义,“布局”是也。在 _layouts 中新建一个最基本的布局文件,姑且命名为default.html好了:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>{{ page.title }}</title>
</head>
<body>
{{ content }}
</body>
</html>
首先,charset=utf-8让我们一劳永逸地解决了UTF-8的编码问题,随后指定了正文内容的位置,当然在这里只是一个最简单的内容,在body内仅有一个 {{ content }} 标签,你可以根据自己的喜好对页面进行任何改动,只要记得保留这个内容标签在你想要的位置就好。
然后我们修改index.html和刚写完的那篇文章,只要在头属性上加一句就好:
---
title: xxoo
layout: default.html
---
我们当然还可以把这个结构变得更灵活一些,比如继续新增两个模板分别叫做l_post.html与l_index.html,他们首先引用default.html,但在其基础上做出一定的修改。然后首页使用l_index模板,而所有的post文件则使用l_post模板,等等等等,请随意发挥。但始终记得加上 {{ content }} 标签
目录结构变为
/EX.github-io
|--_config.yml
|-- index.html
|-- _posts
| |--2015-05-05-my_first_article.md
|-- _layouts
| |--default.html
再次推送到GitHub即可。
这样,我们就已经构建好了一个最简单的blog。之后你们就可以开始为自己的博客添砖加瓦了。
10.问题汇总
10.1 推送到GitHub之后个人主页的contributions没有提交记录
Git会根据用户的名字和邮箱来记录提交。GitHub也是用这些信息来做权限的处理,输入下面的代码进行个人信息的设置,把名称和邮箱替换成你自己的。
如何查看自己的名称和邮箱呢。回到GitHub个人主页,点击右上角的setting图标
进入之后Personal settings菜单栏下的Profile页面中,Name即为你的名字
但邮箱不是Name下面的Public email,很多人在这里被误导了。邮箱是Emails页面中的邮箱地址
知道了名字和邮箱之后,打开git命令行界面,通过下面的命令行来设置你的名字和邮箱
git config --global user.name "cnfeat"//用户名
git config --global user.email "[email protected]"//填写自己的邮箱
设置正确之后,提交记录就都恢复了。不仅仅你以后提交的都会出现在提交记录中,你以前提交的也会恢复并出现在记录中。
10.2 每次提交都要求你输入账号跟密码
原因是我们在clone分支时使用了 HTTPS 的地址,
HTTPS 的地址是做什么用的呢?其实它主要是用在一些防火墙或者代理服务器设置比较严格的情况下的,比如有些公司是禁止使用 SSH 连接外网,那么在这种情况下要想使用 Git 的话,就只能用 HTTPS 的方式了。
使用 HTTPS 的方式,也有储存密码的方式,但我们首推的方式是切换到 SSH,如果你的网络环境支持的话。
回到你博客的根目录。打开git命令行界面,输入
git remote set-url 你博客的ssh url
如果你不知道你博客的ssh url,打开你的博客项目,右下角选择SSH,然后复制框里的url就行了
之后再提交就不会要求你输入账号密码了。
10.3 页面调试不方便
如果我们要给我们的博客布局或设置样式神马的,我们是否每次都要把代码写好然后推送到GitHub上,再打开自己的博客地址,看看布局有没有什么问题。如果有的话再改代码,再提交,再查看呢?
C. Git 中 6 个基本常用命令
大家好啊,我是大田。
想更深刻了解 Git 常用命令,先来看看原理图:
我们使用 Git 操作的核心步骤就是:
先add代码到git缓存
然后commit到git本地仓库
最后push到远程Github代码仓库
备注:
workspace:当前工作区,需要经过 add、commit、push 才能上传到远程仓库
index:缓存区,标仔镇记你本地的哪些内容是被 git 管理的
repository:本地仓库,保存各个版本的提交
remote:远程仓库
1、克隆远程项目到本地
git clone url
2、克隆后,创建新分支,名字叫 dev
git checkout -b dev
3、加到缓存区
1)git add .:添加所有项目至缓存区
2)git add 目录名:添加指定目录腔陆到缓存区
3)git add 文件名:添加指定文件到缓存区
4、提交至本地仓库
git commit -m "注释信息"
5、推送本地仓库信息至远程仓库
git push origin master:将本地分支的更新内容,全部推送至远程仓库 master 分支
git push origin dev:将本地 dev 分支推送到远程,再由一个人统一加到 master 分念圆粗支上
6、拉取远程仓库最新文件
git pull:拉取远程仓库所有分支合并到本地
git pull origin master:拉取远程master分支,合并到当前本地master分支
git fetch:仅做拉取操作,不做合并,合并需要自己再找其他方法
备注:一般都用 git pull
D. Git常用命令
1.1 配置环境
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。该用户信息和GitHub上注册的远程仓库的相关信息没有任何关系。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --list
配置信息保存在用户目录下的.giitconfig文件中
1.2 获取Git仓库
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库
获取Git仓库通常有两种方式:
执行步骤如下:
1、在电脑的任意位置创建一个空目录作为我们的本地Git仓库
2、进入这个目录中,点击右键打开Git bash 窗口
3、执行命令git init
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地的命令形式为:
git clone 远程Git仓库地址
1.3 工作目录、暂存区以及版本库概念
版本库:.git隐藏文件就是版本库,版本库存储了很多配置信息、日志信息和文件版本信息等
工作目录(工作区):包含.git文件夹的目录就是工作目录,主要用于存放开发的代码
暂存区:.git文件夹中有很多文件,其中一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
1.4 Git工作目录下文件的两种状态
Git工作目录下的文件存在两种状态:
Unmodified 未修改状态
Modified 已修改状态
Staged 已暂存状态
这些文件的状态会随着我们执行Git的命令发生变化
1.5 本地仓库操作
git status 查看文件状态
也可以使用git status -s使输出信息更简洁
git add 将未跟踪的文件加入暂存区,将已经修改的文件加入暂存区也是通过这个命令
git reset 将暂存区文件取消暂存
git commit -m “你的说明” 将暂存区文件提交到本地仓库
git rm 删除文件 说明:这种操作是直接将文件加入到暂存区里面,直接提交到本地仓库生效,而直接删除的话没有进入到暂存区,需要先把文件加入到暂存区之后,再提交到本地仓库。
将文件添加至忽略列表
一般我们总会有些文件无需纳入Git的管理,也不希望他们总出现在未跟踪文件列表。通常这些都是自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitnore的文件(文件名称固定),列出忽略的文件模式。下面是一个示例:#代表注释
由于windows无法创建不含文件名的文件,因此我们需要在bash窗口中用如下命令创建。
git log 查看日记记录
1.6 远程仓库操作
如果想查看已经配置的远程仓库服务器,可以运行git remote 命令。它会列出指定的每一个远程服务器的简写。如果已经克隆了远程仓库,那么至少可以看见origin,这是Git克隆的仓库服务器的默认名字
git remote -v 可以查看对远程仓库详细一点的说明
git remote show origin 可以查看对origin更详细的远程仓库的说明
运行git remote add 添加一个远程Git仓库,同时指定一个可以引用的简写
如果你想获得一份已经存在了的Git仓库的拷贝,这时需要用到 git clone 命令。Git克隆的是Git仓库服务器上的几乎所有数据(包括日志信息、 历史 记录等),而不仅仅是复制工作所需要的文件。当你执行git clone 命令的时候,默认配置下Git仓库中的每一个文件的每一个版本都将被拉取下来。
如果因为一些原因想要移除一个远程仓库,可以使用git remote rm
注意:此命令只是从本地移除远程仓库的记录,并不会影响到远程仓库
git fetch 是从远程仓库获取最新版本到本地仓库,不会自动merge
说明:如果使用fetch命令,拉取的文件会放到版本库里面,不会自动整合到工作区,如果需要整合到工作区,需要使用 git merge 远程仓库别名/远程仓库分支
git pull 是从远程仓库获取最新版本并merge到本地仓库
注意:如果本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库中拉取文件的时候会报错(fatal:refusing to merge unrelated histories),解决此我呢提可以在git pull 命令后加入参数 --allow-unrelated-histories
git push
1.7 Git分支
几乎所有的版本控制系统都是以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的master是一个特殊分支。它跟其它分支没有区别。之所以每一个仓库都有mater分支,是因为git init默认创建它,并且大多数人都懒得去改动它。
# 列出所有本地分支
$ git branch
#列出所有远程分支
$ git branch -r
#列出所有本地分支和远程分支
$git branch -a
git branch 分支名称
git checkout 分支名称
git push 远程仓库别名 远程仓库分支
git merge 分支名称 说明:在当前分支下合并其他分支
注意:如果两个分支存在同样的文件名且同行的内容不一样,那么会产生矛盾,需要自己手动修改产生矛盾后的文件,然后添加到暂存区然后提交。
git branch -d 分支名称
如果要删除的分支中进行了一些开发动作,此时执行上面的删除命令并不会删除分支,可以将命令中的-d参数改为-D
如果要删除远程仓库中的分支,可以使用命令git push origin -d branchName
1.8 Git标签
像其他版本控制系统一样,Git可以给 历史 中的某一给提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点(v1.0、v1.2等)。标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便地切换到标记时的状态。
#新建一个tag
$ git tag [tagName]
$ git tag
#新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
#删除本地tag
$git tag -d[tag]
#删除远程tag
$git push origin :refs/tags/[tag]
E. git mv命令如何使用
git 命令 (gnu interactive tools)
功能说明:文字模式下的文件管理员。
语 法:git 命令
补充说明:git命令是用来管理文件的程序,它十分类似DOS下的Norton Commander,具有互动式操作界面。它的操作方法和Norton Commander几乎一样,略诉如下:
F1 :执行info指令,查询指令相关信息,会要求您输入欲查询的名称。
F2 :执行cat指令,列出文件内容。
F3 :执行gitview指令,观看文件内容。
F4 :执行vi指令,编辑文件内容。
F5 :执行cp指令,复制文件或目录,会要求您输入目标文件或目录。
F6 :执行mv指令,移动文件或目录,或是更改其名称,会要求您输入目标文件或目录。
F7 :执行mkdir指令,建立目录。
F8 :执行rm指令,删除文件或目录。
F9 :执行make指令,批处理执行指令或编译程序时,会要求您输入相关命令。
F10 :离开git文件管理员。
----------------- Git命令具体使用-------------------------------
Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版本控制工具可以对开发产生如此之多的影响,文章分为两部分:
第一部分,介绍Git的一些常用命令,其中穿插介绍Git的基本概念和原理
第二部分,重点介绍Git的使用技巧,最后会在Git Hub上创建一个开源项目开启你的Git实战之旅
Git是什么
Git 在Wikipedia上的定义:它是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。
Git 最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络和中心服务器。
Git 的出现减轻了许多开发者和开源项目对于管理分支代码的压力,由于对分支的良好控制,更鼓励开发者对自己感兴趣的项目做出贡献。其实许多开源项目包括 Linux kernel、Samba、X.org Server、Ruby on Rails,都已经过渡到使用Git作为自己的版本控制工具。对于我们这些喜欢写代码的开发者嘛,有两点最大的好处,我们可以在任何地点(在上班的地铁 上)提交自己的代码和查看代码版本;我们可以开许许多多个分支来实践我们的想法,而合并这些分支的开销几乎可以忽略不计。
Git 1+1
现在进入本篇文章真正的主题,介绍一下Git的基本命令和操作,会从Git的版本库的初始化,基本操作和独有的常用命令三部分着手,让大家能够开始使用Git。
Git 通常有两种方式来进行初始化:
git clone: 这是较为简单的一种初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份
例如:git clone git://github.com/someone/some_project.git some_project
上面的命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版本库完全克隆到本地some_project目录下面
git init和git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用'git init'命令进行初始化,Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把 可访问的URL记录下来,此时你就可以利用'git remote add'命令来增加一个远程服务器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就会增加URL地址为'git: //github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可
Git 的基本命令
现在我们有了本地和远程的版本库,让我们来试着用用Git的基本命令:
git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update
git add:是 将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'git add app/model/user.rb'就会增加app/model/user.rb文件到Git的索引中,该功能类似于SVN的add
git rm:从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb',该功能类似于SVN的rm、del
git commit:提交当前工作空间的修改内容,类似于SVN的commit命令,例如'git commit -m story #3, add user model',提交的时候必须用-m来输入一条提交信息,该功能类似于SVN的commit
git push:将本地commit的代码更新到远程版本库中,例如'git push origin'就会将本地的代码更新到名为orgin的远程版本库中
git log:查看历史日志,该功能类似于SVN的log
git revert:还原一个版本的修改,必须提供一个具体的Git版本号,例如'git revert ',Git的版本号都是生成的一个哈希值
上面的命令几乎都是每个版本控制工具所公有的,下面就开始尝试一下Git独有的一些命令:
git branch:对分支的增、删、查等操作,例如'git branch new_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'git branch -D new_branch'就会强制删除叫做new_branch的分支,'git branch'就会列出本地所有的分支
git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如'git checkout new_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如'git checkout app/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
git rebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能
git reset:将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C的版本号是 ,我们执行了'git reset '那么结果就只剩下了A-C三个提交的版本
git stash:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解
git config:利用这个命令可以新增、更改Git的各种设置,例如'git config branch.master.remote origin'就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的 Git
git tag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用'git tag revert_version '来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了
Git 之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。Git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹,会有如下这样的目录结构:
有 几个比较重要的文件和目录需要解释一下:HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息,那么 HEAD就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、 remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令'git show-ref'更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,Git只需要代码根目录下的这一个.git目录就可以记录完 整的版本控制信息,而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧
Git与SVN的不同
SVN(Subversion)是当前使用最多的版本控制工具。与它相比较,Git 最大的优势在于两点:易于本地增加分支和分布式的特性。
下面两幅图可以形象的展示Git与SVN的不同之处
------------
对 于易于本地增加分支,图中Git本地和服务器端结构都很灵活,所有版本都存储在一个目录中,你只需要进行分支的切换即可达到在某个分支工作的效果。而 SVN则完全不同,如果你需要在本地试验一些自己的代码,只能本地维护多个不同的拷贝,每个拷贝对应一个SVN服务器地址。举一个实际的例子,以前我所在 的小组使用SVN作为版本控制工具,当我正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交代 码。这时候上级对我说,现在有一个很紧急的Bug需要处理, 必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文 件,然后回滚有关当前任务的所有代码,再开始修改Bug的任务,等到修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码 发生冲突所要进行的工作量。可是如果使用Git, 我们只需要开一个分支或者转回到主分支上,就可以随时开始Bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每 一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。
分布式对于Git而言,你可以本地提交代码,所以在上面的图 中,Git有利于将一个大任务分解,进行本地的多次提交,而SVN只能在本地进行大量的一次性更改,导致将来合并到主干上造成巨大的风险。Git的代码日 志是在本地的,可以随时查看。SVN的日志在服务器上的,每次查看日志需要先从服务器上下载下来。我工作的小组,代码服务器在美国,每次查看小组几年前所 做的工作时,日志下载就需要十分钟,这不能不说是一个痛苦。后来我们迁移到Git上,利用Git日志在本地的特性,我用Ruby编写了一个Rake脚本, 可以查看某个具体任务的所有代码历史,每次只需要几秒钟,大大方便我的工作。当然分布式并不是说用了Git就不需要一个代码中心服务器,如果你工作在一个 团队里,还是需要一个服务器来保存所有的代码的。
总结
本篇介绍了Git的基本概念、一些常用命令和原理,大家可以尝试动手体会一下,下一篇会重点介绍Git命令的使用技巧,Git附带的工具,最后会在Git Hub上创建一个开源项目,敬请期待
F. 新手该如何使用GitHub
建议到git的官网看教程,官网的Documentaion有一个中文翻译版的电子书籍,内容很详细。如果愿意系统学习推荐看官网的这本书。
当然安装一个git软件是必须的,软件安装完成后,使用git config命令配置你所要推送仓库的用户名和Email,这是为了远程仓库区分人员用的。
其实对于新手个人开发者来说,git中常用的就几个命令:
首先,在工程目录中执行git init命令。
接着,git add命令 将你要跟踪的文件添加到跟踪索引中
第三,使用git remote add 命令添加远程仓库(这里需要先在github上新建一个仓库,其实新建完毕后,github网站会有个简单提示教你如何推送。建议使用https方式,简单方便。)
第四,使用git commit -m "提交信息" 命令将你跟踪的文件提交到本地仓库
到这里,其实已经可以满足日常开发使用了,在开发过程中重复git add、git commit这两个命令,就可以在本地建立一个版本库,随时可以从本地恢复到开发过程中的某个时刻。当然,如果需要在多个主机上协同开发,或者只是为了做个备份,那就将本地仓库数据推送到远程服务器。也就是第三步添加的远程仓库。
将本地仓库推送到远程服务器的命令是git push -u 。
这样你就完成了一个基础的git仓库配置建立推送的过程。