一、背景
在开发过程中,我们基本都是使用Git进行代码管理,Git命令是必须要会的,下面就把Git常用命令总结下来。
二、Git命令
1、init & clone
# 在当前目录新建一个仓库
git init
# 在一个目录下新建本地仓库
git init [project-name]
# 克隆一个远程仓库
git clone [url]
2、config
# 查看配置
git config [--local][--global][--system] --list
# 查看当前git环境详细配置
git config -l
# 查看系统config
git config --system --list
# 查看当前用户配置
git config --global --list
# 查看当前仓库配置信息
git config --local --list
# 查看全局账号
git config --global user.name
# 查看全局邮箱
git config --global user.email
# 修改配置
git config [--local][--global][--system] section.key value
# 设置当前项目的用户名
git config --local user.name [用户名]
# 配置当前用户的编码项,可以解决中文编码问题
git config --global core.quotepath false
# 配置当前项目不忽略文件大小写,git默认忽略文件名的大小写,这点值得注意
git config --local core.ignorecase false
3、remote
# 查看远程仓库地址命令
git remote -v
# 删除远程仓库地址
git remote remove origin
# 添加远程仓库地址 http://.....
git remote add origin [url]
# 查看remote 地址,远程分支,还有本地分支与之相对应关系等信息
git remote show origin
# 删除那些远程仓库已经不存在的分支
git remote prune origin
# 建好 develop 分支的跟踪中央仓库分支
git checkout -b develop origin/develop
4、branch
# 创建分支
git branch [branch-name]
# 查看当前分支
git branch
# 查看本地和远程的所有分支
git branch -a
# 查看远程所有分支
git branch -r
# 查看本地分支与远程分支的映射关系
git branch -vv
# 切换分支
git checkout [branch-name]
创建dev分支,然后切换到dev分支
# git checkout命令加上 -b 参数表示创建并切换,相当于以上两条命令
git checkout -b [branch-name]
# 删除一个分支
git branch -d [branch-name]
# 强制删除一个没有合并的分支
git branch -D [branch-name]
# 删除远程分支dev
git push origin :[branch-name]
# 更新分支列表信息
# -p 表示删除不存在的远程跟踪分支
git fetch -p
# 清理无效的远程追踪分支
git remote prune origin
5、add
# 从工作区添加指定文件到暂存区
git add [file-name1] [file-name2] ...
# 将工作区的被修改的文件和新增的文件提交到暂存区,不包括被删除的文件
git add .
# u指update,将工作区的被修改的文件和被删除的文件提交到暂存区,不包括新增的文件
git add -u .
# A指all,将工作区被修改、被删除、新增的文件都提交到暂存区
git add -A .
6、commit
# 将暂存区所有文件添加到本地仓库
git commit -m "[massage]"
# 将暂存区指定文件添加到本地仓库
git commit [file-name-1] [file-name-2] -m "[massage]"
# 将工作区的内容直接加入本地仓库
git commit -am "[massage]"
# 快速将当前文件修改合并到最新的commit,不会产生新的commit。
# 在提交commit后发现还有部分文件修改忘记提交了可以是用该命令
git commit --amend
加 -m
是指直接在后面写上版本的注释,不加 -m
的话会用一个vim打开文件让你写入massage,有未追踪的文件将会失败,需要 add
加入暂存区。
7、pull & push
# 从远程仓库拉取代码到工作空间
git pull
# 从远程仓库拉取指定分支代码
git pull origin [branch-name]
# 将文件添加到远程仓库
git push
# 将代码推送到指定的远程分支
git push origin [branch-name]
# 强制将代码推送到指定的远程分支
git push --force origin [分支名称]
# 强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此是本地HEAD指向比远程库还要旧
git push -f
# 推送当前本地分支到指定远程分支
git push origin [branch-name]
# 退到/进到 指定的commit【sha码】,然后强制推送到远程
git reset --hard [commit_id]
git push origin HEAD --force
# 删除远程分支
git push origin --delete [分支名称]
8、log & reflog
# 查看分支历史
git log
# 简化查看分之历史
# 没有pretty的是,只有commit id 前7位,加pretty的是全部的id
git log --oneline
git log --pretty=oneline
# 图形式展示分支历史
git log --graph
# 简化版图形式展示分支历史
git log --graph --oneline
# 简化版图形式展示分支历史附带展示已经修改的文件
git log --graph --oneline --name-only
# 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
# 使用git reset --hard命令改变了HEAD指向某个版本后后,还可以用git log --reflog查看所有版本。
git log --reflog
# 查看最新3条commit日志数据
git log -3
# 查看某个文件的修改记录
git log -p [filename]
# 显示操作本地版本库的命令,包括commit和reset等,
# 在回退版本以后又后悔找不到commit id了可以使用此命令查看历史
git reflog
9、diff
文件对比
在我们不指定专门的文件夹的时候,git diff
默认比较的是整个项目 git
目录。
# 工作区与暂存区比较
git diff
# 工作区与 HEAD ( 当前工作分支) 比较
git diff HEAD
# 工作区比较上次的提交
git diff HEAD^
# 工作区比较上两次提交,于是有了,git diff HEAD~n 是比较上n次提交与现在工作区间的关系
git diff HEAD~2
# 查看add的文件修改内容
git diff HEAD [filename]
# 工作区与暂存区文件比较(查看未add的文件修改内容)
git diff [filename]
# 工作区比较特定提交
git diff [commitId]
# 工作区与特定提交文件进行比较
git diff [commitId] [filepath]
# 暂存区与 HEAD 比较
git diff --cached
# 暂存区比较 HEAD 的某个文件差异
git diff --cached _posts/blog/2019-02-16-git.md
# 当前分支与 branchName 分支进行比较
git diff [branchName]
# 当前分支的文件与branchName 分支的文件进行比较
git diff [branchName] [filepath]
# 查看某两个版本之间的差异
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c
# 查看某两个版本的某个文件之间的差异
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename
10、reset
当对整个版本进行操作
# --soft 其中可选参数soft表示单纯的切换HEAD指向的commit-id
# --mixed 默认值mixed参数表示先执行上面一步,然后再将commit-id里面的内容更新到暂存区
# --hard hard表示先执行上面两步,然后再将暂存区内容同步到工作区
git reset --{soft|(mixed)|hard} HEAD
# 用上两个版本里的所有文件撤回到暂工作区
git reset --hard HEAD^^
# 用指定版本的所有文件撤回到工作区
git reset --hard [commit id]
当对当个文件进行操作
# 对单个文件操作时候只能用mixed参数,而且还是可省略
# 对单个文件操作时候HEAD指向不会变
# 将commit中指定的文件同步到暂存区中
git reset HEAD [file-name]
# 将指定commit-id中的文件替换掉暂存区的文件
git reset [commit-id] [file-name]
11、merge
# 用于合并指定分支到当前分支
git merge [branch-name]
# 退出当前分支合并,当合并后冲突很多,要撤回合并分支就可以用这个命令
git merge --quit
# 准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
# 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
# 而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m [massage] [branch-name]
12、checkout
# 切换分支
git checkout [branch]
# 最好加--,没有的话就把它当作切换分支看待,切换到另一个分支了,如果没有这个分支也会把它当作文件执行。
# 用暂存区的文件覆盖掉工作区的文件
# 如果暂存区没有可更新的就会用commit的文件更新工作区的文件
git checkout -- [file-name]
# 创建并切换分支
git checkout -b [new-branch-name]
# 从远程仓库里拉取一条本地不存在的分支
git checkout -b [本地分支名] origin/[远程分支名]
# 如果出现提示
# fatal: Cannot update paths and switch to branch 'dev2' at the same time.
# Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
# 表示拉取不成功。我们需要先执行,然后在执行上面命令
git fetch
git checkout -b [本地分支名] origin/[远程分支名]
13、stash
# 隐藏当前工作的修改
# 如果不隐藏自己修改的半成品代码,就会发生切换到别的分支后,将然后自己的半成品代码带入其他分支,这样就发生很多不必要的麻烦。
git stash
# 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
git stash save message
# 查看隐藏的工作信息列表
git stash list
# 删除隐藏的工作信息
git stash drop
# 恢复隐藏的工作信息,同时删除隐藏的工作信息
git stash pop
# 恢复指定的隐藏工作信息,但是不会删除隐藏的工作信息
git stash apply [stash@{0}]
14、cherry-pick
适用于在其他分支上修复了bug,但是这个bug在当前分支上依然存在,所以可以复制这个commit的过程,不必重写代码。文章来源:https://www.toymoban.com/news/detail-851258.html
# 这个是复制一次commit提交,然后在当前分支上重新提交一遍;也就是将指定commit的合并到当前分支;
git cherry-pick [commit-id]
# 将某个分支的多次commit合并到当前分支
git cherry-pick [commitHashA] [commitHashA]
# 将某个分支的commitA到commitB的所有commit合并到当前分支
git cherry-pick [commitHashA]..[commitHashA]
# 使用该命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。
git cherry-pick [commitHashA]^..[commitHashA]
15、rebase
合并多次 commit
提交。文章来源地址https://www.toymoban.com/news/detail-851258.html
# 合并多次提交
# 非关键性的提交太多会让版本历史很难看、冗余,所以合并多次提交也是挺有必要的。
# 同样是使用以上的变基命令,不同的是变基命令打开的文本编辑器里的内容的修改。
# 将pick修改为squash,可以是多行修改,然后保存退出。
# 这个操作会将标记为squash的所有提交,都合并到最近的一个祖先提交上。
# 注意:不能对的第一行commit进行修改,至少保证第一行是接受合并的祖先提交。
# -i参数表示进入交互模式。
git rebase -i <commit range>
# 合并前两个历史提交,
# 会弹出vim修改信息,修改第二行的pick为s,或者为squash,squash为合并的意识,
# 然后保存退出编辑,会打开第二个vim编辑,合并并修改commit内容,
# 保存退出会产生一个新的commit id,这样就合并了两个commit
git rebase -i HEAD~2
16、show
# 显示此次提交的修改
git show [commitid]
到了这里,关于Git 基本命令汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!