项目中我们经常用到git命令来进行项目管理,下面整理一些git的常用命令,基本上我都是自己试一个写一个,有很少部分没去试,有没写到的或错的后续会继续更新修改。
常用命令
- 初始化git仓库,会生成一个git文件,用来记录你的git操作
git init
- 克隆远程库,将远程库克隆到本地
git clone git地址
- 关联远程库
git remote add origin "仓库地址";
- git查看远程仓库地址命令
git remote -v
- 上传到暂存区,
// 上传某个文件
git add 文件名
// 上传所有文件
git add . / git add *(常用的,一般通过配合(.gitignore)文件忽略部分不必上传的依赖文件
//查看暂存区文件
git ls-files
git add 撤销
//撤销git add 某个文件
git reset HEAD 文件名
git reset HEAD(撤回所有git add文件)
- 提交到本地库(目前还没提交到远程,为待上传状态)
git commit -m '提交说明'
commit 撤销
//1 把最后的commit切回已经git add状态
git reset --soft HEAD"^"
//2 把最后的commit切回还没git add状态,保留修改
git reset HEAD^
add + commit:git commit -am '提交说明'
- 提交到远程库
//首次可以-u与当前远程库进行关联,后面提交可以简写
git push -u origin 分支名
//例如
git push -u origin master(主分支)
后面可以
git push origin 分支名 或者直接 git push
- 修改上一次提交说明文字
git commit --amend -m 'new Name'
git push
- 拉取远程最新更改
git pull
- 撤销文件修改,取消所有文件修改
//撤销部分文件
git checkout -- 文件名
//撤销全部文件
git checkout -- .
- 重命名文件和删除文件(已被git管理的文件才可以哦)
重命名:
git mv 原文件名1 文件名2
例如:
git mv index.html index1.html //把index.html修改为index1.html
删除:
rm 文件名 //不要误删哦,删了可以git reset HEAD
分支管理 branch
查看所有分支:git branch -a
查看当前分支:git branch
查看本地分支对接远程库:git branch -v / git branch -vv
创建分支:git branch 分支名
切换分支:git checkout 分支名 或者git switch 分支名
创建+切换分支:git checkout -b 分支名 或者 git switch -c 分支名
删除分支:git branch -d 分支名 做此操作前必须先切到其他分支,不可在当前分支做删除操作
删除远程分支:git push origin '空格':分支名 === git push origin -d 分支名
删除操作 例如: git push origin '' :test
修改分支名name1->name2:git branch -m 原名 修改名
提交本地分支到远程(当远程没有当前本地分支时可以使用):git push --set-upstream origin 分支名 //该命令会在远程新增一个和本地同名分支,并同步本地文件
拉取远程分支并在本地创建相同分支名 : git checkout -b 分支名 origin/分支名
<注意:当新建远程分支后,须在本地先git pull一下,检出远程新增分支,然后使用上述命令拉取新建远程分支到本地,最好取相同分支名>
状态及日志查看 log & status
查看当前版本库状态: git status
日志查看 git log 查看完按q键退出(quit嘛)
1. 直接在log命令之后,加 -n参数,n表示你要输出的数量: git log - 2
2. 简化git log的默认的输出,仅输出commit hash 前7个字符串和提交说明: git log --oneline
3. 在git log 的基础上输出文件增删改的统计数据: git log --stat
4. 控制输出每个commit具体修改的内容,输出的形式以diff的形式给出: git log -p || git show(默认HEAD)
5. 这个命令用来输出汇总信息,以作者进行分类: git shortlog
git shortlog -s:用来统计每个作者的提交数量。
git shortlog -n:用来对统计的量进行倒序排列。
6. 加--author用来过滤commit,限定输出给定的用户:git log --author="作者名"
7. 限定指定日期范围的log: git log --after(或者before) '11-30-2020'
8. 控制是否显示merge的commit: git log --merges || git log --no-merges
9. git log输出时,显示对应commit所属的branch和tag信息: git log --decorate --oneline
10. 历史提交并列显示:git log --pretty=oneline
11. 查看git详细操作日志 git reflog
12. 可以看到分支合并图更详细:git log --graph
13. 可以看到分支合并图更简洁:git log --graph --pretty=oneline --abbrev-commit
14. 查看远端分支:git log origin/master(分支名)
复制转移提交:cherry-pick
阮一峰 cherry-pick详细教程
一、基本用法
git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。
git cherry-pick <commitHash> || master
假如你需要在dev分支做了bug修改, 代码改完了也commit了 ,
然后发现写错分支了,我****,你想把master上的代码移到dev上,
这时你就可以使用cherry-pick来进行操作,在dev分支执行git cherry-pick master (hash也可以),
这时master的提交代码就过来了。(master已提交不会被清掉哦)
Cherry pick 支持一次转移多个提交:git cherry-pick hash1 hash2
Cherry pick 转移一系列的连续提交:git cherry-pick hash1^..hash5
例如:
git cherry-pick f5674^..0a7a7
假如不带这个^,则f5674不会被转过去,注意要按提交顺写,前些早提交,后写后提交。
其他配置项及代码冲突请移步到阮一峰大佬那去看,更详细。
变基:rebase
定义:rebase(变基)改变当前分支的基础分支版本(父版本)
注意:变基会改变提交历史,建议使用这个方法时 ,只在本地操作,不要推送到远程,并且不要在master分支执行。
和cherry-pick区别:由A转到B:
cherry-pick:在B中操作
rebase:在A中操作
在A分支中
执行git rebase B,会将B中的修改提交拉取到A中,并保留一个提交信息,
提交视图一条直线,更加清晰,不会像merge那样提交视图错乱,但是会缺失提交信息。不熟的话需慎用!!!搞项目还是merge稳妥点
解决冲突:修改文件(vi 文件名)-》git add .-> git rebase continue(可能执行多次)
忽略冲突:(放弃所在分支修改,使用其他分支):git rebase --skip(可能执行多次)
取消rebase:git rebase --abort
可以参考这篇文章的讲解:GIT变基
合并 merge
merge:合并分支
合并某分支到当前分支:git merge 某分支名 注意:(在当前分支做合并其他操作)
把b合并到a, 在a分支:git merge b
不会丢失合并信息:git merge --no--ff
git merge --no-ff -m "merge with no-ff" 分支名
版本回退 reset
commit之后如果没有提交远程可以回退当前版本
git reset --hard HEAD
2次回退:git reset --hard HEAD^^
50次回退:git reset --hard HEAD~50
回退到指定版本:git reset --hard commit_id
临时保存工作现场 stash
使用场景:当你在A分支开发时,发现B分支有一个bug需要紧急处理,你此时还没开发完毕,不想提交代码,你也不能切换到B分支,因为修改没有提交,这时就可以用git stash save "保存说明",先把修改存到缓存中,然后就可以切到B分支做处理。做完后回到A分支,继续你的开发git stash list 查看保存列表,然后git stash pop(默认取出第一条,并从列表中删除这条缓存),或者 git stash pop stash@{n},n为数字。或者git stash apply stash(默认取出第一条,不从列表中删除这条缓存,最好回来了就删除吧。省的以后开发影响)
stash:保存现场(临时保存)
1:建议:在功能未开发完成时,不要commit
2:规定:修改文件,在没有commit之前,不可切换分支(两个分支在同一时刻,是可以切换的)
如果还没有将某一个功能开发完毕;需要切换分支去修改bug,可以git stash;
保存现场:git stash
查看现场:git stash list
恢复现场:git stahs pop(将原来保存历史删除,用于还原内容)
恢复最近一次的现场:git stash apply(不删除保存历史,用于还原内容)
恢复最近一次的现场:git stash apply stash@{num}(num=1,2,3,4)
手工删除:git stash drop stash@{2}//删除最近第二次
清空stash:git stash clear
标签: tag
命令git tag 标签名 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
可以指定标签信息;命令git tag -a 标签名 -m "线上版本..." {创建新对象}
可以查看所有标签:命令git tag
删除标签:git tag -d v1.0
删除远程标签:git push origin '空格':refs/tags/v1.0
查询标签:git tag -l v1.0
查询标签:git tag -l 'v*'(模糊查询)
推送标签到远程:git push origin v1.0
推送全部本地标签到远程:git push origin --tags
查看修改、版本差异: diff
比较本地库和工作区差异:git diff
比较a,b分支差异:git diff a b:|| git diff -u a b
比较两个版本差异:git diff commit_id1 commit_id2
比较本地库和暂存区差异:git diff --cached commitID
比较最新本地库和暂存区差异:git diff --cached HEAD
查看两个版本文件的修改:git diff commit_id1 commit_id2 文件名
例如:
git diff commit_id1 commit_id2 /pages/detail/index.html
多人管理
多人管理;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
要查看远程库的信息,用git remote:
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
本地--》远程
第一次提交:git push -u origin/master
建立本地分支和远程分支的关联,使用git push --set-upstream origin 分支名
把当前分支指向新远程分支bug2: git push origin HEAD:bug2
远程--》本地
在本地创建和远程分支对应的分支,
使用git checkout -b 分支名 origin 分支名,本地和远程分支的名称最好一致;
git checkout -b dev origin dev
git checkout --track origin dev
查看无效分支:git remote prune origin --dry-run
删除无效分支:git remote prune origin
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
显示远程分支:git remote show origin
显示远程分支:git remote show
追责命令:git blame index.html
查看index.html的所有提交commitiD 和每行作者
常用分支名:
生产分支:master
开发分支:develop
测试分支:test
bug分支:bugFix
差不多了,工作中能用到也就那几个,如果有问题呢,可以评论留言,我来修改。其实vsode不用命令就可以直接操作了,推荐两个好用的vscode插件,GitHistory和GitLens,都不错,推荐使用
后续有啥好用的没写到,也可以下方提示一下,也要学习嘛,别掖着哈~ 谢啦~