likes
comments
collection
share

git篇

作者站长头像
站长
· 阅读数 42

前言: git的普及率已经到了不得不学的地步了,那就开始吧. git解决了版本处理问题以及做到了高效协作开发,可以控制与记录文件状态.

集中式版本控制系统(SVN)和分布式版本控制系统(GIT)

集中式版本控制系统:

  • 顾名思义:文件是集中的被控制在中央服务器上的.
  • 每一次干活都需要去中央服务器拉最新的版本,这样带来的弊端就是每次操作都需要去远程拉取,会被网络问题影响效率.

分布式版本控制系统:

  • 一种可以在本地进行版本控制(本地为一个独立的版本库),并且可以在功能实现后,再向远程拉取最新版本,在合并版本后再进行远程推送的控制系统.
  • 同时在分布式版本控制系统中,也引入了分支的概念,将文件拆解组合,结构更加清晰.

比较?

分布式版本控制系统是更加高效,安全的.

git的使用?

git在装好之后需要设置全局标识符(该标识符会在使用该文件者查看commit记录时回显(git log,Author)):

  • git config --global user.name "content"
  • git config --global user.email "content"

工作区?

顾名思义,在电脑内能看到的文件列表.

git远程仓库?

存在于中央服务器的,能够被共享的.

本地远程仓库?

git远程仓库拉取来的,存在于本地的远程仓库,需要区分git远程仓库(git远程仓库是可能被其他开发人员推送的,所以提交记录是会更新的,但是本地远程仓库是存于本地的,如果你不更新那么始终是你上次拉取的版本,这也是为什么git远程仓库被其他开发人员推送更新后,你merge无效,并且push失败,因为merge是和本地的远程仓库合并,而push则是向中央服务器推送「git监测在你推送之前有其他人推送了,所以需要你拉取远程仓库到本地的远程仓库再推送」)

版本库?

  • 版本库内有暂存区和一个git默认创建的master分支「head指针指向该分支」.
  • 版本库(repository),作为一个目录,可以跟踪git版本删除,添加,还原等操作.而创建一个版本库则可以通过git init + git pull url === git clone url(从远程拉取一个版本库)的方式实现.
  • 工作区和暂存区的区别就是,默认暂存区是空的,通过git status可以对比暂存区和工作区的文件列表并提供差别信息,如果通过git add将工作区的文件全部添加到暂存区后又没有对工作区的进行任何修改,那么工作区就是没有内容可以提交的「nothing to commit, working tree clean」
  • 向版本库内添加新的内容则是git add file + git commit -m ‘说明’来实现并且git commit一般都是一系列的操作,而git add只是这个系列中所被改动的某个文件,当然在git commit中-m只是为了使该次提交有相关的说明,当然也是强烈建议这么做的(就像你的老师总是会骂那个交了作业不写名字的笨蛋,而这个笨蛋往往成绩也不是很好).

git篇

总结一下: 版本库内保存了一个commit列表(可以看作链表),并且最新的记录从头部插入,HEAD指针指向头部,暂存区可以看作一个链表子对象,工作区通过git add向子对象添加内容,通过git commit将子对象作为一个版本添加进链表.

git中区的概念非常重要,所有的操作都以区目标,进行文件传递,如果工作区不理解命令就没必要看了.

命令系列?

  • git add . 添加文件暂存区

  • git commit -m file '说明' 提交文件至版本库

  • git commit --amend 修改上一次提交的注释内容

  • git config --list 对当前git的配置列表

  • git diff file -> 查看当前文件被添加到暂存区中的改动.

  • git status -> 查看当前本地仓库的状态(下面会提到).

  • git log -> 查看对于该文件的所有commit记录,每条记录由SHA1的hash值(提交标识符)+Author+Date提交时间+提交说明组成

  • git reset

    • 1、git reset file(撤销git add操作).
    • 2、git reset --[hard | mixed | soft] ... 这个命令是可以用于回滚版本的,首先我们可以把git commit版本看作链表结构,并且指针默认指向链表头部(最新commit版本,默认指向master分支),这个指针为HEAD,如果表示链表内的下一个则为HEAD^,再下一个则为HEAD^^,或者HEAD~2,如果要回到上一个版本则为git reset --hard HEAD^ || HEAD~1 || 版本号(版本号可以只写前几位,git会自动查找),这里需要注意一些问题,就是一旦回滚,当前的git log会清除在当前版本之前的提交记录.,换句话说,git log只会显示当前链表以下的所有内容,当然,如果你后悔了,又想回到之前的版本了,还是可以使用git reset --hard 版本号撤销的「向前移动指针」(前提是你知道哪些被弹出的版本号.)其中hard会将暂存区 HEAD working tree(工作区)全部用切换版本覆盖, mixed对比hard则不会覆盖working tree,也就是说你做的所有修改依然有效,并且可以比对提交,而soft则只修改HEAD,其他都不进行修改(基本不用)
  • git checkout

    • git checkout -- file(使用暂存区覆盖工作区的操作!!!,一定要记住是覆盖,这能帮你打通很多问题).
    • git checkout head file(使用当前HEAD指向版本的初始状态覆盖工作区)
    • git checkout branch(切换分支)「同时也可以进行版本回滚(不过不推荐,还是reset更加官方)」
    • git checkout -b branch(创建并切换分支)「面试的时候说错了😭,才想起要写git文章的」.
  • git reflog -> 刚才说了,如果你回滚版本号后后悔了,那么再想撤销就需要获得之前的版本号,那么如果忘了版本号呢,这时就有git reflog来获取文件操作记录了,注意区分git log和git reflog它们一个是对当前文件的origin至今的所有commit操作,一个是在本地环境中对当前文件所有commit切换的历史记录

  • git rm file -> 删除在暂存区的文件,(假设你遇到这样一种场景: 你把一个文件A提交到了暂存区,这时你发现这个文件是不需要的,你就从工作区把A给删除了,那么这时暂存区是比工作区多一个A文件的,1、如果你想要还原该删除文件,就可以使用git checkout -- A「覆盖!!!」.2、如果你想要把暂存区的也删除就可以用git rm A了).

  • git branch -> 查看分支

  • git fetch origin -> 拉取git远程仓库,更新存放在本地的远程版本库.

  • git merge <remote-name>/<branch-name> || branch 合并存在本地的远程版本库或者合并分支.

  • git pull origin -> 从git远程分支上拉取到本地远程仓库,并且将本地远程仓库和当前工作区合并,简单来说就是 git fetch + git merge.

  • git remote -> 查看所有远程仓库别名 可以通过git remote add name url设置,默认在从git远程仓库克隆时会把git远程仓库地址设置为origin,通过-v可以查看相关远程url(具体不展开)

  • git push remoteName branchName -> 推送版本库的分支到git远程仓库,但是存在一个问题就是如果其他开发人员在你拉取之后,推送之前进行了提交,那么git考虑到版本覆盖问题,会throw error,提示先从git远程仓库拉取之后merge才能进行提交

  • git rebase: 是git里比较复杂的一个命令,但是也是使结构更加清晰的一个命令.

    • git pull --rebase remoteName branchName 从远程更新内容并且解决冲突问题.(把远程的commit log和本地的commit log看成两条链表,该命令会找到最末公共子节点,并且从那个commit节点开始,往后遍历本地的版本提交,逐次的和git远程仓库最后一次提交进行合并,如果遇到冲突需要解决,rebase暂停,解决冲突后 git rebase --continue继续遍历下个点,直到结束) 参考链接 blog.csdn.net/hudashi/art…

    • git rebase -i (HEAD~2)「合并前两次提交」,进入到编译器后,给出提示,其中最后一行的commit表示最近一次提交,通过修改pick达到目的.里面的提示有:

      • pick:保留该commit(缩写:p)
      • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
      • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
      • s- quash:将该commit和前一个commit合并(缩写:s)
      • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
      • exec:执行shell命令(缩写:x)
      • drop:我要丢弃该commit(缩写:d) 合并提交记录的用处是可能你在开发过程中对一个功能产生了额外的提交,那么如果你没有合并这次提交,就会带来1、产生冗余、无用的提交记录. 2、在进行rebase时,我们提到的会遍历节点进行解决冲突,随着不必要的提交次数增加,就需要不断进行git rebase --continue.
  • git stash

    • git stash 缓存工作区和版本库状态.并且工作区和版本库用最近一次的commit覆盖.

    • git stash list 缓存列表

    • git stash apply index(从0开始的缓存记录索引值)

    • git stash drop index 从缓存中清除指定索引的记录

    • git stash show index -p 显示index缓存记录的修改细节

命令不止这一些,但是对于很生硬的命令也没啥必要去记.

廖雪峰老师的电子教程(有些命令陈旧,但是概念很好); 其他不系统的查找就不列举了

转载自:https://juejin.cn/post/7017372315725856798
评论
请登录