Git
我看过很多GIt教程,平时还是自己多使用才容易记住,为了更快地理解这些GIt操作,我打算用QA的形式整理这些操作和作用,还有一个国外的网站教你如何快速地熟悉Git操作
基本使用
先来看一个 github 仓库,多人开发的案例。
- git clone github/xxx 克隆仓库。
- git checkout -b feature/xxx 新建自己的分支。
- 修改代码。
- git add xxx 暂存一段代码。
- git commit -m 'feat: xxx' 把暂存区的所有修改提交到分支上。
- git push 推送到远程仓库。
- 在 github 上提交 pull request 。
- 合并后删除 feature/xxx 分支。
如果你是个新手,上面的 git 命令已经可以满足日常开发的需要了,但为了深入了解 git,我们接着往下看。
基本操作 API
这些命令在代码回滚,合并产生冲突时,使用率很高。
git status 查看状态。
git diff 查看工作区和版本库里面最新版本的区别。
git log 查看提交记录。
git reflog 查看每一次命令记录。
git reset --hard commit_id 切换到指定提交版本。直接通过移动Head指针指向进行回滚(做减法)
git revert HEAD 发起一个新的 commit,用来撤销最后一次 commit。
通过提交一个新的commit(与之前某个版本内容相同实现回滚,做加法)
- git revert 不能操作文件
git stash 将当前改动先存起来。git stash pop 释放之前存入的改动。
分支管理
规范化的开发需要严格按照分支规范来进行,我们一般这样管理分支。
- master 线上代码分支。
- develop 主开发分支。
- 当无项目开发时,和 master 分支保持一致。
- 当有项目开发时,会包含正在开发的项目代码。
- feature/xxx 个人开发分支。
- 从 develop 分支上拉取代码,进行功能开发。
- 开发完成后,合并到 develop 分支。
- release 预发布分支。
- 从 develop 分支上拉取代码,交给测试去测。
- 测试发现比较大的 bug,在 feature 分支上修改后,合到 develop 分支上,在重新拉取。
- 测试发现的小 bug,直接在 release 分支上修改。
- 合并到 master 和 develop 分支上。
- hotfix 线上紧急修复分支。
- 从 master 分支拉取,修改代码
- 测试完毕后,直接合回 master 和 develop 分支。
分支相关的 API
- 查看分支:git branch
- 创建分支:git branch [name]
- 切换分支:git checkout [name]
- 创建 + 切换分支:git checkout -b [name]
- 合并某分支到当前分支:git merge [name]
- 删除分支:git branch -d [name]
- 建立本地分支和远程分支的关联:git branch --set-upstream branch-name origin/branch-name
Q:本地分支和远程分支没有关联导致提交失败,怎么处理?
A:我们可以使用git push origin 分支名
强制推送至远程,Git很人性化的给出了git push --set-upstream origin 分支名
这个命令提示,我们只要输入该命令之后,每次只需要git push
即可,不需要强制推送了
Q:当有紧急任务需要切换分支时,而目前开发的分支只完成了一半,又不想提交无效commit,该怎么做?
A:通过git statsh
把未提交的修改(包括暂存的和非暂存的)暂存起来,注意是暂存至本地,然后切换分支解决对应问题后,我们回到原来的分支,使用git statsh pop
可以取出刚刚修改内容,git statsh apply
也是同样的效果,不过该命令不会把修改内容在Git缓存堆栈中清除,可以应用至多个工作目录
Q:提交了很多commit到远程分支,但每个commit只有少量的改动,所以想将这些commit进行合并怎么操作?
A:假设我们合并前三个commit,首先用git log
查看最近的提交,然后执行git rebase -i 第四个commit的版本号
然后会跳出弹框,将将除了第一个的pick,其他都改为 s 或 squash(p表示保留该commit,s表示与前一个commit合并),修改后保存退出,再次输入git log
会发现提交已经合并,然后执行git push -f
将分支强制提交到远程
Q:执行了强制回滚Git reset --hard导致前面的修改都丢失了,并提交了新的commit,怎么把之前的修改恢复,并保留新的commit?
A:执行git reflog
可以查看之前所有的git操作,找到前面修改的hash码,然后用git reset --hard hash码
执行回滚,最新的commit的hash码也能够观察到,用git cherry-pick hash码
将新的commit内容合并进来,然后解决冲突即可
Q:介绍下Git rebase?
有test和dev两个分支,分别有两个commit,此时执行下列命令:
git checkout test
git rebase dev
2
以dev为基准将test的提交进行回放,挨个的应用到dev上去,然后test的那些提交就会废弃。 等价于git merge dev。
git merge 和git rebase区别:
- merge不会修改提交历史,rebase会修改提交历史 。
- rebase只应用于本地没有提交的代码,如果应用到已经提交到远程的分支不要应用,不然会非常的麻烦,git merge 可以应用于远程分支。