git介绍
Git是一个分布式的版本控制工具,大家应该对git有概念,之前使用几次git,但有段时间没用了,现在权当笔记 记录下来方便以后温习。
Git最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,
不依赖 于网络和中心服务器。
git工作机理
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异如CVS。Git 并不保存
这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信
息并对文件作一快照,然后保存一个指向这次快照的索引,这是 Git 同其他系统的重要区别。如图
Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串,并将此结果作为数据的唯一标识和索引。
Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
git的所有操作都可以是本地的,仅仅在将新版本的内容上传到服务器上时才需要连接网络。
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged).
已提交表示数据已经安全存储在本地数据库,已修改表示已经修改了文件,但还没有提交到数据库,已暂存表示已经在当前版本标记了一个更改的文件,以便进入
下一次提交的快照(即把已经修改的文件放在下次提交时要保存的清单中)。参看下图:
可见Git管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。
Git directory(Git 的本地数据目录):是Git保存元数据和对象数据库的地方。这也是Git最重要的部分。
working directory(工作目录):是项目某个版本的内容。
staging area(暂存区域):是一个简单的文件,通常包含在Git目录中。其中存储了将要进入下一次提交的信息。
基本的 Git 工作流程如下:
- 在工作目录(working directory)中修改某些文件。
- 对修改后的文件进行快照,然后保存到暂存区域(staging area)。
- 提交更新(commit),将保存在暂存区域(staging area)的文件快照永久转储到 Git 目录中。
我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;
如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
一张描述git数据迁移的示意图,很清晰,对于理解git的命令很有帮助.
git使用简单举例:
1,创建项目 在github 用户名旁边有一个 create a new repo 的小图标,假设新建项目名为project。
2,创建本地新项目 并提交
$ mkdir project//创建推送目录
$ cd project //进入推送目录
$ git init //设置该目录为推送
$ touch README //生成readme
$ git add README //加入修改列表
$ git commit -m 'first commit' //递交修改声明
$ git remote add origin git@github.com:username/project.git //为远程Git更名为origin, origin 在这里就是git@github.com:username/project.git的一个别名
// git remote add origin 若出现错误 fatal:remote origin already exists 则可以通过命令git remote rm origin删除 已存在的origin。
$ git push -u origin master //推送此次修改 本地和远程合并,本地默认分支为master
git操作常见错误
1,git push代码时提示"Permission denied (publickey)"
提交项目到github 当输入 git push origin master 时出现如下错误:
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
解决方法:
这个错误说明 需要我们设置一个 ssh key
stackoverflow上找到了解决方法,点这里, 或者到官网 也有 Generating SSH Keys的教程,点这里。
2, git push出现 Repository not found.
ERROR: Repository not found.
fatal: The remote end hung up unexpectedly
个问题是因为在你推送的github账户中,并没有这个Repository。
解决方法:
检查自己的github中的Repository,检查自己创建的目录,必须要两者一致(如果没有项目 则需要创建项目 在用户名旁边有一个 create a new repo 的小图标);
或者先git clone下github中的Repository,然后再进行更改,这样就一定一致了。
3,好吧上面的问题解决了又出现问题
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ...
通过错误提示:your current branch is behind its remote counterpart. merge th remote changes(e.g. ‘git pull’).
可知原因在于:git仓库中已经有一部分代码,所以它不允许你直接把你的代码覆盖上去。
解决方法:
有2个选择方式:
A,git pull
先把git的东西fetch到你本地然后merge后再push。
git fetch
git merge
这2句命令等价于
git pull (' 如git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝)
但是在 使用命令 pull之前需要指定branch与merge可以通过修改 .git/config文件中的下列内容:
[branch "master"]
remote = origin
merge = refs/heads/master
也可以直接命令行修改
git config branch.master.remote origin
git config branch.master.merge ref/heads/master
上面config修改后,键入命令 git pull origin master, 然后执行 git add,git commit, git push命令即可把需要新增的文件添加到github.
B,强制推送(不建议使用,会覆盖remote的内容)
使用命令 git push -f 即可。
4, push的时候出现如下错误:
fatal: remote error:
You can't push to git://github.com/user_name/user_repo.git
Use git@github.com:user_name/user_repo.git
解决方法:
注意提示,You can't push to git://github.com/user_name/user_repo.git
如果在git clone的时 用的是git://github.com:xx/xxx.git的形式, 那么就会出现这个问题,因为这个protocol(git://)是不支持push的.
所以clone使用这种形式 :git clone git@github.com:user_name/user_repo.git.(然后git remote rm origin,git remote add ....)
统计一下搜到的资料:
怎样使用 GitHub ?http://www.zhihu.com/question/20070065
写给Git初学者的7个建议 http://www.open-open.com/news/view/b7227e
Git使用基础篇 http://www.open-open.com/lib/view/open1332904495999.html
Ubuntu 使用Git 使用举例 http://www.cnblogs.com/yourihua/archive/2012/07/07/2580147.html
Pro Git 不错的中文网站 http://iissnan.com/progit/html/zh/ch1_0.html
参考:
http://iissnan.com/progit/html/zh/ch1_0.html
http://blog.csdn.net/chain2012/article/details/7476493