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
1
2

以dev为基准将test的提交进行回放,挨个的应用到dev上去,然后test的那些提交就会废弃。 等价于git merge dev。

git merge 和git rebase区别:

  • merge不会修改提交历史,rebase会修改提交历史 。
  • rebase只应用于本地没有提交的代码,如果应用到已经提交到远程的分支不要应用,不然会非常的麻烦,git merge 可以应用于远程分支。

浏览器的performance使用

参考:浏览器performance使用