Git版本控制:Git本地仓库

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

本地库创建总结

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

1 安装git

2 全局设置

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

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

3 在本地的某个要使用git版本控制的目录下

git init
添加exclude
git add .
git commit -m "first commit"

Git的安装

mac下安装git

brew install git

[Mac常用软件安装-CSDN博客]

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,从Redirecting Git for Windows' homepage...下载,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“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代码库git init

创建版本库,通过git init命令把某个目录变成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 add文件之前,有些文件(如>100m数据文件、.pyc文件、编译生成的 .o 文件)我们并不想加入也无需被添加到 Git 管理中,同时也不希望出现在未跟踪列表中。比如说我们可以在该文件中添加*.o 来忽略所有 .o 文件。

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

格式规范

所有空行或者以 # 开头的行都无效
可以使用标准的 glob 模式匹配
glob 模式指 shell 所使用的简化了的正则表达式,包括*、?、[]、**
匹配模式可以以(/)开头防止递归
匹配模式可以以(/)结尾指定目录
要忽略指定模式以外的文件或目录, 可以在模式前加上惊叹号(!)取反
通配符
* 匹配除了 / 的所有字符,匹配零个或多个任意字符
? 匹配除了 / 的所有单字符
[] 匹配任何一个列在方括号中的字符:如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配
比如 [0-9] 表示匹配所有 0 到 9 的数字
斜线/
行首第一个 / 匹配路径的开始, 以 .gitignore 当前所在路径计算相对路径
如 /*.txt 匹配与 .gitignore 同一路径下的 txt 文件, 不包含 .gitignore 当前路径下子文件内的 txt 文件
test/*.txt 路径的开始是 t 而不是 /
两个星号
**/ 匹配任意中间目录
/** 匹配包含的所有内容, 包括文件和文件夹, 以及子文件和子文件下的文件
/**/ 匹配 0 个或多个目录
”!” 取消忽视
!pattern 否认 pattern, 即前一个 pattern 匹配的文件会再被包含
注意: 如果一个文件的父文件夹被忽略, 那么 git 不能再包含该文件

目录/和/*在排除时以及在取消排除时的区别
模式dir/排除了名为dir的目录及其下的所有内容。
    有了dir/,Git将永远不会查看dir下的任何内容,因此永远不会将任何“不排除”模式应用于dir下的任何内容。
模式dir/*并没有说明dir本身;它只是排除了dir下的所有内容。
    通过dir/*,Git将处理dir的直接内容,从而使其他模式有机会“取消排除”部分内容(!dir/sub/)。

示例

# 注释行
*.[oa] # 忽略所有以 .a 或 .o 为扩展名的文件
!lib.a # 但是 lib.a 文件或者目录不要忽略
/TODO # 只忽略根目录下的 TODO, 子目录的 TODO 不忽略
build/ # 忽略所有 build/ 目录下的文件

简单示例1:

**/b/c    # 忽略所有子路径是b/c/的文件夹(应该对的)

doc/*.txt        # 忽略 doc/.txt, 但 doc/server/.txt 不忽略
doc/**/*.pdf         # 忽略 doc文件夹下所有的*.pdf

目前貌似必须加前缀**/doc/*.txt来匹配任意中间目录了,否则只对.git要目录下的data/*.txt起作用。

复杂示例1:忽视除了 /build/debug 下 除了 snap 的文件和文件夹

## 前两句可互换顺序
build/debug/*
!build/debug
!build/debug/snap

复杂示例2.1:ignore所有output开头的目录,除了目录output_1的子目录step_1/不被ignore
output_*/
!output_1/step_1/
上面这样是不行的,可以这样:
output_*/
!output_1
output_1/*
!output_1/step_1/

也就是说,父目录已经排除的情况下,子目录如果想取消排除。首先父目录要先取消他目录本身的排除(目录里面的内容还是要排序),然后再将目录里面的某个内容取消排序。当然这个可能是output_*/的影响,如果不是正则而是一个目录,应该第一个方案就行了。

复杂示例2.2:2.1基础上,如果output不是当前git仓库的根目录,且只想要output_1/step_1/step_best。
则还需要在目录前加上**,并加一层过滤和排除。
**/output_*/
!**/output_1
**/output_1/*
!**/output_1/step_1
**/output_1/step_1/*
!**/output_1/step_1/step_best

复杂示例2.3:2.1基础上,再加个排除a.txt
a.txt
output_*/
!output_1
output_1/*
!output_1/step_1/
而output_1/step_1/下面也有a.txt,这时上面不管是!output_1/step_1/还是!output_1/step_1/*都没有取消排除a.txt。只能这样:
a.txt
output_*/
!output_1
output_1/*
!output_1/step_1/
!output_1/step_1/*
有点神奇。

当然,如果没有a.txt的考虑,那就和示例1一样,只需要!output_1/step_1/就可以将子目录全取消排除了。

.gitignore 文件

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

1. 全局设置
    通过修改全局配置 gitconfig 中的 excludesfile 指定全局忽略文件。

    设置方法:$ git config --global core.excludesfile ~/.gitignore
    修改~/.gitignore 这个文件将作用于所有 git 项目,并且作用于项目实例中的所有被跟踪的目录。
2. 局部设置

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

Note: 如果使用Windows,windows下貌似不能创建.gitignore这个文件,如果你在资源管理器里新建一个.gitignore文件,提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。lz发现还可以这样做:打开git,cd到.git文件夹下,输入命令touch .gitignore就可以创建成功了。
        只作用于当前目录(也就是.git目录的父目录)下,在 ~/.gitignore 文件中添加 *.o 会忽略所有目录下产生的.o 文件,但在当前目录下的 .gitignore 中添加 *.o 却只能忽略当前目录下的 .o 文件。Note:屏蔽某个目录下的某个文件,忽略文件路径时,当前git管理下的所有文件都会进行搜索,忽略所有这种名字的文件。

.git/info/exclude

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

.gitignore(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]
# *~

#not for stage (never add)
.idea/
.ipynb_checkpoints/
*.mtx
*.bak
*~

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*.npy

# C extensions
*.so
Debug/
ipch/

#mac
.DS_Store

GitHub已经为我们准备了各种配置文件配置文件可以直接在线浏览:https://github.com/github/gitignore.

[https://github.com/pipilove/python_workspace/edit/master/.gitignore]

[GitHub - github/gitignore: A collection of useful .gitignore templates]

[Ignoring files]

状态查看git status

git status #整个目录未add时,只会显示目录名

git status -u #整个目录未add时,显示目录下所有文件名

-u[<模式>]

--untracked-files[=<模式>]显示未追踪文件。模式参数用于指定对未跟踪文件的处理。 它是可选的:默认为 "所有",如果指定,必须与选项卡在一起(例如,-uno,但不是`-u no`)。

可选项:no - 不显示未跟踪的文件。normal - 显示未被追踪的文件和目录。all - 也显示未被追踪的目录中的单个文件。

当不使用`-u`选项时,将显示未跟踪的文件和目录(即与指定`normal`相同),以帮助你避免忘记添加新创建的文件。 因为在文件系统中寻找未跟踪的文件需要额外的工作,在一个大的工作树中,这种模式可能需要一些时间。 如果支持的话,考虑启用无痕缓存和分割索引(见`git upd-index --untracked-cache`和`git upd-index --split-index`),否则你可以使用`no`来让`git status`更快地返回而不显示无痕文件。默认值可以用git-config[1]中记载的 status.showUntrackedFiles 配置变量来改变。

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

保存尚未提交的改动git stash

不想git add,但是又不想丢失的场景用:比方说你正在解决一个bug或是添加某个新功能,这时你突然被要求展示你的工作。你当前的工作还没有完成到进行提交的地步,而且你在这个阶段也没办法展示你的工作(如果不回退所有变化的话)。在这种情况下,git stash可以拯救你。

stash命令本质上是保存了你全部的改动以供将来使用。

暂存工作区修改的内容(可以stash多次):
git stash
查询工作区所有stash的列表:
git stash list


可以看到,这里是有6个暂存的。每一次保存都有一个标示符,一个独一无二的数字。

如果想要恢复最近一次的改动:
git stash apply

或者git stash pop。

Note: git stash pop 命令会在 stash 应用之后丢弃(默认情况下指的是最顶部的)stash,而 git stash apply 会将其保留在存储列表中,以备日后重用(或者您可以在之后使用 git stash drop 命令移除此 stash)。除非 git stash pop 之后存在冲突,在这种情况下,它将不会删除该 stash,而使其行为与git stash apply 的命令完全相同。

如果想恢复stash@{2}:

git stash apply stash@{2}

清空stash

git stash clear

把文件添加到stage暂存区git add

$git add readme.txt

$git add .      # 将当前文件夹下所有改动加到暂存区(不包括父目录下其它子目录)等价git add *

$git add ..     # 将父目录下所有子目录修改加到暂存区(当然也包括当前文件夹)

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

将文件从仓库删除unstage

也就是将某个文件回到git add之前状态,相当于没有git add。

use "git rm --cached <file>..." to unstage

刚add的所有文件都unstage: git rm --cached -r .

这样就可以将不想commit的文件加入ignore中再git add。

删除文件

如果是你删除了某个文件如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 diff

查看difference

[Git版本控制:Git高级教程]

撤销git add .

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

git reset HEAD DIR/* 只撤销DIR目录下的所有文件

把文件提交到仓库git commit

$ git commit -m "comment"

Note:-m后面输入的是本次提交的说明,可以输入任意内容。如果说明中没有空格等分隔符,可以省略""号。建议:写明为什么,不要写做了什么. 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.

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

皮皮Blog

工作区和暂存区

工作区(Working Directory):就是你在电脑里能看到的目录,比如E:\mine\pythonworkspace文件夹,其中包含git init后生成的隐藏目录.git

版本库(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文件中去的那些?

皮皮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 <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自动补全

1 windows下是自带的。

2 在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
from:Git版本控制:Git本地仓库_皮皮blog-CSDN博客_git 本地版本控制

ref:git Documentation

git book*

git command Reference*

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值