1.git基本概念理解
git
是分布式版本控制系统,适合于多用户合作开发。git
系统的管理是以仓库为单位的,对于每一个项目,我们可以建立相应的仓库,当然一个仓库下也可以保存多个项目。仓库有本地仓库和远程仓库。
本地仓库:每个开发者在个人计算机上创建的仓库,开发者进行的所有修改、提交等操作都在本地仓库进行。本地操作可离线进行,本地更新不影响远程仓库。
远程仓库:在服务器端的仓库,只是本地仓库在远程服务器上的一个复制,所有人可见,本地提交可以同步到远程仓库,类似于将本地文件上传到网盘中一般,但是不是上传新文件覆盖旧文件那么简单。
文件状态:在git
中,文件有四种状态(git book上说有三种状态,个人理解,所有文件按四种状态分类更合适一点):untracked
,modified
, staged
,committed
.
status | description |
---|---|
untracked | 新建文件或者拷贝新文件到git 控制目录时,新文件会被git 认定为untracked |
modified | 修改文件后,文件状态变为modified 。同样使用git add <file> 将文件添加到stage区 |
staged | stage区中的文件,是即将提交的版本修改 |
committed | 新版本文件已经提交到仓库 |
状态切换:对于untracked
,modified
文件可以使用git add <file>
将文件添加到git
仓库stage区,使其状态变为staged
,git commit
命令可以将文件提交到仓库,使其状态变为committed
。
commit:每一次commit
其实都生成了一个新的版本,不同于某些增量式系统,每有一个新的版本出现,git
都会创建一个新版的snapshot,并且生成一个对应的hash码。commit
命令会生成一个实体,包含一个hash码,一个指向前一次commit
实体的指针,和指向新版本的snapshot的指针。
branch:分支实际上是一个指针,指向某一个commit
。创建一个分支意味着新的版本从主线中分离出来,分支版本开发完毕后可以与主线合并。可以将分支理解为不同的开发方向。
2.配置git,本地仓库与远程仓库
2.1 配置git
第一次安装git
时需要对其进行配置,使用过程中也可以更改这些配置。使用git config
命令可以进行配置。使用该命令配置后的参数存放在三个位置
/etc/gitconfig
为系统配置(windows下为C:\Documents and Settings\All Users\Application Data\Git\config
)。可为git config
命令传递--system
参数设置。~/.gitconfig
or~/.config/git/config
为用户配置(windows下为C:\Users\$USER\.gitconfig
)。可为git config
命令传递--global
参数设置。.git/config
文件,在当前工作空间目录下。为单个项目所配置,仅在该工作空间下有效。可为git config
命令传递--local
参数设置。
git config --global user.name "name" #设置用户名
git config --global user.email mail@example.com #email address
git config --global core.editor emacs #设置默认编辑器
git config --list #查看设置
git config user.name #只查看用户名,查看其他配置同理
2.2 创建仓库
创建本地仓库有两种方式:直接在本地创建和从远程克隆一个仓库到本地。
- 直接在本地创建
git init #从本地创建一个仓库
- 从远程仓库克隆
git clone url #从url指向的地址处克隆一个远程仓库到本地
创建远程仓库可以选择相应的托管网站建立,详见各托管网站。
2.3 本地仓库链接到远程仓库
如果是直接从本地创建仓库,使用dit remote add
命令链接到远程仓库
git remote add name url #链接到url指向的远程仓库,并命名为name
如果使用git clone
命令,则自动链接到远程仓库,并为远程仓库取名origin
。
链接到远程仓库之后,可以将远程仓库和本地仓库同步。先使用git pull remote locate
从remote同步数据到locate并合并。然后可以使用git push remote locate
将本地locate数据同步到远程仓库remote。如果是使用git clone
命令创建的本地仓库,则无需先从远程同步数据到本地。
3.基本操作
3.1 查看文件状态
显示目录下文件状态信息
git status
git status -s # 获取文件简略状态信息
git status –short # 获取文件简略状态信息
git status
只是列出文件状态,一般只显示哪些文件被修改了,哪些文件在stage区还未提交,哪些文件是untracked
。若想查看当前文件的具体变化,使用git diff
git diff file #比较staged文件和当前目录下文件的不同,详细列出更改的地方
git diff –staged #列出staged 文件和committed文件的变化
3.2 更改文件状态
文件修改后,文件状态会变为modified
,将修改的文件或为跟踪的文件添加到stage区,使用下述命令后文件状态变为staged
。
git add files
将staged文件提交到仓库
git commit -m "comments" #带注释信息的提交
git commit -a #将所有修改过的文件提交到仓库,不要求使用git add将其添加到stage区。但是这可能会将不必要的修改提交。
git commit –amend #如果将staged文件提交了但是发现还有文件没有在staged区也需要提交,并且应该与前一次提交合并进行,那么将这些文件添加到staged区,该命令将补充提交到最近的一次提交中。
重命名文件
git mv from to #与下列三条命令等价
mv from to;
git rm from;
git add to
删除文件
git rm files
git rm -f files #强制删除,这两条命令都是从硬盘上删除文件
git rm –cached files #删除staged文件,文件依然在硬盘上,但是变untracked
将staged
文件变为unstaged
git reset HEAD files
将修改的文件改回到修改之前
git checkout – files
3.3 git日志
查看git
日志
git log #列出提交日志,默认按时间排序
git log –graph #以ASCII graph显示结果
git log --pretty=parameter #使用parameter控制输出格式
git log --patch/-p #列出每次提交所引入的变化
git log --stat #列出每次提交的的详细改变
git log --since #限制只输出某一时间之后的提交
git log --until #限制只输出某一时间之前的提交
git log --author #过滤输出某一作者的提交
git log --grep #只输出包含某个字符串的提交
3.4 git remote
将本地仓库链接到远程仓库命令为git remote add
,详细使用见第2节。
重命名远程仓库
git remote rename old_name new_name
删除远程仓库
git remote remove <remote>
git remote rm <remote>
监测远程仓库
git remote show <remote>
从远程仓库下载数据到本地仓库,只下载数据不与当前本地仓库合并。
git fetch <remote>
从远程仓库下载数据自动与本地仓库数据合并。
git pull <remote> <locate>
本地仓库branch所指向数据上传到远程仓库
git push <remote> <branch>
3.5 git tag
在git
中为了标记某些关键开发版本,可以针对相应版本建立标签,git
标签分为两种:lightweight tag
& annotated tag
.
lightweight tag
只是一个指针指向某一个提交。
annotated tag
却包含tag name, email, date, tagging message等。
列出所有tag
git tag
创建tag
git tag -a <version> -m "comments" #创建annotated tag
git tag <version> # 创建lightweight tag
创建后续补偿tag, 当想为某一次过去的提交创建tag时,可以使用如下命令
git tag -a <version> sha-code #sha-code是某一个提交版本的sha-1 hash码
将tag上传到远程仓库,git默认是不上传tag的
git push <remote> <tagname>
git push <remote> --tags #一次上传多个tags
删除tag
git tag -d <tagname>
3.6 git别名
如果输入命令时只输入部分,git
不会推测命令的意思,有些命令比较长,不想输入完整部分时,可以为某些命令建立一个短的别名代替,代码格式为
git config --global alias.rename command
例如
git config --global alias.ci commit
git ci #与git commit相同
4.Branch
在git
中branch是指向某一个commit
的可移动指针。
order | commands | description |
---|---|---|
1 | git branch <branch> | 创建一个新的branch |
2 | git branch | 查看当前已有branch |
3 | git branch -v | 查看当前已有branch并列出最后一次commit信息 |
4 | git branch --merged | 查看已经合并的branch |
5 | git branch --no-merged | 查看未合并的branch |
6 | git branch -d <branch> | 删除branch |
7 | git checkout <branch> | 切换branch |
8 | git chackout -b <branch> | 创建branch并切换到该branch,等同于git branch &git checkout |
9 | git remote show [remote] | 列出远程branch |
10 | git ls-remote [remote] | 同上 |
11 | git checkout --track origin/serverfix | 设置当前branch跟踪远程origin下的 branch serverfix |
12 | git checkout serverfix | 如果本地不存在branch serverfix并且远程刚好存在该branch,则创建一个branch跟踪远程branch serverfix |
13 | git checkout -b sf origin/serverfix | 更改使得branch sf跟踪远程origin/serverfix branch |
14 | git branch -u origin/serverfix | 将当前跟踪的branch更改为origin/serverfix |
15 | git push <remote> --delete <branch> | 删除远程branch |
16 | git branch -vv | 查看设置的所有跟踪的branches |
开始用git
管理代码,阅读Pro Git过程中的一些笔记,暂时只写这么多,后续使用学到新的内容再补充。欢迎指正。