目录
1.基础介绍
分区
Git 本地仓库管理,可以分为三个区:
-
工作区(Working Directory):是可以直接编辑的地方。
-
暂存区(Stage/Index):数据暂时存放的区域。
-
版本库(commit History):存放已经提交的数据。
基础指令
命令 | 作用 |
---|---|
cat 文件名 | 查看文件具体内容 |
vim 文件名 | 与Linux的vim操作类似 |
clear | 清空终端 |
git
的工作流程图
2.本地仓库
创建本地仓库
命令 | 作用 |
---|---|
git init | 创建本地版本库 |
提交
命令 | 作用 |
---|---|
git add 文件名 | 提交文件到暂存区 |
git add | 提交所有修改文件到暂存区 |
git commit -m "提交说明" | 提交暂存区文件到版本库 |
git revert <commit> | 对指定创建⼀个undo的 commit,并应⽤到当前分⽀ |
查看状态
命令 | 作用 |
---|---|
git status | 获取当前仓库的状态,查看是否有修改未提交的文件 |
查看文件修改情况
命令 | 作用 |
---|---|
git diff 文件名 | 查看工作区文件具体修改内容。(工作区与暂存区) |
git diff --cached 文件名 | 查看暂存区区文件具体修改内容。(暂存区与版本库) |
git diff HEAD -- 文件名 | 查看文件在工作区和版本库里面最新版本的区别。(工作区与版本库) |
查看历史记录
命令 | 作用 |
---|---|
git log | 查看提交历史记录,可以看到版本号、分支、修改者、修改时间以及提交说明 |
git log --pretty=oneline | 查看提交历史记录,只显示版本号、分支与提交说明 |
git log --graph | 查看分支的合并图 |
git log --oneline | 查看提交历史记录,更进一步,只显示简短版本号、分支与提交说明 |
git reflog | 查看命令的历史记录 |
按Q可以退出log状态。
回退版本
命令 | 作用 |
---|---|
git reset --hard HEAD^ | 回退到上个版本 |
git reset --hard head^^ | 回退到上上个版本(以此类推) |
git reset --hard head~ | 回退到上个版本 |
git reset --hard head~100 | 回退100个版本 |
git reset --hard 版本号 | 回退到指定commit-id的版本 |
reset 回滚有三种类型:
- Mixed 此为默认方式 回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
- soft 回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
- hard 回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
撤销修改
命令 | 作用 |
---|---|
git checkout -- 文件名 | 若暂存区有文件,回退到暂存区所在状态;否则回退到版本库状态。(其中 -- 不可缺 ,否则为切换分支命令,--前后有空格) |
git reset head 文件名 | 丢弃暂存区修改 |
删除文件
命令 | 作用 |
---|---|
rm 文件名 | 删除工作区的文件 |
git rm 文件名 | 删除工作区文件,并且将这次删除放入暂存区(注意: 文件修改后加入暂存区无法删除) |
git rm -f 文件名 | 强制删除工作区文件,并且将这次删除放入暂存区 |
git rm --cached 文件名 | 删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区 |
3.远端仓库
操作远端仓库
命令 | 作用 |
---|---|
git remote add <remote> git@.... | 本地仓库连接GitHub远程仓库(<remote>一般取名为origin)(该操作一般是处理先有本地仓库,推送至远端新仓库) |
git remote | 查看所有关联的远程主机的名称 |
git remote -v | 查看所有关联的远程主机的名称与其对应的 URL |
git remote show <remote> | 查看某一个远程仓库的更多信息 |
git remote rename <pb> <paul> | 远程仓库重命名,将 pb 重命名为 paul |
git remote rm <remote> | 移除与某一个远程仓库的关联。(不是删除远程库) |
git clone git@... | 克隆远端仓库(现有远端仓库) |
Git支持多种协议,包括https
,但ssh
协议速度最快。
拉取
命令 | 作用 |
---|---|
git pull <remote> <branch> | 从远程库的<branch>分支拉取内容合并到本地库的当前分支 |
git pull <remote> <remote-branch>:<local-branch> | 从远程库的<remote-branch>分支拉取内容合并到本地库的<local-branch>分支(不存在则新建) |
git pull | 从远程库相关联的分支拉取内容合并到本地库的当前分支。(注意是在建立追踪关系后) |
git pull --rebase origin <branch> | 从远程库拉取内容合并到本地库。(加上 --rebase 选项,git内部会自动检测,合并的结果会丢弃一些提交) |
git fetch <remote> | 更新所有分支 |
git fetch <remote> <branch> | 更新远端指定分支到当前分支 |
git fetch <remote> <remote-branch>:<local-branch> | 更新远端指定分支到本地指定分支 |
推送
命令 | 作用 |
---|---|
git push <remote> <branch> | 把当前分支推送到远程库<remote>的<branch>分支。远程库没有<branch>分支默认会创建 |
git push <remote> <local-branch>:<remote-branch> | 把本地库的<local-branch>分支推送到远程库<remote>的<remote-branch>分支。远程库没有<branch>分支默认会创建 |
git push -u origin <branch> | 把本地库的<branch>分支推送到远程库的<branch>分支。第一次推送加上 -u 参数,建立了追踪关系 |
git push | 把本地库当前分支的内容推送到远程库相关联的分支。(注意是在建立追踪关系后) |
git push <remote> --delete <branch> | 删除远程分支 |
git push 失败可以试试命令git pull --rebase origin <branch>,或者是检查有没有commit之类的。
分支
命令 | 作用 |
---|---|
git branch <branch-name> | 创建新分支<branch-name> |
git branch | 查看分支及当前所在分支 |
git branch -v | 查看本地所有分支的最后一次提交 |
git branch -vv | 查看本地所有分支的最后一次提交。(包括和远程分支的追踪关系。) |
git branch -r | 查看远程分支 |
git branch -a | 查看本地分支和远程分支 |
git merge <branch-name> | Fast-forward模式合并指定分支<branch-name>到当前分支(Fast-forward:快进模式,也就是直接把master 指向dev 的当前提交,所以合并速度非常快。) |
git merge --no-ff -m "提交说明" <branch-name> | 强制禁用Fast-forward模式合并指定分支<branch-name>到当前分支(这样从分支历史上就可以看出分支信息) |
git branch -d <branch-name> | 删除分支<branch-name>(对象是已经合并到当前分支且要删除的分支) |
git branch -D <branch-name> | 强行删除分支<branch-name>(对象是没有合并到当前分支但要删除的分支) |
git switch <branch-name> | 切换到分支<branch-name> |
git switch -c <branch-name> | 创建并切换到新分支<branch-name> |
git checkout <branch-name> | 切换到分支<branch-name>(区别此前撤销修改的命令git checkout -- 文件名) |
git checkout -b <branch-name> | 创建并切换到新分支<branch-name> |
git checkout -b <branch-name> <remote>/<branch> | 创建并切换到新分支<branch-name>,并链接追踪到远端仓库<remote>的<branch>分支 |
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
分支冲突
在master
分支和feature1
分支各自都分别有新的提交,分支树变成了这样:
直接使用git merger
会提示合并冲突,可以使用git status
查看冲突的文件名。
打开冲突文件会看到Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。
修改后add、commit并再次push即可解决问题。
bug分支处理
当前工作区任务还未达到提交的时刻,却要到其他分支处理任务。直接切换分支会导致当前工作内容清空,可以把工作现场存储起来,事后恢复。
命令 | 作用 |
---|---|
git stash | 把当前工作现场存储起来 |
git stash list | 查看stash列表 |
git stash apply | 恢复工作现场 |
git stash apply <stash-num> | 恢复到指定的工作程序(<stash-num>通过git stash list查看) |
git stash drop | 删除存储的工作现场 |
git stash pop | 恢复的同时把stash内容也删了 |
git cherry-pick <commit-id> | 复制某次提交操作到当前分支并自动提交(可用于处理修改源分支bug后,到子分支修改bug的情况) |
rebase变基
-
rebase操作可以把本地未push的分叉提交历史整理成直线;
-
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
例:
在这里,你可以用”pull
“命令把”origin
“分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的”合并的提交”(merge commit):
使用命令:
$ git checkout mywork $ git rebase origin
这些命令会把你的”mywork
“分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase
“目录中),然后把”mywork
“分支更新 到最新的”origin
“分支,最后把保存的这些补丁应用到”mywork
“分支上。
建立追踪关系
命令 | 作用 |
---|---|
git push -u origin <branch> | 把本地库的<branch>分支推送到远程库的<branch>分支。第一次推送加上 -u 参数,建立了追踪关系 |
git branch --set-upstream-to=<remote>/<branch> <local-branch> | 手动建立本地分支与远程分支的关联 |
git checkout -b <local-branch> origin/<branch> | 在本地创建和远程分支相关联的分支。本地和远程分支的名称最好一致 |
标签
命令 | 作用 |
---|---|
git tag <tagname> | 给当前所在分支的最新commit打上标签 |
git tag <tagname> <commit-id> | 给指定<commit-id>打上标签 |
git tag -a <tagname> -m "说明文字" <commit-id> | 创建带有说明的标签,用-a 指定标签名,-m 指定说明文字 |
git tag | 查看所有标签 |
git show <tagname> | 查看具体标签信息 |
git tag -d <tagname> | 删除本地指定标签 |
git push <remote> <tagname> | 推送标签到远端仓库 |
git push <remote> --tags | 一次性推送全部尚未推送到远程的本地标签 |
git push <remote> :refs/tags/<tagname> | 删除远端标签 |
4.github
Pull Request
这里以廖老师的pull request仓库GitHub - michaelliao/learngit: 教程→ https://www.liaoxuefeng.com/wiki/896043488029600 推送请使用UTF-8编码https://github.com/michaelliao/learngit进行测试:
首先点击右上角fork到自己的github仓库:
在自己仓库进行某些修改后,申请pull request:
当然,别人不一定接受。。。
5.自定义Git
忽略特殊文件
对于某些配置文件例如数据库密码的配置文件,我们不希望push到远端仓库。
可以在Git工作区根目录下创建一个.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:GitHub - github/gitignore: A collection of useful .gitignore templates
忽略文件的原则是:
-
忽略操作系统自动生成的文件,比如缩略图等;
-
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; -
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
命令 | 作用 |
---|---|
git add -f <file> | 强制添加被忽略的文件 |
git check-ignore | 检查.gitignore文件错误 |
把指定文件排除在.gitignore
规则外的写法就是!
+文件名
6.推荐学习网站
本文学习整理自:
Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
git rebase命令 - Git教程™ (yiibai.com)
github的pull Request使用 - 俄小发 - 博客园 (cnblogs.com)
感谢!