Git 操作
Git 相关配置
git config --global user.name "用户名"
git config --global user.email "有效的邮箱地址"
Git 基础操作
-
初始化
本地仓库git init
在文件夹内使用该命令后,会新增一个
.git
文件夹 -
查看文件的
状态
git status
进入本地版本查看工作区、暂存区中文件的状态
-
将工作区的文件
添加
到暂存区git add 文件名 git add 文件名1 文件名2 ... git add X*X # *为通配符
在文件执行
git add 文件
之前,执行git status
,未添加到暂存区的文件名称显示红色。 将工作区的文件添加到暂存区后,执行
git status
,文件名称显示绿色。 -
将文件从暂存区
撤回
到工作区git rm --cached 文件名
-
将暂存区的文件
提交
到本地版本库git commit [文件名] -m "提交说明" # 文件名不填,代表暂存区的所有文件夹和文件全部提交到本地版本库 git commit -m "提交说明" # 不指定文件名,意味着将暂存区的所有文件全部提交到本地版本库
-
将
本地版本库
中的文件添加到远程仓库
# 与仓库地址建立远程连接 git remote add origin 远程仓库地址 git push -u origin 分支名 git push -u origin master # 推送 master 主分支 到 远程仓库 git push -u origin testing # 推送 testing 主分支 到 远程仓库
-
查询当前仓库远程路径
git remote -v
-
克隆远程仓库
git clone 远程仓库地址
-
从远程仓库获取的文件合并到本地的版本
git pull git pull origin 远程分支名:本地分支名 # 与本地分支合并 git pull origin 远程分支名 # 远程分支与当前分支合并
-
testing
分支代码更新,将testing
分支代码合并到主分支master
上git checkout master git pull origin master git merge testing
git push origin master
~~~
`git merge`合并代码存在冲突时,需要手动解决冲突后继续提交
-
将在工作区的文件修改,继续提交到本地版本库
git add 文件名 git commit [文件名] -m "提交说明"
git commit -a -m "提交说明" # 未被追踪的文件不能使用
可以看到,未被追踪的文件,不能从工作区直接提交到版本库,使用
-a
也不行 -
查看
暂存区
文件列表git ls-files
-
查看
本地版本库
文件列表git ls-files --with-tree=HEAD
在 Git 中进行忽略文件操作(不需要的文件可以不提交)
-
在根目录创建名为
.gitignore
的文件,将要忽略的文件名添加进去,之后 Git 就会自动忽略这些文件。 -
.gitignore
文件本身要放在版本库里,并且对.gitignore
做版本管理,不提交到本地版本库或者远程仓库,只对本地副本有效 -
文件
.gitignore
格式如下:- 空行或者以
#
开头(注释)的行会被 Git 忽略 - 匹配模式可以以
/
开头,防止递归 - 匹配模式最后以
/
结尾,表示忽略的是目录 - 在模式前加
!
取反,表示忽略指定模式以外的文件或目录
- 空行或者以
-
匹配正则表达式
-
*
表示匹配零个或者多个任意字符 -
[abc]
表示匹配中括号里面中的一个 -
?
表示只匹配任意一个字符 -
[0-9]
表示匹配所有 0 到 9 的数字 -
**
表示匹配任意中间目录,a/**/a
可以匹配a/z
、a/b/z
或a/b/c/z
等
-
-
示例
忽略 public 下的所有目录的文件 /public/* 不忽略 /public/assets !/public/assets 忽略具体文件 index.html 忽略所有的 java 文件 *.java 忽略 a.java b.java 文件 [ab].java 忽略 doc/ 目录及其所有子目录的 .pdf 文件 doc/**/*.doc 忽略 doc/ 目录下的所有 .txt 文件,但不忽略 doc/server/ 下的 .txt 文件 doc/*.txt 忽略任何目录下的名为 build 的文件夹 build/ 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO 文件 /TODO
git diff
命令
-
说明:在
commit
操作之前,确定要提交的文件更改了哪些地方 -
比较
工作区
和暂存区
中文件的差别git diff [文件名] git diff --stat [文件名] # 显示有多少行发生的变化,简洁的展示差异
-
比较
暂存区
和本地版本库
中文件的差别git diff --cached [文件名] git diff --staged [文件名] # 作用同上,git 1.6.1 版本可用 git diff --stat --cached [文件名] git diff --stat --staged [文件名]
-
补充
git diff HEAD [文件名] # 比较 工作区 和 最新本地版本库 提交的差异 git diff <commit-id> # 比较 工作区 和指定 commit 提交的差异 git diff --cached commit-id # 比较 暂存区 和指定 commit 提交的差异 git diff [<commit-id1>] [<commit-id2>] # 比较两个 commit 提交之间的差异
Git 文件重命名
-
直接修改
工作区
文件的名称,使用git status
会发现修改前文件被删除,新增一个刚刚重新命名后的文件,且新增文件未被追踪。执行git add 删除的文件 新增的文件
,使用git status
查看,Git
会分析出在进行文件重命名的操作,再次提交到本地版本库
即可。 -
直接使用
git mv
命令git mv 文件原名称 文件新名称 # 相当于执行上述所有的步骤,Git 分析出文件已被重新命名,再次进行 提交 即可 # 相当于执行了 mv 文件原名称 文件新名称 git rm 文件原名称 git add 文件新名称
Git 删除
-
仅删除
暂存区
文件git rm --cached 文件名 # 通过 commit 提交,也可将 本地版本库 的文件也删除
恢复已删除文件
# 方法1: 将 工作区 中被删除的文件再次 添加 并 提交 # 方法2 git reset --mixed HEAD
-
将
工作区``暂存区``本地版本库
中某文件全部删除git rm 文件名 # 再次 commit 提交即可
Git 撤销
-
撤销
工作区
文件的修改,但没有提交到暂存区git restore 文件名 git checkout -- 文件名 # 用法同上,但新版 Git 不建议使用此法
-
撤销暂存区文件的修改,但没提交到本地版本库
git restore --staged 文件名 # 仅从暂存区撤销到工作区,不会撤销工作区文件的修改 # git reset HEAD 文件名 # 用法同上,但新版 Git 不建议使用此法 git restore 文件名 # 两步完成撤销暂存区文件的修改
Git 查看历史版本记录
-
查看详细的历史版本记录,包括
commit-id
,作者的信息
,提交的时间
,提交说明信息
git log [文件名] # 文件名不写,就是查询所有,信息较多的话,可以按`q`提前结束查看 # 查看最近两次提交的信息 git log -n2 [文件名]
-
简化显示历史版本记录
git log --oneline [文件名] # 简化查看最近两次提交的信息 git log --oneline -n2 [文件名]
-
以简单
图形
的方式查看分支版本历史git log --all --graph [文件名]
- 翻页与退出
- 上下键:可以看上一行和下一行
- 回车:显示下一行
- 空格:显示下一页
q
键:退出git log
命令显示界面
- 翻页与退出
-
查看指定分支版本历史
git log 分支名称
-
查看所有的历史版本
git log --all
-
拓展
- 查看指定文件的修改记录
git blame 文件名
-
git reflog
查看历史提交版本,与git log
的差异git log
只可以查看HEAD
指针及其之前的版本信息,如果版本发生回退操作,HEAD
指针之后仍存在历史提交版本的情况,而这些提交通过git log
命令看不到。git reflog
可以查看所有的历史版本信息
版本回退 git reset
git reset
回滚到指定的commit-id
-
移动
HEAD
指针的指向,指向了指定的提交版本,改变了本地版本库的文件版本,但不会改变工作区和暂存区中的文件的文本git reset --soft commit-id git reset --soft HEAD^ # 回退到上一版本 git diff --cached 文件名 # 回退后,对比工作区、暂存区与本地库中版本中文件的差别 # 若想要恢复到回退之前的版本,再次从暂存区提交即可
-
移动分支
HEAD
指针的位置,且将暂存区
中的数据也回退到了指定版本git reset --mixed commit-id
-
移动分支
HEAD
指针的位置,且将工作区
和暂存区
中的数据也回退到了指定版本git reset --hard commit-id # 想要恢复到回退之前的版本,只能使用 git reset --hard commit-id 命令回退
撤销 git revert
提交一个新的commit-id
,来撤销之前的commit
-
revert
命令是撤回某个改动,不会删除任何commit
记录,而是新增一条revert
操作的commit
记录(会弹出commit
提交信息窗口)。 -
举例:
commit-1
和commit-2
是正常提交,commit-3
和commit-4
是错误提交。现在要把commit-3
和commit-4
撤销掉,此时,指针指向了commit-4
的提交。我们需要将HEAD
指针移动到commit-2
就可以达到目的。-
方法1
git reset --hard <commit-2>
-
方法2:先撤销最近的
git revert <commit-4> # 回车后输入 commit 提交信息,HEAD指针指向了这个新生成的版本,而不是<commit-4>的目标版本 git revert <commit-3>
-
-
移除某几次提交的修改
git revert <commit-n> <commit-n-1> <commit-n-2>
-
移除某几次连续提交的修改(含头不含尾,包含
<commit-新>
不包含<commit-旧>
)git revert <commit-新> ... <commit-旧>
-
git revert
和git reset
的区别
git commit --amend
命令
- 追加提交:在不新增
commit
下,将新修改的代码追加到前一次的commit
中。 - 刚刚的一次
commit
的描述不是很准确,需要对刚刚提交的描述信息重新修改。通过git log --oneline
可以查看提交信息的修改
git tag
标签
-
创建标签
-
标签的分类:
-
轻量标签:某个特定提交的引用
git tag 标签名 [commit-id] # 如果不指定 commit-id,默认 HEAD 指针所指向的提交
-
附注标签:轻量标签只有标签名称,而使用附注标签,还可以为标签添加说明
git tag -a 标签名 [commit-id] -m "说明信息"
-
-
-
查看版本库中的标签列表
git tag
-
查看版本库中,可匹配的标签列表
git tag -l "v*.*" # * 为通配符
-
查看指定标签的具体信息
git show 标签名
-
共享标签
默认情况下,
git push
命令不会传递标签到远程仓库服务器上,所以需要手动推送标签-
推送本地指定标签
git push 标签名称
-
推送本地所有标签
git push origin --tags
-
-
删除标签
-
删除本地标签
git tag -d 标签名 # 此命令并不会从任何远程仓库中移除这个标签
-
删除远程标签
# 第一种 git push origin --delete 标签名 # 推荐使用 # 第二种 git push origin :refs/tags/标签名
-
Git 分支管理
-
分支管理的好处
- 同时并行推进多个功能开发,提高开发效率
- 版本迭代更加清晰
- 利用代码
review
的实现,从而使整个团队开发更加规范,减少bug
率
-
创建分支
git branch 分支名 # 使用 git log --oneline 可以查看分支所在位置,但此时为切换到新建分支
-
分支切换
git checkout 分支名
-
创建分支并切换到该分支
git checkout -b 分支名 # 相当于 git branch 分支名 git checkout 分支名
-
查看分支列表
git branch # 在所在分支前面会显示 *
-
查看所有分支的最后一个提交
git branch -v
-
删除
分支- 删除分支的前提:必须要保证当前工作的分支,不是要删除的分支,如果是,则需要切换到其他分支,例如切换到主分支上。
git checkout master # 切换到主分支 git branch # 查看当前分支 # 分支没有合并到主分支,如果要删除它(删除无用分支) git branch -D 分支名 # D 是大写字母
-
新建一个分支并且使分支指向指定的提交对象
git branch 分支名 commit-id
-
拓展
git branch -b 分支名 commit-id # 相当于 git branch 分支名 commit-id git checkout 分支名
-