—Git使用
Git配置
设置签名
项目(仓库)级别
仅在当前本地库有效
git config user.name tom #设置用户名tom git config user.email liu@qq.com #设置用户邮箱 复制代码
系统用户级别
仅在当前登录的操作系统用户有效
git config --global user.name tom git config --global user.email liu@qq.com 复制代码
优先级别:
项目级别
>系统级别
信息保存位置:
~/.gitconfig 文件
忽略文件.gitignore
当我们有无需上传至线上仓库的文件,比如我们项目中的npm包(node_modules),它在我们项目中是很重要的,但是它占的内存也是很大的,所以一般我们用Git管理的时候是不需要添加npm包的.此时我们只需在项目中新建一个.gitignore文件,并写入node_modules/
,git在之后的操作会自动忽略node_modules的所有文件
.gitignore相应书写规则
Git四个关键区域
对于git操作流程,主要有一下四个关键区域:工作区(workspace),暂存区(Index),本地仓库(Repository),远程仓库(Remote)
- 工作区
本地电脑存放项目文件的地方 - 暂存区
就是将文件暂存的地方,通常使用add命令将工作区文件添加进暂存区内 - 本地仓库
通常通过commit等命令将暂存区提交给master分支上,也就是意味打了一个版本,也可以说代码提交到了本地仓库中
4. 远程仓库
线上的git服务器,如gitlab,github,gitee上的项目就是一个远程仓库
Git操作指令
一.工作区
1.新建仓库
将工作区中的项目配置git进行管理,将项目使用git初始化
git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除
复制代码
从远程仓库拉取项目:
git clone <url>
复制代码
2.向暂存区提交文件
提交工作区所有文件至暂存区
git add .
复制代码
提交工作区指定文件至暂存区
git add <file 0> <file 1> .....<file n>
复制代码
提交工作区指定文件夹至暂存区
git add [dir]
复制代码
3.撤销删除
撤销、丢弃工作区的修改。也就是就是让这个文件回到最近一次git commit或git add时的状态。
git checkout --<file>
复制代码
同时删除工作区和暂存区文件
git rm <file1> <file2>
复制代码
取消暂存区已经暂存的文件:
git reset HEAD <file>...
复制代码
3.查看信息
查询当前工作区所有文件的状态
git status
复制代码
比较工作区中当前文件和暂存区之间的差异
git diff
复制代码
二.暂存区
1.向版本库提交文件
提交更改
git commit -m [message]
复制代码
把暂存区的指定文件提交到本地仓库中的当前所在分支
git commit [file1] [file2] ... -m [message]
复制代码
2.查看信息
比较暂存区与上一版本的差异
git diff --cached
复制代码
比较暂存区指定文件与上一版本的差异
git diff <file-name> --cached
复制代码
查看历史记录
git log #可以显示所有提交过的版本信息
git reflog #常用(可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作))
git log --greph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
复制代码
3.分支管理
创建分支
git branch <branch-name>
复制代码
从当前分支切换到其他分支
git checkout <branch-name>
复制代码
删除分支
git branch -d <branch-name>
复制代码
指定分支合并到当前分支
git merge <分支名>
复制代码
显示本地仓库的所有分支
git branch
复制代码
4.解决冲突
- 第一步:编辑,删除特殊标记
<<<
===
- 第二步:修改到满意位置,保存退出
- 第三步:添加到缓存区
git add 文件名
- 第四步:提交到本地库
git commit -m '日志信息'
注意:后面一定不能带文件名
三.本地仓库
获取远程仓库信息
git fetch <远程主机名> <分支名>
复制代码
将本地仓库某分支推送到远程仓库上
git push [remote-name] [branch-name]
复制代码
查看远程仓库的详细信息
git remote show origin
复制代码
取回远程主机某个分支的更新,再与本地的指定分支合并
git pull
复制代码
Git中的分支
一.Git中的HEAD和master
在git中,我们可以把HEAD理解成一个指针,这个指针指向我们的开发分支。如下图所示,当我们当前处于master分支时,HEAD指向了master分支。
此时,当我们(checkout)检出到dev分支时,那么HEAD指针就会指向dev指针。
git checkout dev
git branch
* dev
master
复制代码
当我们在dev上进行开发提交,dev就会指向当前分支的最新提交,而master分支依旧保持master之前的提交状态
当我们把dev合并到master上,git将master指向dev 的当前提交,完成合并
git checkout master
git merge dev
复制代码
二.git fetch + git merge(git rebase) = git pull(大多数情况)
理解了以上HEAD、master和开发分支的关系是通过指针联系起来,我们可以借此思想顺便理解git fetch + git merge (git rebase) = git pull的原因
当线上master的位置随着其他人的代码文件提交。线上的master将与本地orgin/master不再对应。本地master也与线上master所处的位置不在同一分支
目标
解决这个问题,我们需要将本地开发分支改成如下情况
我们可以使用git pull一次性完成取回远程主机某个分支的更新,再与本地的指定分支合并,也就是直接把远程仓库版本迭代到本地仓库和远程仓库关联库上,也可以使用以下方法完成我们的目标。但问题是git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,会别急难找到出错的地方。同时本地工作目录在未经确认的情况下就会被远程分支更新,所以会比较推荐使用git fetch
git fetch + git merge(git rebase)
git fetch后本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果存储于版本库(Repository),也就是图中版本A1,A2
当我们把git merge 改变为 git rebase也会有大致相同的效果,并且此时开发分支master并没有合并过后的痕迹