前端进阶2-Git

127 阅读8分钟
  • 2.Git\

    • Git 简介\

      • Git是分布式版本控制系统,创始是Linux的作者\
    • Git 的工作区域和流程·\

      • 工作区域\

        • Workspace(工作区)就是平时进行开发改动的地方,当前看到最新的内容\
        • Index(暂存区)当执行 git add 的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被 Git 管理的\
        • Repository(本地仓库)位于自己的电脑上,通过 git commit 提交暂存区的内容,会进入本地仓库\
        • Remote(远程仓库)用来托管代码的服务器,通过 git push 命令同步代码到远程仓库\
      • 流程\

        • 1.在工作区开发,添加,修改文件。\
        • 2.将修改后的文件放入暂存区。\
        • 3.将暂存区域的文件提交到本地仓库。\
        • 4.将本地仓库的修改推送到远程仓库。\
    • Git 基本操作(add、commit、pull、fetch、branch)\

      • git add(添加文件到暂存区)\

        • git add .提交所有\
      • git commit(提交暂存的更改)\

        • git commit -m "you message"记录下备注\
      • git pull(从远程仓库拉取代码并合并到本地)\

        • git pull <远程主机名> <远程分支名>:<本地分支名>(等同于 git fetch && git merge)\
        • git pull --rebase <远程主机名> <远程分支名>:<本地分支名>(使用rebase的模式进行合并)\
      • git fetch(获取远程仓库特定分支的更新)拉代码\

        • git fetch <远程主机名> <分支名>\
        • git fetch --all(获取远程仓库所有分支的更新)\
        • 与 git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改,不会自动进行 merge 操作。对你当前的代码没有影响\
      • git branch(查看本地分支)\

        • git branch -r(查看远程分支)\
        • git branch -a(查看本地和远程分支)\
        • git branch -D (删除本地分支)\
        • git branch -m (重新命名分支)\
    • Git 命令总结\

      • git status——不知道该干嘛,就用它\
      • git init——初始化一个git仓库\
      • git add——修改加入暂存区\
      • git diff——查看不同(暂存区和工作区的差异)\

        • git diff --cached(本地仓库和暂存区的差异)\
      • git commit——本地提交\
      • git log——commit历史记录\
      • git rm——git删除\

        • 简化了删除,删除不经过暂存区,不用add直接commit\
        • 减少了暂存区的操作,可以在本地删除,同时也在git的版本库中删除\
      • git mv——git移动\

        • 减少了暂存区的操作,可以在本地重命名,同时也在git的版本库中重命名、移动\
      • git pull——拉取远程仓库\
      • git push——推送到远程仓库\
    • Git 远程仓库\

      • 远程与本地\

        • git clone\
        • git pull\
        • git push\
        • 多个远程仓库\
      • GitHub开启协作\
    • 为什么要用 git pull --rebase?\

      • 原理\

        • git pull === git fetch + git merge\
        • git pull --rebase === git fetch + git rebase\
      • 区别\

        • merge(会生成一个新的节点,之前的提交分开显示)\
        • rebase(操作不会生成新的节点,是将两个分支融合成一个线性的提交)\
      • 小技巧:别名\

        • git config --global alias.pull 'get pull --rebase'(直接覆盖原有的pull)\
        • git config --global alias.pr 'get pull --rebase'(保留原有的pull,用 pr 标识)\
    • Git branch & tag\

      • branch(迭代用)\

        • git branch(列出本地所有分支)\
        • git branch test(新建分支test)\
        • git checkout -b test(新建并切换)\
        • git checkout test(切换到test)\
        • git branch -b(删除分支)\
        • git push(推送分支到远程)\
      • 合并分支\

        • git merge\
        • git rebase\
        • 代码合并冲突解决\
      • tag(交付用)(常见的tag都是用来标记一个确定的release版本的)\

        • git tag(列出所有tag)\
        • git tag v1.0(打tag)\
        • git tag v1.1 f52c633(基于commit -id 打tag)\
        • git show v1.1(列出tag信息)\
        • git tag -a v1.2 -m "msg" 1094adb(指定commit -id,msg打tag)\
      • branch 对比 tag\

        • 修改\

          • 要修改(Branch)\
          • 不修改(Tag)\
        • 目的\

          • 面向交付(Tag)\
          • 面向迭代(Branch)\
        • 本质\

          • Tag(对单个commit快照)\
          • Branch(N个commit的合集)\
    • ***工作中使用 Git 解决问题的场景(rebase变基)\

      • ***git rebase(变基)\

        • 作用:git rebase 让你的提交记录更加清晰可读\
        • 使用rebase\

          • rebase 翻译为变基,他的作用和 merge 很相似,用于把一个分支的修改合并到当前分支上\
          • 大部分情况下,rebase 的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用依次 git add 、git rebase --continue 的方式来处理冲突,完成 rebase 的过程,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip 来跳过这次 rebase 操作。\
        • git merge 和 git rebase 的区别\

          • 总结\

            • 两者功能一样都是合并代码,但rebase形成的git提交历史记录简洁易懂\
            • 在解决冲突的时候,用 merge 只需要解决一次冲突即可\
            • git merge 在不是 fast-forward(快速合并)的情况下,会产生一条额外的合并记录\
          • git merge\

            • 把分支和主线的代码合并,并且形成一个新的提交\
            • 你建立分支的记录也会在最终git提交历史上有一个明显的展现\
          • git rebase\

            • 相当于把分支变基到主线,让整个提交非常笔直,只有一条线路\
        • 工作中的实际情况\

          • ①实际情况演示:\

            • 假如我们得知旧的主分支发生改变,我们重新git pull,但是与我们原本开发feature1新分支前的旧的主分支状态不同(如文件和依赖和测试)。那我们需要怎么让新的主分支同步到我们旧的主分支分出的feature1新分支里?\
          • 注意:不要用git merge合并分支代码\
          • ②此时体现了git rebase(变基)的用法\

            • git rebase master(把当前feature1的分支,重新变基到最新的master主分支上)\
          • ③feature1开发完毕后,严格测试后。把feature1的功能同步到master上去\
    • 日常开发流程\

      • 1.同步线上仓库remote master的代码,到本地仓库local master\
      • 2.接到需求完成feature1分支,在feature1上面我去做了相应的一些提交\
      • 3.然后我得到了组长的通知,线上的remote master有人提交了代码\
      • 4.我在本地需要把分支切换回master,做git pull操作去同步线上的更新\
      • 5.代码更新完毕后,我切换回feature1分支用git rebase master,把当前的feature1切换到最新的master上去\
      • 6.再对feature1做一个全量的测试,测试完毕后,把分支切换回master\
      • 7.进行git rebase feature1操作,把master和feature1做了一个合并\
      • 8.合并完成后,把本地的代码推到线上去,让线下和线上做一个同步\
    • Git stash\

      • 应用场景\

        • 有部分代码是多余的,想保留以后查看,但是又不想提交到远程分支\
        • 在进行多分支开发时,比如你在A分支上开发,但是突然发现B分支上有个bug需要修复,以前往往会把A分支上开发一半的功能本地commit,切换到B分支修复bug,然后再切换回A分支继续开发,这样往往log上会有大量不必要的记录。现在可以使用git stash将你当前未提交到本地(和服务器)的代码推入到Git的栈中,放心切换到B分支修复代码,完事儿后切换回A分支使用git stash apply将以前一半的工作应用回来\
      • 基本命令\

        • 保存当前代码\

          • git stash: 快速储藏代码,默认储藏名称为"WIP on <branch_name>\
          • git stash save "message": 执行储藏时,添加message信息,注明储藏名称,方便查找\
        • 查看stash代码\

          • git stash list: 查看stash列表\
          • git stash show: 查看第一个储藏做了哪些改动(并不是改动详情)\
          • git stash show stash@{num}: 查看其他储藏做了哪些改动\
          • git stash show -p: 查看第一个储藏的改动\
          • git stash show -p stash@{num}: 查看其他储藏做的改动\
        • 应用stash代码\

          • git stash apply: 应用第一个储藏,但不会删除\
          • git stash apply stash@{num}: 应用列表中的储藏\
          • git stash pop: 应用第一个储藏并删除\
          • git stash pop stash@{num}: 应用stash list中的储藏并删除,例如应用并删除第二个:git stash pop stash@{1}\
        • 删除stash代码\

          • git stash drop: 删除以一个储藏\
          • git stash drop stash@{num}: 删除stash list中的储藏,例如删除第二个:git stash drop stash@{1}\
          • git stash clear: 删除所有储藏的stash\
        • 以stash储藏创建一个分支\

          • git stash branch branchName stash@{1}: 创建新分支branchName,并切换到此分支,分支的状态与stash储藏时的状态一致,此时新分支应用的stash代码进了暂存区。\
    • 总结:\

      • git init 初始化git生成git仓库\
      • git status 查看git状态\
      • git add 添文件到暂存区\
      • git add .加入所有文件到暂存区\
      • git commit -m 'message'提交文件到本地仓库\
      • git reset 将尚没有commit之前加入到暂存区的文件重新拉回\
      • 文件状态:\
      • 1.没有被add过的文件叫untracked\
      • 2.add之后文件处于staged状态等待commite\
      • 3.commit之后文件处于unmodified这里之所以是modified是因为文件会跟仓库中的文件对比\
      • 4.当unmodified的文件被修改则会变为modified状态\
      • 5.modified之后的文件add之后将继续变为staged状态\
      • 6.unmodifed的文件还有一种可能是已经不再需要了,那么可以remove它不再追踪变为untracked状态\