Git版本控制:Git本地仓库

http://blog.csdn.net/pipisorry/article/details/44588351

本地库创建总结

$ git config --global user.name "***"

$ git config --global user.email "***@126.com"

在本地的某个要使用git版本控制的目录下
git init
添加exclude
git add .
git commit -m "first commit"

[ pygit:500行Python代码实现的Git客户端]

Git的安装

linux下安装git

ubuntu 14.04中安装最新版git

$sudo add-apt-repository ppa:git-core/ppa        #添加最新源,不然总是安装git 1.9.1

$sudo apt-get update    #添加更新源后记得update一下,否则添加后也没用

$sudo apt-get install git    #安装最新版的git

windows下安装git

Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂,就不建议你折腾了。不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序。

msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”!

Note: windows下安装git后,如果将安装目录D:\Git\bin加入到path路径中,这样就可以在cmd(而不是git命令行mingw32)中使用linux命令如ls了。

快速启动Git并自动切换到指定的文文件夹:命令行工具Git Bash还集成到了Windows的资源管理器中,在文件夹上右键,可以点击Git Bash HereGit GUI Here快速启动Git并自动切换到指定的文件夹。

设置git的user name和email

配置命令

$ git config --global user.name "***"

$ git config --global user.email "***@126.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。(注册过的)

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

查看git配置

git config --list

皮皮Blog


创建版本库-初始化git代码库

通过 git init命令把某个目录(比如我的是E:\mine\pythonworkspace)变成Git可以管理的仓库

GitBash中输入:

$ cd 'E:\mine\pythonworkspace'

$ git init

当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的

Note:git很干净:git不会像svn一样在每个目录下面都建立一个.svn目录,而只是在代码根目录下建立一个.git目录。所以相应的,当你执行git status的时候,显示出来的是整个工程的代码修改,而不是像svn一样显示当前目录下的修改。git只建立一个.git目录的好处是,除了根目录下你需要注意这里比原先多了一个文件夹外,你可以很放心地认为“代码就像它看起来的那样”,你把它copy到任意一个地方都可以。而svn则不行,svn的代码目录是不能够拷贝到其他svn代码库中的,因为svn的索引会冲突。

忽略指定文件

git提交代码文件时怎么过滤掉某个文件夹,不提交Git工作目录中某些文件。在git add文件之前,有些文件(比如数据文件,>100m就不能push到远程;比如.pyc文件;比如编译过程中生成的 .o 文件)是我们并不想加入也无需被添加到 Git 管理中,同时也不希望他出现在未跟踪列表中。

.gitignore 文件

lz提示一点,相当重要:.gitignore 文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。.gitignore文件只是ignore没有被staged(cached)文件,对于已经被staged文件,加入ignore文件时一定要先从staged移除。

配置语法
1)以“/”开头表示目录;
2)以“?”通配单个字符
3)以“*”通配多个字符;
4)以方括号“[]”包含单个字符的匹配列表;
5)以叹号“!”跟踪某个文件或目录;指出例外的情况,不忽略,如!main.pyc。

1. 全局设置
    通过修改全局配置 gitconfig 中的  excludesfile 指定全局忽略文件。设置方法:
$ git config --global core.excludesfile ~/.gitignore
    修改~/.gitignore 这个文件将作用于所有 git 项目,并且作用于项目实例中的所有被跟踪的目录。比如说我们可以在该文件中添加*.o 来忽略所有 .o 文件。
2. 局部设置

只作用于当前目录(也就是.git目录的父目录)下,在 .gitignore 文件中添加 *.o 会忽略所有目录下产生的.o 文件,但在当前目录下的 .gitignore 中添加 *.o 却只能忽略当前目录下的 .o 文件。

Note:屏蔽某个目录下的某个文件,指定忽略路径时,路径是没有相对路径的,git管理下的所有文件都会进行搜索。

.git/info/exclude

 git 还提供了另一种 exclude 的方式来做同样的事情,不同的是 .gitignore 这个文件本身会提交到版本库中去。用来保存的是公共的需要排除的文件。而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件, 他不会影响到其他人。也不会提交到版本库中去。工程目录下找到.git/info/exclude,把要排除的文件写进去。

.gitignore文件

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

Note: 如果使用Windows,windows下貌似不能创建.gitignore这个文件,如果你在资源管理器里新建一个.gitignore文件,提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。lz发现还可以这样做:打开git,cd到.git文件夹下,输入命令touch .gitignore就可以创建成功了。

.gitignore(或者.git/info/exclude)示例

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
 
#others' project
charimage/
 
#not for stage (never add)
.idea/
datasets/
*.mtx
launcher0
launcher7133709813684183199
*.bak
*~
 
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*.npy

 
# C extensions
*.so
Debug/
ipch/

 
# Distribution / packaging
.Python
env/
build/*
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
 
# PyInstaller
# Usually these files are written by a python script from a template before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
 
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
 
# Unit LanguageAnalysis / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
 
# Translations
*.mo
*.pot
 
# Django stuff:
*.log
 
# Sphinx documentation
docs/_build/
 
# PyBuilder
target/

# Windows:
Thumbs.db
ehthumbs.db  
Desktop.ini

[Ignoring files]

[git 创建 .gitignore 文件过滤规则及注意事项]

[Git 过滤文件,控制上传]

[ git-忽略指定文件]

把文件添加到仓库

1. $ git add readme.txt

$git add --all .   #同时包含git add .和git rm 所有已经删除的文件

Note:

1. 如果不add到暂存区,那就不会加入到commit中。

2.workspace中某个文件夹右键 >  git add all files now

删除文件

如果是你删除了某个文件如1.txt,怎么才能提交这种修改:

方法1.现在的git2.0版本使用git add 1.txt不行,可以用git rm 1.txt 将删除动作提交到stage中。直接使用git add 1.txt会提示错误:Changes not staged for commit: (use "git add/rm ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deletee: 1.txt。从提示中看出del操作没有被staged。关于stage参考下面的[工作区和暂存区]部分。当然也可以直接用git add --all .啦。

方法2. 直接删除一个文件,但是之后要用git commit -a -m 'update'来提交,才能提交删除的文件到远程和本地库中,与git1.0不同。(现在好像也不用加-a了)

其它删除文件相关的内容[Git版本控制教程 - Git查阅、撤销修改和版本回退:git删除和恢复删除的文件]

git status命令查看结果

绿色是已经add到暂存区stage中的(右键add进去的), 红色是在工作区workspace还没add到stage中的

git diff

查看difference

撤销git add .

git reset HEAD . 也就是刚刚git add了文件,将其从暂存区删除,不add

把文件提交到仓库

$ git commit -m "wrote a readme file"

Note:

1. -m后面输入的是本次提交的说明,可以输入任意内容。如果说明中没有空格等分隔符,可以省略""号。

2. 提交信息内容的建议:写明为什么,不要写做了什么. Anyone can see WHAT you did just by looking at the code. But the code can never tell someone WHY you did it.using the word “should” can help frame things.

[Writing Great Git Commit Messages][Preemptive commit comments]

commit可以一次提交很多文件,所以你可以多次add不同的文件。commit后暂存区中的都提交了。

总结

在本地创建repository版本管理的步骤如下

git init
git add README.md
git commit -m "first commit"

Note:在github上创建完成repository后就是这个提示。

皮皮Blog



工作区和暂存区

工作区(Working Directory):就是你在电脑里能看到的目录,比如E:\mine\pythonworkspace文件夹。也叫Working tree?

版本库Repository:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

Git版本控制:Git本地仓库_第1张图片

把文件往Git版本库里添加的时候,是分两步执行的

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区(stage);

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支(master)。(但个人理解commit后应该并没有清空stage,因为可以使用git rm --cached来将commit的大文件从stage中删除)

git add两个文件后,暂存区的状态就变成这样了:

Git版本控制:Git本地仓库_第2张图片

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。现在版本库变成了这样,暂存区就没有任何内容了:

Git版本控制:Git本地仓库_第3张图片

git中代码的三种状态:unstaged, staged 和 committed

unstaged表示该代码尚未开发完成,staged表示代码开发完成了,准备提交但是尚未提交,committed自然就是提交过的了。

让代码从unstaged变成staged,要通过命令git add git rm

让代码从staged变成committed,自然要使用命令git commit

Note:  Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)或者是加入到ignore文件中去的那些?

[http://nvie.com/posts/a-successful-git-branching-model/]

皮皮Blog


自定义Git

在安装Git中,我们已经配置了 user.nameuser.email,实际上,Git还有很多可配置项。

让Git显示颜色

$ git config --global color.ui true

这样,Git会适当地显示不同的颜色,比如git status命令,文件名就会标上颜色。

配置别名

$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

以后提交就可以简写成:

$ git ci -m "bala bala bala..."

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

撤销修改中,我们知道,命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:

$ git config --global alias.unstage 'reset HEAD'

当你敲入命令:

$ git unstage test.py

实际上Git执行的是:

$ git reset HEAD test.py

配置一个git last,让其显示最后一次提交信息:

$ git config --global alias.last 'log -1'

这样,用git last就能显示最近一次的提交:

$ git last
commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2
Merge: bd6ae48 291bea8
Author: Michael Liao 
Date:   Thu Aug 22 22:49:22 2013 +0800

    merge & fix hello.py

甚至还有人丧心病狂地把lg配置成了:

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

Git版本控制:Git本地仓库_第4张图片

配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

每个仓库的Git配置文件都放在.git/config文件中:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = [email protected]:michaelliao/learngit.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[alias]
    last = log -1

别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = [email protected]

配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

设置git启动时的默认工作目录

windows下找到git安装目录下 e.g. D:\Git\etc\profile文件,在最前面加上默认工作目录,如:

cd E:/mine/python_workspace

Git自动补全

lz提示一下,windows下是自带有的,哈哈。

在Unix系统下,运行以下指令来获取脚本:

cd ~
curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
然后,在您的~/.bash_profile文件中添加以下代码:
if [ -f ~/.git-completion.bash ]; then
    . ~/.git-completion.bash
fi
尽管我之前就提到过,在这里我仍要不厌其烦的说:如果你想使用Git提供的全部功能,你肯定是需要转而使用命令行来操作的。

from:http://blog.csdn.net/pipisorry/article/details/44588351

ref:git Documentation

git book*

git command Reference*

git(1) Manual Page

Git学习笔记

http://www.liaoxuefeng.com/

http://gitref.org/

git入门经典

Git-Tutorial-ebook+github+tutorial

git - 简明指南

Git 10 周年访谈:Linus 讲述背后故事 - 推荐阅读

git 问题

版本控制工具(CVS、SVN、GIT)简介

探索.git目录了解Git的真相


你可能感兴趣的:(Git小记,Git)