Git 笔记
Git 笔记
精通Git(第2版). Pro Git, Second Edition. (强烈推荐!)
基础
入门
初始
-
创建/初始化一个 git 仓库
# 在某文件夹下执行 git init # 执行完后,目录下多了个 .git 文件夹
提交
-
暂存:把文件添加到仓库,以使此文件可被 git 追踪,或提交文件到暂存区
git add <filename>
-
提交:将修改提交到仓库
# 必须输入信息以提交修改 git commit -m <message> # 或 唤起文本编辑器编辑信息以提交修改 git commit # 将工作区的修改跳过暂存区直接提交 git commit -a
查看
-
查看当前状态,可查看所在分支、涉及修改的文件
git status # 精简方式查看 git status -s # 显示的结果左侧有两列,左列标明文件是否暂存,右列标明文件是否修改 # 如果有文件被修改,查看 filename 的修改情况 git diff <filename>
-
查看提交记录
git log # 显示信息太多?可以试试下面的命令,每条记录只在一行中显示 git log --oneline git log --pretty=oneline
回退
-
回退
# 回退一步 git reset --hard HEAD^ # 回退两步 git reset --hard HEAD^^ # 回退100步 git reset --hard HEAD~100 # 回退到指定版本 # git reset --hard <commit> git reset --hard 1094a
-
查看操作记录,比如可以查看回退的操作记录,回退之后反悔可用
git reflog
概念
工作区(Working Directory):文件夹下能看到的目录
暂存区(stage/index):一般在 .git/index 中
版本库(Repository):指 .git 文件夹
master分支
HEAD:是指向当前分支引用的指针,它指向该分支上的最后一次提交。
git add git commit
----> ---->
工作区 ------------------ 暂存区 --------------- 版本库
<----
丢弃工作区 暂存区回到工作区
git checkout git reset
+-------+ +-------+ +-------+
| 工作区 | | 暂存区 | | 版本库 |
+-------+ +-------+ +-------+
| | |
| git add | git commit |
| ========> | =========> |
| git checkout |
| <===================== |
| git reset |
| <======== <========= |
进一步
查看修改
-
查看工作区的修改
# 查看工作区的修改,即未暂存的修改,// 比较工作区和暂存区 git diff git diff <filename>
-
查看暂存区的修改
# 查看暂存区的修改,即将会被提交的内容 git diff --cached # or git diff --staged ???# 比较工作区和版本库 ???git diff HEAD -- <filename>
撤销
-
修改上一次的提交信息
git commit --amend
-
撤销暂存区修改
# 撤销已暂存的文件,仅将修改由暂存区转到工作区,不会丢失修改的内容 git reset git reset HEAD <filename>
-
撤销工作区修改
# 撤销工作区中对文件的修改,会丢失修改的内容 git checkout -- <filename>
删除
-
删除文件
# (此变更即被保存到暂存区) # 删除文件且取消对文件的跟踪 git rm <filename> # 在资源管理器中删除需使用 git add 才能得到 git rm 的效果 # 仅取消对文件的跟踪,不删除文件, git rm --cached <filename>
移动文件
-
移动文件/重命名
git mv <file_from> <file_to>
远程仓库
这是与 SVN 有差别的地方
初始
-
本地有仓库,需要关联远程仓库
git remote add [shortname] [url] git remote add origin git@github.com:<github_username>/<respo_name>.git
-
本地无仓库,从 github 上 clone 到本地
git clone <git_url>
Git支持多种协议,包括
https
,但通过ssh
支持的原生git
协议速度最快。Git支持多种协议,默认的
git://
使用ssh,但也可以使用https
等其他协议。使用
https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
获取数据
-
fetch
# 从远程仓库获取所有本地仓库没有的数据,需手动合并到本地 git fetch [remote-name]
-
pull
# 自动获取远程数据,并合并到本地 # 相当于 git fetch 与 git merge 的组合 git pull
推送数据
-
第一次推送到远程仓库
git push -u origin master # -u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
-
以后本地提交后,推送到远程仓库
git push origin master
分支
基础
查看
##查看分支列表(已合并的、未合并的)
git branch [--merged|--no-merged]
# 查看每个分支的最新提交
git branch -v
##查看图形化分支与指针的情况
git log --oneline --decorate --graph --all
创建
##创建一个名为testing的分支
# git branch [branchname] [commit]
git branch testing
切换
##切换分支
# 会使工作区目录文件发生变化,所以切换分支前必须使工作区保持干净
git checkout [branchname]
合并
##合并分支
# git merge [branchname]
# 当前在master分支,将iss53分支合并过来
git merge iss53
删除
##删除分支
git branch -d [branchname]
远程分支
远程分支是指向远程仓库的分支的指针,存于本地且无法移动,当与服务器通信时才会自动更新
表示形式:(remote)/(branch)
# 拉取本地所没有的远程更改(只拉取数据,不会自动合并)
git fetch
# 删除远程分支
git push origin --delete <branch>
变基
要整合不同的分支,最简单的办法是使用
merge
命令,merge
会对两个分支上的最新提交及其最近的共同祖先进行一次三方合并,并创建一个新的合并提交。还有另外一种方式,即变基操作(rebase),吧某个分支上所有提交的更改在另一个分支上重现一遍。
——《精通Git》
注意:不要对已经存在于本地仓库以外的提交执行变基操作。
(另一种说法:)对本地尚未推送的更改进行变基操作,从而简化提交历史,但决不能对任何已经推送到服务器的更改进行变基操作。
总之,变基可能会带来痛苦,所以不能掌握的情况下尽量不用。
标签
-
查看
# 列举标签 git tag # 查看某标签 git show <tag>
-
创建
-
注释标签(annotated)(推荐)
git tag -a <tagname> [-m <msg>] git tag -a v1.4 -m "my version 1.4"
-
轻量标签(lightweight)
# git tag <tagname> [commit] git tag v1.4-lw
-
补加标签
在之前的某次提交时添加标签
git tag -a <tagname> <commit>
-
-
共享标签
git push
默认不推送标签到远程服务器上,需要手动推送git push origin <tagname> # 推送所有tag git push origin --tags
-
检出标签
# 在特定标签上创建一个分支 git checkout -b [branchname] [tagname] git checkout -b version2 v2.0.0
其他
配置
Git配置级别:系统>全局>项目
系统配置:/etc/gitconfig
全局配置:~/.gitconfig 针对单个用户
项目配置:.git/config
# 显示当前的Git配置(全局的、系统的)
git config --list [--global|--system]
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
忽略文件
.gitignore 文件
规则:
- 空行或#开头的行会被忽略
- 以斜杠(/)开头的模式禁止递归匹配
- 以斜杠(/)结尾的模式表示目录
- 以感叹号(!)开始的模式表示取反
- 支持标准的glob模式
- 星号(*)匹配零个或更多字符
- 方括号([])匹配其中的任意单个字符
- 问号(?)匹配任意单个字符
GitHub 维护了一份相当全面的 .gitignore 参考实例列表 https://github.com/github/gitignore
储藏(stash)
当想转到另一个分支,但是有不希望把工作区做了一半的工作提交,可以使用 stash
命令,将修改保存在一个包含未完成变更的栈中。
# 储藏
git stash
# 查看储藏列表
git stash list
# 应用储藏
git stash apply [stashname]
# 应用储藏并丢弃
git stash pop
# 丢弃储藏
git stash drop [stashname]
# 从储藏创建分支,并丢弃储藏
git stash bransh <stashname>
清理
清理工作区目录
# 删除没有被忽略的未跟踪文件
git clean
# 删除没有被忽略的未跟踪文件病清空所有子目录
git clean -d
# 删除被忽略以及未跟踪的文件
git clean -x
## -n 演习模式,该选项将告诉会删除什么,可确保操作无误
# 然后使用将 -n 换成 -f 进行实际操作或 -i 交互式操作
搜索
git grep
# 在工作区中搜索 hello
git grep hello
reset 与 checkout
重置(reset)
1 工作流
reset
命令执行的操作(1)
git reset --soft
移动HEAD分支的指向
(2)git reset [--mixed]
使索引看起来像HEAD
(3)git reset --hard
使工作目录看起来像索引——《精通Git》
#使用时
# 根据选项将重置HEAD指针、暂存区、工作区
# --hard : 重置工作区【危险命令】
# commit : 指定重置的 commit,无则为上一次
git reset [--hard] [commit]
2 带路径使用
##带路径使用,重置暂存区
# //使暂存区看起来像HEAD //撤销暂存区文件 //git add 的反操作
git reset <filename>
git reset
检出(checkout)
$ git help checkout
git-checkout - Switch branches or restore working tree files
切换分支或重置工作区
# 切换分支,通过修改 HEAD 的指向目标分支实现
git checkout <branch>
# 重置工作区,参数中带有 -- 或 文件路径名
git checkout [--] <filename>
git checkout <filename>