写在前面
本文主要讲述常用命令的使用:
init(初始化)
clone(克隆远程仓库)
config(配置指令)
pull(拉取远程仓库指令)
fetch(拉取指令)
add()
commit(提交指令)
push(上传指令)
mv(移动指令)
show()
log(日志指令)
diff(差异对比指令)
checkout(检出指令)
reset(回滚指令)
revert(撤销指令)
rm(删除指令)
branch(分支指令)
status(状态指令)
1. GIT架构
2. 名词解释
★ workspace:工作区。项目文件夹,可直接进行编辑。
★ Index/Stage:暂存区。包含文件索引的目录树,记录文件名、时间戳、文件长度等信息。
★ Repository:本地仓库。
★ Remote:远程仓库。
★ origin:默认远程版本库名
★ master:默认分支名
★ HEAD:当前分支引用的指针,总是指向该分支上的最后一次提交(commit)。通常,可以把HEAD看作上一次提交的快照。
注:
1.暂存区不保存文件内容,文件内容是存储在Git对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。
2.除非绕过暂存区直接提交文件,否则想把修改文件提交上去,就必须先存入暂存区后才能commit,每次提交的都是暂存区所对应的文件快照。
3. 四种文件状态
注:
状态仅代表文件状态的变迁,不能代表存储位置
暂存区的处于暂存区的文件状态:staged、Unmodify。
Untracked:未跟踪。在暂存区以及本地仓库都不存在该文件。
Unmodify:已入库,未修改。文件已存入本地仓库,此时工作区、暂存区、本地仓库文件内容一致。
Modified:已修改。文件已存在并进行修改,但未add。
Staged:暂存。文件已提交至暂存区,未commit提交至本地仓库。
状态提示:
Changes to be committed:暂存状态,已add,未commit
Changes not staged for commit:文件已修改,未add,若此时进行commit,仅会将之前处于Changes to be committed状态下的文件快照进行提交,只有暂存区的文件可被commit
。
Changes to be committed:文件已暂存
紧凑格式
git status -s
or
git status --short
//简短显示内容:
M README //文件已修改并放入了暂存区
M lib/simplegit.rb //修改过的文件,还未放入暂存区,两者按照M位置区分(左(未放)、右(已放))
MM Rakefile //修改并提交至暂存区后,又被修改还未提交
A lib/git.rb // 新添加到暂存区文件
?? LiCENSE.txt // ??表示未跟踪文件
4. 常用命令
4.1 init、clone
新建代码库
git init //在当前目录初始化一个Git代码库
git init name //新建一个目录,并将其初始化未Git代码库
git clone url //克隆一个项目和它的代码历史
4.2 config
配置指令
Git的设置文件未.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)
git config //显示当前的Git配置
git config -e --global //设置Git全局属性
//设置提交代码时的用户信息
git config --global user.name "name"
git config --global user.email "email address"
4.3 pull
拉取、整合代码指令
git pull 相当于git fetch + git merge
git pull <选项> <远程仓库名> <远程分支名>:<本地分支名>
说明:
☆ 已commit未push: 即工作区,暂存区,本地仓库代码版本一致。两种情况:
1.与本地新增代码远程仓库不冲突时,git pull操作会同时更新工作区、暂存区、本地仓库内容到最新且保留修改内容。
2. 代码有冲突,则冲突代码写入工作区,需手动处理。处理之后pull、add、commit、push。此时push会以本地仓库内容为准,即使所提交内容与远程仓库内容有冲突也不再提示而是直接用本地仓库内容来来替换远程仓库内容。
☆ 未commit :不管是已经add 还是未add,若git pull 有冲突则会提示异常以及异常解决办法,不会直接将冲突代码写入工作区。通常提示需要commit 或 stash后才能merge
注: 冲突处理之后内容提交会直接覆盖远程仓库内容,如下例:
原始代码为:aaaaa
他人提交为:acccc
本地代码为:aeeee
此时git pull 提示代码冲突,如下。
<<<<<< HEAD
aeeee
=========
acccc
>>>>> c16adfegbn
修改代码保留本地修改内容
aeeee
此时进行add、commit、push 后不会提示冲突而是直接在远程仓库内进行更新操作即将 acccc 更改为 aeeee
4.4 add
使用当前工作区的内容更新索引(暂存区)
git add [参数] [路径]
常用参数
☆ 不加参数:仅提交修改和新增文件,不包括删除文件。
☆ -u:仅提交已修改和删除的文件至暂存区,不包括新增文件。
☆ -A:提交已修改、删除、新增文件至暂存区。
☆ -i:查看已修改和已删除但没有提交的文件目录
4.5 commit
提交指令
仅提交放在暂存区的快照,任务还未暂存的仍将保持修改状态不会被提交
1.'-m' 常规提交
git commit -m "message"
2. '-a' 强制提交
说明: a标识将已修改、删除的文件全部提交至版本库,即使它们没经过git add。注意新建文件不能被提交至本地仓库。
git commit -am "message"
3. '’amend' 追加提交
可以在不新增commid-id的情况下将新修改的代码追加至已有的commid-id中。
1. 切换至需要更新的版本
2. 增加新内容
3. add
4. git commit --amend
5. git push
其他用法请查看 “git commit --h”
4.6 push
推送指令
git push [参数] <远程仓库名> <本地分支名>:<远程分支名>
常用指令
☆ git push origin master
将本地master分支推送到origin 主机的master上,若master不存在,则创建。
☆ git push origin :master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的分支到远程分支。等同于:git push origin --delete master
☆ git push origin
表示将当前分支推送到origin主机的对应分支。
☆ git push
当且仅当当前分支只有一个追踪分支时,可以省略主机名。
☆ git push -u origin master
指定默认主机。若当前分支与多个主机分支存在追踪关系,则可以用 “-u”来指定一个默认主机,这样后面就可以不加任何参数使用 git push。
☆ git push --all origin
不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机。
☆ git push --force origin
强制推送。尽量避免强制推送
。
☆ git push origin --tags
push默认不会推送标签,除非使用--tags选项
注: 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。如果要修改这个设置,可以采用git config命令。
4.7 fetch
4.8 mv
移动指令
git mv 相当于
mv old new
git rm old
git add new
4.9 show
4.10 log
查看提交历史指令
常用选项
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个更新之间的差异 |
--stat | 显示每次更新的文件修改统计信息 |
--shortstat | 只显示 --stat中最后的行数修改添加移除统计 |
--name-only | 仅在提交信息后显示已修改的文件清单 |
--name-status | 显示新增、修改、删除的文件清单 |
--abbrev-commit | 仅显示SHA-1的前几个字符,而非所有40个字符 |
--relative-date | 用较短的相对时间显示 |
--graph | 显示ASCII图形表示的分支合并历史 |
--pretty | 使用其他格式显示历史提交信息,常用oneline、short、full、fuller、format |
-(n)} | 仅显示最近的n条提交 |
--since、--after | 仅显示指定时间之后的提交 |
--until,--befor | 仅显示指定时间之间的提交 |
--author | 仅显示指定作者相关的提交 |
--commiter | 仅显示指定提交者的提交 |
--grep | 仅显示含指定关键字的提交(提交说明中的关键字) |
-S | 仅显示添加或移除了某个关键字的提交 |
注: 使用其他关键字与 --grep配合搜索时,必须使用 --all-match选项才能得到同时满足这两个选项的提交,否则,满足任意一个条件都会被搜索出来
。
实例
//默认查询,按提交时间列出所有更新
git log
// -p : 显示每次提交的内容差异
// -2 : 仅显示最近的两次提交
git log -p -2
//总结性质选项,每次提交的简略的统计信息,
//列出所有被修改过的文件,有多少文件被修改了、
//被修改的文件哪些行被移除或添加了
git log --stat
//指定使用不同于默认格式的方式展示提交历史
//有内建选项供使用,例 online(每个提交在一行显示)、short、full、fuller、format
git log --pretty=online
//定制格式化输出,利于后期提取分析
git log --pretty=format:"%h - &a, &ar : %s"
// --graph可形象的展示分支、合并历史
git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
// --since 仅显示最近两周内的提交
git log --since=2.weeks
//显示2008年10月期间,gitster提交的但未合并过的文件
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t
注: format的常用选项,请自行度娘
4.11 diff
差异检查
比较工作区与暂存区快照间的差异
//仅显示尚未暂存的内容,而不是自上次提交以来的所有改动
git diff
//查看已经暂存起来的变化
git diff --cached
实例
4.12 checkout
检出指令
4.13 reset
回滚指令
git reset [--soft | --mixed | --hard] [<commit>]
or
git reset [--soft | --mixed | --hard] [HEAD]
说明:
<commit>:commit的hashcode(版本号)
[HEAD]:
HEAD or HEAD~0 最近的一个提交(倒数第一次)
HEAD^ or HEAD~1 上一次提交(倒数第二次)
HEAD^^ or HEAD~2 上上次提交(倒数地三次)
HEAD^. ..^ or HEAD~n 倒数第N次提交
三种回滚方式
1.仅回退版本库,保留暂存区、工作区
git reset --soft HEAD~n
2.回滚版本库、暂存区,保留工作区
该操作为reset的默认操作。此时若想回滚工作区,需执行checkout指令。
git reset HEAD~n
or
git reset --mixed HEAD~n
3.版本库、暂存区、工作区全部回滚
git reset --hard HEAD~n
注:
使用reset后,在git log中的commit记录也会被删除
上述代码中 n 代表回滚的版本可以是版本号,也可以是数字。比如1表示上一个版本,2表示倒数3个版本
4.14 revert
回滚指令
git revert <commit> 撤销指定的提交
注: 相比于reset会修改commit history。revert是通过创建一次新的commit来撤销一次commit所作的修改。此种操作相较reset较为安全。
4.15. rm
移除指令
从已跟踪文件清单中移除(暂存区移除),然后提交(commit、push)
git rm本质是 rm + git add 。若需要同步至本地仓库,在执行玩rm后需要执行commit来将执行结果提交至本地仓库。
git rm [-f | -force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [files]
[-f | -force]:强制删除,已经add并且工作区进行了修改,可加此参数。
[-n] :查询操作,仅会列出执行该命令后会删除那些文件,但不会真正执行该命令。
[-r]: 递归删除
[--cached]:从暂存区中删除文件索引,但工作区内容保存。此操作后,git将不再最终该文件
。
[--ignore-unmatch]:忽略未匹配的文件,删除未添加至暂存区的文件时不需要提示可进行直接删除。
[--quiet]:执行删除索引成功后不输出提示。删除的时不存在的文件索引仍然会提示。
4.16 branch
分支指令
git branch
4.17 status
状态指令
git status:将展示工作区及暂存区中不同状态的文件,比如已修改未暂存、已暂存未提交等。
5. 撤销操作
5.1 覆盖提交
提交过文件后发现有文件没有添加至暂存区(未add)
,或者修改提交信息可运行该指令
git commit --amend
说明:
该命令是将暂存区文件进行提交并覆盖上一次提交的内容。即该命令仅能重置上一次提交,而不能进行隔代版本替换。
git commit -m 'initial commit'
git add forgetten_file
git commit --amend
注:上述命令只会有一个提交--第二次提交将会代替第一次提交的结果
撤销提交
撤销暂存、取消文件修改
reset 可根据commit版本号来回滚暂存区,详情请查阅回到“4.13 reset”。
5. 冲突解决
5.1 强制拉取
场景:忽略本地修改
git fetch --all //远程 → 本地仓库
git reset --hard origin/dev // 本地 → 暂存区
git pull // 同步工作区、远程仓库
5.2 未commit先pull
本地修改量小
git revert //取消本地修改代码
git pull // 更新至最新代码
修改代码
git pull // 确认无其他人在修改过程中提交代码
add、commit、push
本地修改量大,冲突较多
git stash save // 将自己的代码隐藏
git pull // 更新至最新版本
git stash pop //取回隐藏的代码
解决冲突(经上步后,代码文件会显示冲突)
add、commit、push
5.3 已commit未push
本地修改量小
git reset //回退至未修改状态
git pull //获取最新代码
在最新代码上修改
git pull //确认无其他人在修改过程中提交代码
add、commit、push
本地修改量大
git pull //显示冲突
手动merge → 解决冲突
add、commit、push
6 建立本地仓库与远程仓库追踪关系
查看分支追踪关系
git branch -vv
dev be1c962 [origin/master] a
master 6577072 [origin/master: behind 1] .
* next be1c962 [origin/next] a
vv 021db27 第一次修改
追踪关系的建立主要有以下三种方式:1.手动建立、2.push时建立、3.新建分支时建立。
详细说明如下:
☆ 手动建立
git branch --set-upstream-to=<远程主机名>/<远程分支> <本地分支名>
☆ push时建立
git push <远程主机名> <本地分支>:<远程分支名>
or
git push -u <远程主机名> <本地分支>
注: -u :本地指定分支和远程主机的同名分支建立追踪关系
☆ 新建分支
git checkout -b <本地分支名> <远程主机名>/<远程分支名>
注:
手动建立、新建分支的前提条件是远程分支已存在所要追踪的分支。
push时建立是若所追踪的远程分支不存在则创建远程分支。
--- 未完