Git版本控制:Git本地仓库

来源:互联网 发布:影视剧 知乎 编辑:程序博客网 时间:2024/05/20 04:26

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"


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

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

.git/info/exclude

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

工程目录下找到.git/info/exclude,把要排除的文件写进去。

可以使用感叹号(!)来指出例外的情况,如!main.pyc。

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

# 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

lz常犯的错误

屏蔽某个目录下的某个文件,指定忽略路径时,路径要相对.git目录来说。如:

exclude:

dist/*.exe


而写成:

exclude:

TargetOpinion/dist/*.exe


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

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

最后一步就是把.gitignore也提交到Git,就完成了!检验.gitignore的标准是git status命令是不是说“working directory clean”。

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

[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 <file>..." to update what will be committed) (use "git checkout -- <file>..." 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

将暂存区stage中某些文件删除,不提交(应该就是说只删除指定文件,不过LZ建议用git reset HEAD .)


把文件提交到仓库

$ 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不同的文件:

$ git add file1.txt

$ git add file2.txt

$ git add file3.txt

$ git commit -m "add 3 files." 

{暂存区中的都提交了}

git status变化:

总结

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

git initgit add README.mdgit 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 add把文件添加进去,实际上就是把文件修改添加到暂存区(stage);

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

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


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


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

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

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

让代码从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 lastcommit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2Merge: bd6ae48 291bea8Author: Michael Liao <askxuefeng@gmail.com>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的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

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

$ cat .git/config [core]    repositoryformatversion = 0    filemode = true    bare = false    logallrefupdates = true    ignorecase = true    precomposeunicode = true[remote "origin"]    url = git@github.com: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 = your@email.com

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

设置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的真相


1 0
原创粉丝点击