第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
第二步:自动地删除那些在index file中但不在工作树中的文件
第三步:执行commit命令来提交
对于有删除文件,可以git commit -a 或 git add -A
注意git add -A 会把我们未通过 git rm 删除的文件全部stage,
git commit -a
是删除的文件会自动标记, 但对新建文件就不行git rm 删除当地文件和index里的文件
git rm -r 删除文件夹
git rm --cached删除index里的文件
用git show 的时候commit只需要5,6位就可以了
对于add后但没有commit的又想去除的,可以用git reset --filename
当合并失败git会提示那些冲突无法自动合并,有两种解决方法:
手工修改这些文件,合并其中的内容,然后commit。
使用当前分支,或者要合并分支的内容,然后提交
git checkout –ours <conflict file>
git checkout –theirs <conflict file>
$ git add -p // 为你做的每次修改,Git将为你展示变动的代码,并询问该变动是否应是下一次提交的一部分。回答“y”或者“n”。也有其他选项,比如延迟决定:键入“?”来学习更多。
git add <path>表示 add to index only files created or modified and not those deleted
我通常是通过git add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录。
git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。
三、git add -u
git add -u 表示 add to index only files modified or deleted and not those created
git add -u [<path>]: 把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。
省略<path>表示.,即当前目录。
四、git add -A
git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
省略<path>表示.,即当前目录。
五、git add -i
我们可以通过git add -i [<path>]命令查看<path>中被所有修改过或已删除文件但没有提交的文件,
并通过其revert子命令可以查看<path>中所有untracted的文件,同时进入一个子命令系统。
比如:
git add -i
staged unstaged path
1: +0/-0 nothing branch/t.txt
2: +0/-0 nothing branch/t2.txt
3: unchanged +1/-0 readme.txt
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>
这里的t.txt和t2.txt表示已经被执行了git add,待提交。即已经添加到索引库中。
readme.txt表示已经处于tracked下,它被修改了,但是还没有被执行了git add。即还没添加到索引库中。
5.1、revert子命令
可以通过git add -i的revert子命令(3: [r]evert)把已经添加到索引库中的文件从索引库中剔除。
(3: [r]evert)表示通过3或r或revert加回车执行该命令。执行该命令后,git会例出索引库中的文件列表.
然后通过数字来选择。输入"1"表示git会例出索引库中的文件列表中的第1个文件。
"1-15"表示git会例出索引库中的文件列表中的第1个文件到第15个文件.回车将执行。
如果我们不输入任何东西,直接回车,将结束revert子命令,返回git add -i的主命令行。
5.2、update子命令
可以通过update子命令(2: [u]pdate)把已经tracked的文件添加到索引库中。其操作和revert子命令类似。
5.3、add untracked子命令
通过add untracked子命令(4: [a]dd untracked)可以把还没被git管理的文件添加到索引库中。其操作和revert子命令类似。
5.4、diff子命令
可以通过diff子命令(6: [d]iff)可以比较索引库中文件和原版本的差异。其操作和revert子命令类似。
5.5、status子命令
status子命令(1: [s]tatus)功能上和git add -i相似
5.6、quit子命令
quit子命令(7: [q]uit)用于退出git add -i命令系统
六、帮助
我们可以通过git add -h命令来看git add命令的帮助文档。
git add -h
usage: git add [options] [--] <filepattern>...
-n, --dry-run dry run
-v, --verbose be verbose
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
-N, --intent-to-add record only the fact that the path will be added later
-A, --all add changes from all tracked and untracked files
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of errors
--ignore-missing check if - even missing - files are ignored in dry run
$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。
$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心
git branch -r -d origin/branch-name
发现只是删除的本地对该远程分支的track,正确的方法应该是这样:
git push origin :branch-name
冒号前面的空格不能少,原理是把一个空分支push到server上,相当于删除该分支。
commit
提交修改的代码(只是提交到本地的代码库,不会推送到服务器)
$ git commit -am '修改说明'
如果觉得刚提交的“修改说明”写得不够好,可输入以下命令调整
$ git commit --amend
push
将自上次 push 以来的,本地历次 commit,推送到服务器
结合我们的实际,应该这样写:
$ git push origin master:your-id
其中,master 是本地的分支名;your-id 填你在服务器上的 id,服务器的版本库里会有以你的 id 为名称的分支。
tag
在git中可以为任意其他对象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1标识git对象,这是一个40个字符长度的字符串,不方便记忆,那么可为git对象添加一个tag便于标识不同对象。
添加tag
# git tag tag-name sha-1
$ git tag v1.0 bdc390c2
这样便为bdc390c2的对象添加了一个tag,如果不指定sha-1,会为最近的一个commit对象添加tag
查看tag
使用git tag命令便能查看所有tag
$ git tag
当然可以筛选
$ git tag -l 'v1.*'
删除tag
$ git tag -d <tag-name>
重命名tag
重命名tag有两种方式:
删除原tag,重新添加
git tag -f 强制替换已存在的tag后,再删除原tag
$ git tag -f <new-tag> <old-tag>
$ git tag -d <old-tag>
tag的分类
轻量型标签 轻量型标签直接使用 $ git tag <tag-name> <git-object> 即可创建
标注型(annotated)标签 标注型标签可记录更多的信息,使用 $ git tag -a <tag-name> <git-object> -m ‘tag message’即可创意一个标注性标签
$ git branch -v # 查看已合并的分支 $ git branch --merge # 查看未合并的分支 $ git branch --no-merged
ignore
- 允许使用空行,没有实际语法作用
- # 开头的行视作注释
- ! 开头的模式会覆盖之前的定义,将匹配的对象重新加入跟踪列表
- 以/结尾的模式,git会屏蔽掉该目录及其所有子目录及文件(只屏蔽目录)
- 不以/结尾的模式,git屏蔽同名的文件名及目录(屏蔽目录和同名文件)
- 以/开头的模式,git只会屏蔽项目根目录下的匹配对象
'_myignore'
git配置
- 系统配置文件(git安装目录/gitconfig)
- 用户配置文件(用户主目录/.gitconfig)
- 项目配置文件(.git/config)
- git config –system 写入系统配置
- git config –global 写入用户配置
- git config 写入项目配置
git中的对象
- commit 提交对象
- tree 目录
- blob 文件
- tag 标记
- $ git log 可以查看所有commit对象
- $ git ls-tree <commit> 查看commit对象中的tree对象
- $ git show <blob> 查看blob的具体内容
git原理
- HEAD 指向当前分支
- config 项目配置文件
- description 供GitWeb程序使用
- hooks/ 客户端与服务端钩子脚本
- info/ 忽略模式
- index 暂存区域信息
- objects/ 所有数据内容
- refs/ 指向所有commit的指针
- heads 保存所有分支的HEAD指针
- remotes 保存远程仓库信息
- tags 保存所有tag指针