一份前端老菜鸟的Git总结
简介及安装
Git 是一个开源的分布式版本控制系统,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与 SVN 区别
Git 是分布式的,SVN 不是
:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
Git 把内容按元数据方式存储,而 SVN 是按文件
:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
Git 分支和 SVN 的分支不同
:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
Git 没有一个全局的版本号,而 SVN 有
:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
Git 的内容完整性要优于 SVN
:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Windows 平台上安装
安装包下载地址: gitforwindows.org/
官网慢,可以用国内的镜像: npm.taobao.org/mirrors/git…
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到 "Git" -> "Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
Mac 平台上安装
安装包下载地址: sourceforge.net/projects/gi…
工作流程及原理
Git 的通用操作流程如下图所示:
主要涉及到四个关键点:
工作区(workspace)
: 本地电脑存放项目文件的地方,我们平时开发写的代码也是在这个区进行的;
暂存区(Index)
: 暂时存放文件的地方,通过add
命令可以将工作区的文件添加到暂存区内;
本地仓库(Repository)
: .git
文件夹里还包括git
自动创建的master
分支,并且将HEAD
指针指向master
分支。使用commit
命令可以将暂存区中的文件添加到本地仓库中;
远程仓库(Remote)
: 项目代码在远程git服务器上,通常使用clone
命令将远程仓库拷贝到本地仓库中,开发后通过push
推送到远程仓库中;
SSH和HTTPS
使用SSH
和HTTPS
的主要区别如下:
如果是使用HTTPS
拉代码的话,每次从远程仓库拉取、提交代码都需要输入账号密码;
如果是使用SSH的话,从远程仓库拉取、提交代码都会比较本地和平台上传的SSH,如果一致就验证通过,否则验证失败!
Windows 平台上创建SSH
键入cmd
,打开系统的命令提示符;
键入命令: ssh-keygen -t rsa -C "email@email.com","email@email.com"
,此时你的C:\Users\admin\.ssh
路径会生成id_rsa
、id_rsa.pub
两个文件;
使用记事本打开id_rsa.pub
文件,复制文件的内容,并添加到 Github 的 SSH 密钥管理页面;
常用命令
Git 常用命令如下:
配置信息
查询配置信息
列出当前配置: git config --list
;
列出repository配置: git config --local --list
;
列出全局配置: git config --global --list
;
列出系统配置: git config --system --list
;
设置配置信息
配置用户名: git config --global user.name "your name"
;
配置用户邮箱: git config --global user.email "youremail@github.com"
;
其他配置信息
配置 Git 命令输出为彩色: git config --global color.ui auto
;
配置 Git 使用的文本编辑器: git config --global core.editor vi
;
工作区操作
新建仓库
创建一个新的本地仓库: git init
;
提交
提交工作区所有文件到暂存区: git add .
;
提交工作区指定文件到暂存区: git add <file1> <file2> ...
;
提交工作区中某个文件夹中所有文件到暂存区: git add [dir]
;
撤销
删除工作区文件,并且从暂存区删除对应的文件记录: git rm <file1> <file2> ...
;
从暂存区删除文件,但是工作区保留文件: git rm --cached <file1> <file2>...
;
取消暂存区已经暂存的文件: git reset HEAD <file>...
;
撤销工作区指定文件的操作: git checkout -- <file>
;撤销工作区所有文件的操作: git checkout -- .
;
更新文件
重命名文件,并将已改名文件提交到暂存区: git mv [file-original] [file-renamed]
;
Git 的文件命名默认情况下是不区分大小写的
暂存区操作
提交到本地仓库
将暂存区的文件提交到本地仓库: git commit -m "commit-info"
;
将工作区和暂存区的文件一起提交到本地仓库: git commit -am "commit-info"
;
覆盖上次的commit
记录,并将暂存区的文件提交到本地仓库: git commit --amend -m "commit-info"
;
本地仓库操作
从远程仓库拉取代码并合并到本地: git pull <remote-name> <remote-branch>:<local-branch>
,使用rebase
的模式进行合并: git pull --rebase <remote-name> <remote-branch>:<local-branch>
;
从远程仓库中抓取本地仓库中没有的更新: git fetch [remote-name]
;
从远程仓库抓取所有分支的更新: git fetch --all
;
将本地仓库某个分支推送到远程仓库上: git push [remote-name] [branch-name]
,如果想将本地分支推送到远程仓库的不同分支: git push <remote-name> <local-branch>:<remote-branch>
;
远程仓库操作
从远程仓库克隆项目: git clone <url>
;
查看本地仓库关联的远程仓库: git remote
,加上-v
的参数后,会显示远程仓库的url
地址;
添加远程仓库,一般会取一个简短的别名: git remote add [remote-name] [url]
;
查看远程仓库的详细信息: git remote show origin
;
移除远程仓库: git remote rm [remote-name]
;
分支操作
创建分支: git branch <branch-name>
;
从当前分支切换到其他分支: git checkout <branch-name>
;
新建并切换到新建分支: git checkout -b <branch-name>
;
删除分支: git branch -d <branch-name>
;
强制删除分支: git branch -D <branch-name>
;
将当前分支和指定分支进行合并: git merge <branch-name>
;
显示本地仓库的所有分支: git branch
;
显示远程仓库的所有分支: git branch -r
;
显示本地仓库和远程仓库的所有分支: git branch -a
;
查看哪些分支已经合并到当前分支: git branch --merged
;
查看当前哪些分支还没有合并到当前分支: git branch --no-merged
;
把远程分支合并到当前分支: git merge <remote-name>/<branch-name>
;
重新命名分支: git branch -m <old-branch-name> <new-branch-name>
;
差异比较
比较工作区中当前文件和暂存区之间的差异: git diff <file-name>
;
比较暂存区文件和本地仓库的差异: git diff --cached
;
指定文件在暂存区和本地仓库的差异: git diff <file-name> --cached
;
其他操作
查询当前工作区所有文件的状态: git status
;
查看最近的三条提交历史(单行显示): git log --oneline -3
;
git tag(标签)
列出所有的标签: git tag
;
搜索符合特定条件的标签: git tag -l "v1.4.2.*"
;
创建一个轻量级标签: git tag v1.5
;
创建一个含备注类型的标签: git tag -a v1.4.2 -m "commit-info"
;
使用git show
命令查看对应标签的版本信息,并连同显示打标签时的提交对象: git show v1.4.2
;
将标签推送到远程仓库中: git push origin v1.4.2
;
将本地所有标签全部推送到远程仓库中: git push origin --tags
;
git stash(暂存)
隐藏当前变更,以便能够切换分支: git stash
;
查看当前所有的暂存列表: git stash list
;
应用最新的储藏: git stash apply
,如果想应用其他的储藏: git stash apply stash{0}
;如果使用pop
命令不仅可以重新应用储藏,还可以立刻从堆栈中清除stash
: git stash pop
;
.gitignore
.gitignore
文件的作用是不再管理指定的文件修改。
语法规范
空行不匹配任何文件,因此它可以作为可读性的分隔符;
以 #
开头的行是注释;
斜线 /
用作目录分隔符;
*
匹配除斜杆以外的任何内容;
?
匹配除斜杆以外的任何一个字符;
**
与完整路径名匹配的模式中的两个连续星号具有特殊含义:
- 前导
**
后跟斜杠表示在所有目录中匹配; - 尾随的
/**
匹配里面的所有内容; - 斜杆后跟两个连续的星号,然后斜杠匹配零个或者多个目录;
- 其他连续的星号被视为常规星号,将根据之前的规则进行匹配;
!
表示不忽略匹配到的文件或者目录;
配置文件示例
# 忽略所有目录下文件名为a的任何文件
a.*
# 忽略所有目录下后缀为txt的文件
*.txt
# 不忽略所有目录下的c.txt文件
!c.txt
# 忽略file目录下所有文件,包括其他目录下的file目录下的文件
# 例如 a/file下面的文件会被忽略
file/
# 只忽略当前file目录下所有文件,不包括其他目录下的file目录下的文件
# 例如 a/file下面的文件不会被忽略
/file
# 忽略任何位置file目录下的所有文件
file
# 忽略任何位置file目录下的所有文件 同file
**/file
# 忽略任何直接位于c目录下的file目录下的所有文件
**/c/file
# 同file/
file/**
# 忽略a/file,a/c/file,a/c/d/file 目录下的所有文件
a/**/file
当
.gitignore
配置发生冲突时,后面的配置会覆盖前面的配置
.gitignore 不生效的解决方案
git rm -r --cached .
git add .
git commit -m "update .gitignore"
参考资料
转载自:https://juejin.cn/post/7028459321667092488