git【分布式版本管理系统】
git 相关命令
git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [ --man-path] [--info-path]
[-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare]
[--git-dir =<path>] [--work-tree=<path>] [--namespace=<name>]
[--super-prefix=<path>] [--config-env=<name>=<envvar> ]
<命令> [<参数>]
配置账号的邮箱
- git config --global user.name
ex: git config --global 'henkuaixuexi' - git config --global user.email
ex: git config --global 'henkuaixuexi@example.com'
检查配置信息
- git config --list
仓库初始化
- git init 【将当前目录初始化为git代码仓库】
- git init [project-name] 【新建一个目录,将其初始化为Git代码库】
克隆
- git clone [url] 【 url有两种类型 1、https 2、SHH】
远程仓库关联关系
// 如果想切换clone仓库类型
git remote -v // 查看远程仓库连接关系
git remote rm origin // 删除远程连接
git remote add origin [url] // 与远程仓库建立连接
// ------或者-----------
git remote set-url origin [url]【更换远程仓库地址】
提交
- git add -u 【git add --update的缩写 将被修改和删除的文件提交到暂存区】
- git add . 【将修改和新增的文件提交到暂存区】
- git add -A 【git add --all的缩写 提交修改、删除、新增的文件到暂存区】
commit
-
git commit -m type(scope): subject 【type必须 scopeke可选 subject必选】
ex: git commit -m 'feat: xxx功能开发'type: 用于说明git commit的类别,只允许使用下面的标识
| 标识 | 含义 |
|---|---|
| feat | 新功能(feature) |
| fix/to | 修复bug。fix:产生diff并自动修复此问题。适合于一次提交直接修复问题;to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix |
| docs | 文档(documentation) |
| style | 格式(不影响代码运行的变动) |
| refactor | 重构(即不是新增功能,也不是修改bug的代码变动) |
| perf | 优化相关,比如提升性能、体验。 |
| test | 增加测试 |
| chore | 构建过程或辅助工具的变动 |
| revert | 回滚到上一个版本 |
| merge | 代码合并 |
| sync | 同步主线或分支的Bug |
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。 例如在Angular,可以是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。如果你的修改影响了不止一个scope,你可以使用*代替。
subject是commit目的的简短描述,不超过50个字符。
注:修改完冲突, 我们会进行commit提交冲突修改. 不要使用git commit -m, 请直接使用git commit, git会识别你这是一个冲突提交。
状态管理
| 命令 | 含义 |
|---|---|
| git status | 查看本地文件变更情况 |
| git stash | 将本地变更提交到缓存区 |
| git stash list | 查看stash了哪些存储 |
| git stash show | 显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1} |
| git stash apply | 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} |
| git stash drop stash@{0} | 将stash@{0}次暂存删除 |
| git stash pop | 恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1} |
| git stash clear | 删除所有缓存的stash |
注:新增的文件,直接执行stash是不会被存储的 说白了就是没有在git 版本控制中的文件,是不能被git stash 存起来的 先add 再stash就好了~
push操作
-
推送变更到远程仓库 | 当前分支 | git push |git push origin release |git push origin release:dev | | --- | --- | --- | --- | | release |将本地relase分支推送到远端relese分支| 将本地relase分支推送到远端relese分支|将本地relase分支推送到远端dev分支 (好诡异的操作)|
-
创建一个新的分支,并将其推送到远程仓库
- git branch -b dev
- git push --set-upstream origin dev
分支管理
| 命令 | 含义 |
|---|---|
| git branch | 列出本地所有分支 |
| git branch test | 基于当前工作分支创建新的test分支 |
| git checkout test | 切换到test分支 |
| git checkout -b test | 创建并切换到test分支 = git branch test + git checkout test |
| git checkout -b test origin master | 基于远端master拉取本地test分支并切换到test分支 |
| git branch --merged | 查看已经合并到当前分支的分支 |
| git branch --no-merged | 查看没有合并过当前分支的分支 |
| git branch –d test | 删除本地test分支 |
| git branch -D test | 强制删除没有合并过的test分支 |
| git push origin --delete test | 删除远端test分支 |
| git branch --set-upstream-to=origin/test test | 关联远端test与本地test分支关联。本地分支下进行pull 和push操作时 ,便不需要指定远程的分支,直接git pull 或者 git push即可 |
| git branch -m test test1 | 本地分支test重命名为test1 |
| git merge test | 将test分支合并到当前分支 |
| git merge --abort | 存在冲突时,不想合并,可以取消这次合并 |
git branch | grep -v "test" | xargs git branch -D 删除本地除test分支以外的所有分支
git branch -r | grep -v "test" | xargs git branch -D -r 删除远端除test分支以外的所有分支
日志
| 命令| 含义 |博主心得||
| ------------ | --- |---|-----------||
| git log | 查看当前工作分支的commit日志 |好用!!!清楚的看到分支下的commit记录、作者、操作时间等 如图 ||
|git log --oneline|一行情书版|一行展示优雅完美|
|
git log -p|查看提交记录并且展示具体修改
|git log --oneline --graph test| 可以以图形的方式查看test分支commits,不加test就是查看当前工作分支|绝绝子!! 如下图|
|图示解读:星号表明这个提交所在的分支;最左边的直线表示当前分支的历史状态,从图看,当前分支HEAD是master分支 ;提交历史是:8cfbb25<--d486463<--a88c595<--fc46826<--275823b<--5d66385<--33c6d2e,箭头方向表示依赖方向,父节点方向|非当前分支的情况,方法是,顺着分支起点(有分支名字的地方)开始顺着曲线往下撸,遇到分叉(星号处才称之为分叉)点,往最左边走|分支test1的提交历史:d486463<--bb7cb66<--ac202c8<--8e64613(test1);下面来看下分支test2的提交历史:d486463<--811c466<--f3553f4(test2)|
|切换到分支test1,再看分支master的情况:<--<--<--<--d486463<--a88c595<--fc46826<--275823b<--5d66385<--33c6d2e(master)|
|借鉴前辈
git reflog --oneline|可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录、commit reset、merge 等所有操作)
diff
| 命令 | 含义 |
|---|---|
| git diff | 工作区和暂存区进行diff |
| git diff src/app.js | diff文件路径(git status)下的当前文件 |
| git diff test1 test2 | test1和test2diff |
| git diff --cached | 暂存区和远端diff |
| git diff HEAD | 工作区和远端diff |
还原和重置
- 还原
| 命令 | 含义 |
|---|---|
| git checkout . | 放弃工作区中的全部修改 |
| git checkout -- src/app.js | 放弃工作区中app.js文件(git status找到这个文件路径)中的修改 |
| git checkout [commitId] [file] | 恢复某个commit的指定文件到工作区 |
git checkout其实是就是用远端的版本替换工作区的版本
- reset
| 命令 | 含义 |
|---|---|
| git reset -- src/app.js | 重置暂存区的这个文件到上一次commit,工作区不变 |
| git reset --hard | 重置暂存区与工作区到上一次commit |
| git reset [commitId] | 重置当前分支的指针为指定commit,同时重置暂存区,但工作区保持不变 |
| git reset --hard [commitId] | 当前分支的HEAD为指定commit,同时重置暂存区和工作区 |
| git reset --keep [commitID] | 重置当前HEAD为指定commit,但保持暂存区和工作区不变 |
| git reset HEAD --src/app.js | 回退暂存区到工作区的修改,再执行git checkout -- src/app.js将会回退到上一次提交时的版本 |
| git reset --hard HASH | 返回到某个节点,不保留修改 |
| git reset --soft HASH | 返回到某个节点。保留修改 |
- revert
| 命令 | 含义 |
|---|---|
| git revert [commitId] | 新建一个commit,用来撤销指定commit(git log找到制定的commitId),后者的所有 变化都将被前者抵消,并且应用到当前分支 |
- clean
| 命令 | 含义 |
|---|---|
| git clean -n | 显示 将要 删除的 文件 和 目录 |
| git clean -f | 删除 文件 |
| git clean -df | 删除 文件 和 目录 返回到某个节点 |
变基
- 使用
rebase来将远程的变更整合到本地仓库是一种更好的选择。用merge拉取远程变更的结果是,每次你想获取项目的最新进展时,都会有一个多余的merge提交。而使用rebase的结果更符合我们的本意:我想在其他人的已完成工作的基础上进行我的更改。 - 使用 rebase 的交互模式可以重写提交历史
下面用例子来区分rebase与merge区别:
- 我们在master提交一次C1。
- 然后从master分支checkout出test分支,提交两次C2。
- 然后切回master,提交一次C3并且C3与C2修改同一行代码,制造冲突。
- 在master 上提交一次C4。
- 然后切换到test 上提交一次C5。
- 切换到master上合并test git merge test 生成的提交线为 C1 > C2 > C3 > C4 > C5 > C6,这是按照提交事件来进行合并,C6 为解决C2与C4造成冲突的新修改,但是, 用rebase就得到的不一样结果。
- 退回到merge之前的操作。
- 然后git rebase master 此时git提示代码冲突,处理冲突 git add.。
- git rebase --continue (加上--continue参数让rebase继续处理)
- 然后git checkout master。
- git merge dev
- 此时master处理完的提交线为 C1>C3>C4>C2>C5, 能够看出dev是变基线为master最新一次提交,然后再合并dev两次提交。
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
变基有风险~ 其他的本博主还没学废
tag 打标签
| 命令 | 含义 |
|---|---|
| git tag | 查看所有tag |
| git tag v1.0.0 | 为当前版本打一个1.0.0的tag |
| git tag v1.0.0 [commitId] | 在某一条commit上打v1.0.0的tag |
| git tag v1.0.0 -m 更新xxxx | 打上v1.0.0的tag并且添加message ‘更新xxxx’ |
| git push origin v1.0.0 | 将tag push到远端 |
| git tag -d v1.0.0 | 本地删除v1.0.0tag |
| git push origin :refs/tags/v1.0.0 | 远端删除v1.0.0tag |
注:根据git版本不同,一些命令可能有一些小差异啦~