序言:日常工作中,git作为团队开发首选的版本控制工具,很多指令能够有效地提高工作效率,下面是我的一些常用git指令总结。
首先介绍下git的工作流程:
以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词。
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
工作区
程序员进行开发改动的地方,是你当前看到的,也是最新的。
平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
暂存区
.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
本地仓库
保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。
git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。
远程仓库
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
1. 分支(branch)
1. git branch:列出所有本地分支
2. git branch -r:列出所有远程分支
3. git branch -a:列出所有本地分支和远程分支
4. git branch <new-branch>:创建新分支
5. git checkout <branch/tag>:切换到指定分支或者标签
6. git checkout -b 新分支名 commitId:从某一次的commit拉取新分支
7. git branch -d <branch>:删除分支
8. git push origin --delete [branch-name] 删除远程分支
2. 标签(tag)
1. git tag "tag名称" commitId:基于某一次的commitId,创建tag
2. git tag "tag名称" -m "tag信息":创建tag
3. git tag -l -n:查看所有tag
4. git tag -l "xxx.*" 过滤查看以xxx为前缀的tag
5. git tag -d "tag名称":删除tag
6. git push origin "tag名称":将本地tag推到远程
7. git push origin :refs/tags/tag名称:本地tag删除了,再执行该句,删除线上tag
8. git checkout "tag名称":切换到某一次的tag,相当于一个快照,不能修改
2. 合并和衍合(branch和tag)
1. git cherry-pick <commitId>:合并其他分支的某一次commit到当前分支
2. git pull:从远程往本地分支更新代码(等价于 git fetch + git merge)
3. git pull --rebase:从远程往本地分支更新代码(等价于 git fetch + git rebase)
4. git rebase <branch>:衍合指定的新分支分支到当前分支,新分支内容不保存。
5. git rebase -i <commitId>:修改某一次的commit message信息。
6. git rebase -i HEAD~5:修改最近的5次提交(可修改、合并相关的commit信息)
7. git rebase --continue:在rebase的过程中,有时也会有conflict,这时Git会停止rebase并让用户去解决冲突,解决完冲突后,用git add命令去更新这些内容,然后不用执行git-commit,直接执行git rebase --continue,这样git会继续apply余下的补丁
8. git rebase --abort:在任何时候,都可以用git rebase --abort参数来终止rebase的行动,并且mywork分支会回到rebase开始前的状态。
9. git merge <branch>:合并指定的新分支到当前分支,新分支内容保存
3. 撤销操作
1. git reset --soft HEAD^:改变提交点,撤销最近的一次commit,暂存区和工作目录的内容都保留不改变
2. git reset --soft HEAD~2:改变提交点,撤销最近2次的commit,可以使用HEAD~2,暂存区和工作目录的内容都保留不改变,更多的可以类推。
3. git reset --hard <commitId>:改变提交点,撤销提交点之后的commit,且记录不再保存(不可逆)
4. git revert <commitId>:改变提交点,撤销提交点之后的commit,记录保存(可逆)
5. git reset --hard HEAD:让工作区回到上次commit时的状态
6. git checkout HEAD:撤销指定的未commit文件的修改内容
7. git stash:想切换到其他分支的时候,先将当前分支修改内容放在暂存区。切回来的时候,执行git stash pop可以恢复已修改但未commit的内容。
8. git stash -u:部分没有加入stash
9. git commit --amend -m [message]:使用一次新的commit,替代上一次提交
10. git checkout filename:撤销的是工作区中文件的修改。
11. git reset HEAD filename:撤销的是暂存区中文件的修改
4. git stash命令:
1. git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
2. git stash list :查看stash了哪些存储
3. git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
4. git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
5. git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
6. git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
7. git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
8. git stash clear :删除所有缓存的stash
5.diff指令
1. git diff : 查看工作区和暂存区之间所有的文件差异
2. git diff -- 文件名:查看具体某个文件 在工作区和暂存区之间的差异
3. git diff -- 文件名1 文件名2 文件名3:查看多个文件在工作区和暂存区之间的差异
【注意】:查看具体文件的时候 -- 和文件名 之间有一个 空格,文件名1 和 文件名2 和 文件名3之间也有空格
5.远程指令
1. git remote -v:查看远程版本库信息
2. git pull origin <branch>:从远程拉取代码至本地并快速合并
3. git push origin <branch>:上传本地代码至远程并快速合并
4. git clone -b 分支名 远程仓库地址:clone远程仓库某一分支内容
6. 查看记录与状态信息
1. git log :显示当前分支的版本历史
2. git log -p <file>:查看指定文件的提交记录
3. git blame <file>:以列表方式查看指定文件的提交记录
4. git status:显示有变更的文件
7. 其他
1. git diff:显示暂存区和工作区的差异
2. git rm -r --cached . :清除缓存 (可用于重新提交gitignore文件),执行完指令之后可重新add。
3. git rm --cached 文件路径: 删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制(防止单个文件过大,超过了100M),执行完指令之后可重新add。
4. git lfs(git large file storage):下载git lfs工具,解决大文件上传时保存索引。
5. git clean -d -fx:删除没有添加到git中的文件,执行完之后再pull
参考:https://blog.csdn.net/u012390519/article/details/79441706### (git push时,超过100M的处理方法)
参考:https://juejin.im/post/599e14875188251240632702