目录
查询所有git操作(*此操作会展示每一步操作的hashId)
合并分支场景一(注:记得加上 --no-ff,不加会采用fast-forward方式合并,以后可能会产生各种问题。)
基础版
查询用户名
git config user.name
查询邮箱
git config user.email
修改全局用户名
git config --global user.name "用户名"
修改全局邮箱
git config --global user.email "邮箱"
添加所有更改到暂存区
git add -A
提交暂存区内容
git commit -m"此次提交备注"
查询本地分支
git branch
查询远程分支
git branch -r
切换分支
两种方式:
- git switch 分支名(新命令)
- git checkout 分支名
创建并切到该分支
git switch -c"分支名"(新命令)
删除指定分支
git branch -d"分支名" ( 注:-D 会强制删除,慎用! )
修改最后一次提交备注(*注意是 最后一次 提交)
git commit --amend
合并多条commit记录
git rebase -i HEAD~要合并的记录的个数(其实这块也可以写为git rebase -i commitId,但是合并时,并不会包含此commitId的commit记录)
注意1:在执行完此命令后,会转到vim编辑,按下 i 后,进入编辑状态,把将要被合并掉的记录前面的 pick 改为 s ,一般情况下只剩下最早一次(通常是第一行)提交的 pick,其他的都改为 s。然后 wq保存,进入修改备注的步骤,按下 i 进入编辑状态,更改备注,wq保存,OK。
注意2:如果这个过程中有操作错误,可以使用
git rebase --abort
来撤销修改,回到没有开始操作合并之前的状态。
强制版本回退(*注意此操作会强制删除提交,慎用)
git reset --hard"commitId"
查询所有git操作(*此操作会展示每一步操作的hashId)
git reflog
回退到任意一步git操作之前
git reset --hard"hashId"
合并分支场景一(注:记得加上 --no-ff,不加会采用fast-forward方式合并,以后可能会产生各种问题。)
git merge 要合并的分支名 --no-ff
注意:此操作会将要合并分支上的所有与本条分支不同的commit全部合并过来。经常要解决冲突。解决完冲突别忘了保存后add和commit。
合并分支场景二(注:记得加上 --squash。)
git merge 要合并的分支名 --squash
注意: --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。
合并其他分支上的某条commit到当前分支上
git cherry-pick "commitId"
注意:此操作仅仅会将目标commitId这一条提交上所修改的内容合并到当前分支上。所以慎用。
使用 stash 相关命令,将代码暂存起来
使用场景:开发中,经常有这种情况:正在分支1开发功能,但是需求提了一个紧急bug要马上处理。此时分支1的工作才进行了一半,必须要切到其他分支去处理bug,但此时你却不想commit,那么stash就派上用场了,它可以将已修改的代码暂存起来。下面看看怎么使用它(本文只说有关stash的常用命令,不常用的不提):
- 第一步(当前在分支1):git add -A (注意:这步很重要,如果不add,新增的文件是不能放到暂存区的)
- 第二步:git stash save "备注"(注意:备注很重要,为了以后方便的找到想要的暂存记录)
- 第三步:切到其他分支进行bug或紧急需求的处理,直到处理完毕到第四步。
- 第四步:从其他分支切回 分支1
- 第五步:git stash apply (注意:这里使用apply命令,它的作用是,将stash list(暂存列表)中的最新一条取出来或者说是复制出来,因为apply命令并不会将最新的一条暂存记录从stash list中删除。这里要区别一下git stash pop命令,pop也是取出stash list中最新的一条暂存记录,但是pop命令会删除stash list中最新的一条暂存记录。建议使用apply命令!!!)
好了,上面这五个步骤,就可以解决上面提出的场景了
有关stash的其他几条命令:
- git stash list:查看stash list(暂存列表),这里会展示每个stash记录的序号。
- git stash drop stash@{stash记录序号}:删掉指定序号的暂存记录。
- git stash clear:删掉所有的暂存记录(慎用)。
进阶版
使用 git rebase 合并代码(注:它和merge的区别:merge合并的时候回新增一个(多个)commit,并且指向两个(多个)父级(不是一条直线);而rebase合并的时候会在另一个分支上新增一个(多个)commit,并且指向一个父级(是一条直线))
命令解释:将 当前分支 合并到 分支1
- git rebase "分支1"
命令解释:注意注意注意:将 分支2 合并到 分支1(顺序别搞反了)
- git rebase "分支1" “分支2”
分离HEAD指针
通常情况下HEAD都是指向当前的分支的,并且会随着当前分支的指向变化而变化。特殊场景下可能会将HEAD指针和当前分支分离开来,直接使用命令:
- git switch "commitId" 或 git checkout "commitId"
将HEAD指针指向某个commit
^ 和 ~
场景一:当前分支是一条直线
- HEAD:代表当前HEAD指向的commitId
- HEAD^: 代表当前HEAD指向的commitId的上一级(父级)
- HEAD^^:
- HEAD^^^: 以此类推
场景二:当前分支是分叉的(假设HEAD有两个父级)
- HEAD^1:代表当前HEAD指向的commitId的正对父级(同一条直线)
- HEAD^2:代表当前HEAD指向的commitId的非正对父级(不在同一条直线)
场景三:
- HEAD~1:代表当前HEAD指向的commitId的上一级(父级)
- HEAD~2:代表当前HEAD指向的commitId的上两级(父父级)
- HEAD~3:以此类推
git cherry-pick 的使用方法
命令解释:依次 将 "commitId3" "commitId1" "commitId2" 三条commit记录(这三条记录可以来自不同的分支)合并到当前分支。(注:此命令合并完是一条直线。并且重要的是它是按照顺序将commit记录合并到当前分支的)
- git cherry-pick "commitId3" "commitId1" "commitId2"
git rebase -i 的使用方法
命令解释:执行以下命令可进入一个编辑交互页面,页面依次列举了 commitId0 以下的所有提交,你可以根据需要,对commit记录进行重新排序等操作
- git rebase -i "commitId0"
git tag 的用法
命令解释:给 commitId0 打上标签 v1,此命令常用语版本的标记
- git tag v1 "commitId0"
reset 和 revert
命令解释:将当前的分支指向 commitId0。注意:此操作是直接改变了指针指向,使用此命令后,commitId0 之后的提交将消失。此处要说的是,也是reset和revert的重要区别:使用git reset 命令后,如果你想把当前的分支推向远程,可能就推不上去了,因为此时远程的分支比你本地的要新(本地已经回退到了旧的commitId)。
- git reset ”commitId0“
命令解释:此命令比较神奇,下面操作的结果:新建一个commit(自动完成),这个commit是复制于commitId1的父级。也就是说revert命令同样可以进行版本回退,但它不是直接将指针直接指向旧的commit,而是复制一个新的commit,将指针指向新的commit。此时我们便可以将当前的分支推向远程了(本地的分支比远程的要新)。
- git revert "commitId1"
此处必须说明一个容易踩到的坑,重要重要重要:举个例子,一目了然:假设我们在当前分支有三个提交:commitId0 -> commitId1 -> commitId2(当前分支指向commitI2),现在我要用revert 命令回退到commit0,应该使用命令git revert commitId1 (注意注意注意:此处是commitId1,不是commitId0)。此时,提交记录变为:commitId0 -> commitId1 -> commitId2 -> commitId0' (commitId0' 是复制于 commitId0 的)
fetch 和 pull
简单的说,git pull 是 git fetch 和 git merge 两步操作的简写。
如下两份命令,操作结果是一样的:(当前分支为master)
- git pull
- 第一条命令:git fetch 第二条命令: git merge o/master
git fetch 命令会将远程仓库的所有分支更新到本地,但不合并,之后可以使用git merge (相当于git pull)或者 git rebase 等命令,将当前的分支与拉下来的最新远程分支进行合并。例如(当前分支为master):
- git fetch
- git merge o/master(将master与远程的最新master进行合并)
- git fetch
- git merge o/dev(将master与远程的最新dev进行合并)
pull 和 pull --rebase
- git pull:相当于git fetch 和 git merge 两条命令的结合
- git pull --rebase:相当于git fetch 和 git rebase 两条命令的结合
因此,这两条命令的区别就很明显了,其实本质上就是git merge 和 git rebase 的区别。