git 是一种分布式版本控制系统, Distributed Version Control System.
linux 内核开源项目有众多的参与者,2002年, 整个项目组开始启用分布式版本控制系统BitKeeper 来管理和维护代码,到了2005年,开发BitKeeper的公司同Linux内核开源社区的合作关系结束, 收回了免费使用BitKeeper的权利,这就迫使linux开源社区(尤其是linus Torvalds)不得不开发一套属于自己的版本控制系统,这就是Git。Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差差异。Git并不保存这些前后变化的差异数据,而更像是把变化的文件作快照后,记录在一个微型的文件系统中,每次提交更新,它会纵览一遍所有文件的指纹信息并对文件做一快照,然后保存一个指向这次快照的索引。Git更像是一个小型的文件系统。
Git在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。如果要看当前版本文件和一个月前的版本直接有何差异,Git会取出一个月前的快照和当前文件做一次差异运算。
保存到Git之前,所有数据都要进行内容的checksum计算,并将此结果作为数据的唯一标志和索引。Git使用SHA-1算法计算checksum,通过对文件的内容或目录结构计算出一个SHA-1哈希值,作为指纹字符串,由40个十六进制字符组成,看起来就像:24b9da6552252987aa493b52f8696cd6d3b00373.所有保存在git仓库中的东西都是用此哈希值作为索引,而不是靠文件名。
对于任何一个文件,Git内都只有三种状态:committed(该文件已经被安全的保存在本地仓库中), modified(文件被修改了, 但还没有被加入到下次提交保存的清单中), staged(已修改的文件已经放在了下次将要提交保存的清单中)。所以文件流转在三个区域中:1, 工作目录(对应modified)。2,暂存区域(对应staged)。3, 本地仓库(对应committed)。
所以,Git的基本工作流程为:1,在工作目录中修改某些文件。2, 对修改后的文件进行快照,然后保存到暂存区域。3, 提交更新,将保存在暂存区域的文件快照永久存储到本地仓库中(repository)。
git配置文件分三种级别。1,system 系统级别,安装目录下的ect/gitconfig配置文件。2, golbal 用户级别,在用户家目录下.gitconfig文件。 3, 项目级别,在项目文件夹下的.git/config。
我自己的一个项目的配置文件如下:
[core]
repositoryformatversion = 0
filemode = true
bare
= false
logallrefupdates = true
[remote "origin"]
fetch =
+refs/heads/*:refs/remotes/origin/*
url = git@github.com:freemao/call_snp_pipeline.git
#这是本项目在github上的仓库地址
[branch "master"]
remote = origin
merge =
refs/heads/master
我的家目录下,用户级别的配置文件如下:
[user]
name = freemao #定义用户名
name = 393099545@qq.com
#定义邮箱
[credential]
helper = cache
[core]
editor = vim
#使用的编辑器
[alias]
ci = commit -a
co = checkout
ls = ls-files
rm = rm
--cached
st = status
outgoing = log origin/master..
logy = log --since=‘2 days ago‘
logw = log --since=‘1 week
ago‘
unadd = reset HEAD
[apply]
whitespace = strip
[diff]
color = auto
renames = true
[pager]
color = true
[status]
color = auto
[color]
diff = auto
status = auto
branch = auto
ui = auto
[crential]
helper = cache
下面具体讲解git的常用命令:
1,git init
假如你要在一个文件夹下写一个程序,即在一个文件夹下完成一个项目。这个目录就是你的工作目录。如果要用git来管理你写的代码的话,首先要在该文件下进行初始化,此时会在该目录下生成一个.git文件夹。说明已经初始化成功。
2,git add file
在工作目录下新建一个文件test.py。然后在test.py里写三行代码,如
#!/usr/lib/python
import os
from where import what
写好后,保存关闭文件。
此时在工作目录下执行git status, 此命令会检查工作目录下文件的状态。由于我们新建了一个文件,此时status显示test.py “nothing added to commit but untracked files present (use "git add" to track)”,即test.py还处于没有被跟踪的状态,你此时对test.py做的编辑操作,git并不知情。为了让git跟踪此文件。需要执行git add test.py。再执行git status.会出现Changes to be committed:new file: test.py 。 说明文件已经处于跟踪状态。如果此时再编辑文件,比如在文件末尾加上一行,‘code by python’,保存并关闭。再执行 git status,会提示:Changed but not updated: modified: test.py
说明test.py被编辑了,但是改变的内容还未提交到暂存区域。也就是说暂存区域目前还是未添加那一行的状态。如果想要更新暂存区域的test.py。 执行git add test.py。此时暂存区域的文件就和工作目录的文件一样了。
3, git commit -m ‘add a line.‘
如果想要将暂存区域的文件状态永久保存,那么就要把这个状态的文件提交到仓库。git commit -m ‘any thing about this commit‘。 此时git会将暂存区域的内容整个做一个镜像到仓库。此时再执行git status ,会提示nothing to commit (working directory clean)。也就是说工作目录和仓库是一致的,没有需要放到暂存区的文件, 也没有需要提交到仓库的文件。
4, git reset
此命令会撤暂存区的所有文件。如有暂存区有多个文件需要提交,只想撤销其中一个,可用git rest filename。
5, git checkout file
假如你已经将一个文件放到了暂存区, 然后又对这个文件进行了修改,但是你发现修改错了,不想改了,此时你不用打开文件手动删除这次修改,只需要执行git checkout file. git会将暂存区的状态复制到本地。效果就是本地的那次修改动作被取消了。
6, git checkout HEAD file
如果你想将仓库中的状态复制到本地,而不是将暂存区的复制到本地。用这个命令。git会自动将最后一次提交的状态恢复到本地。从而对文件自从提交到仓库以后的修改都会撤销掉。
7, git diff
如果你想比较工作目录和暂存区现在有什么不同,可执行git diff
如果想比较工作目录下的文件和本地仓库中有什么不同,可执行git diff HEAD
如果想比较目前暂存区和仓库中有什么不同,可执行 git diff --cached
以上都是本地的操作。但是假如,你现在用的服务器坏了!那可怎么办!为了不悲剧。你需要将你的项目上传到github上,这样就算本地服务器坏掉了,网站上还有你项目的一个镜像,你可以随时将网上的克隆到本地。这样你的代码就再也不会丢了。下面讲如何将你的代码上传到github。
github网上地址:https://github.com/ 按步骤注册帐号就可以了。github也是用仓库保存项目的。你要先建立一个仓库,这个仓库有一个唯一的ssh地址,如git@github.com:user-name/respository-name.git, 仓库建好后,就可以将本地服务器的项目代码上传到这个仓库里了。
1,在本地工作目录下执行git remote add origin git@github.com:user-name/resporitory-name.git
2, 然后执行 git push -u origin master ,会提示你输入你的创建密钥时的密码。然后就上传成功了,这是你去看网站上的仓库,会发现本地的文件,已经上传到网络的仓库里了。
3,如果想将网络仓库的代码克隆到本地,首先在本地建立一个文件夹作为工作目录,然后在工作目录里执行: git clone git@github.com:user-name/respository-name.git 就可以了。
如何生成自己的公钥和密钥:
先检查服务器的配置文件/etc/ssh/sshd_config
RSAAuthentication yes #启用RSA认证
PubkeyAuthentication yes #启用公钥认证
配置没问题的话执行ssh-keygen -t dsa -C anything-for-comments
-t dsa 是采用dsa算法,默认的是rsa算法。-C后面是对生成密钥的注释。
执行命令后会提示Enter file in which to save the key(...) 此处直接回车即可。然后会提示输入密码,再次确认密码。完毕后,会提示your identification has been saved in /home/ccy/.ssh/id_dsa。 Your public key has saved in /home/ccy/.ssh/id_dsa.pub。
这样就生成了你本地的公钥(id_dsa.pub)和私钥(id_dsa)。
然后执行: cat id_dsa.pub >> ./authorized_keys
chmod 600 authorized_keys
在github帐号设置中,增加SSH key。将你的公钥复制进去。
这样每次在上传代码到github仓库时,就会要求你输入你的key password。输入正确就可以上传了!
By freemao
FAFU.
free_mao@qq.com
如何使用Git 及 Github 来管理你的代码,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/freemao/p/3777053.html