美文网首页Git
Git 基础篇

Git 基础篇

作者: 任未然 | 来源:发表于2019-09-30 15:08 被阅读0次

    Git

    git [git] 是一个分布式的版本控制系统。官方网站地址:https://git-scm.com/

    git官网截图

    一. 简介

    • Linux操作系统有着众多的开发者共同参与开发。一开始该项目使用Bitkeeper来管理和维护代码,2005年的时候,Bitkeeper不再免费使用,这就迫使着Linux开源社区开发一套自己的版本控制系统。

    • 自2005年诞生以来,Git日臻完善,它的速度飞快,特别适合大型项目的开发,还有着令人难以执行的非线性分支管理系统,可以应对各种复杂的项目的开发。

    1.1 Git的工作模式

    ​ 我们自己的计算机从版本服务器同步代码,日常开发的过程中90%以上的操作都是在本地计算机,在本地操作完成后需要推送到远程服务器。

    1.2 Git的三种工作状态

    • 已修改(modified)
    • 已暂存(staged)
    • 已提交(commited)

    1.3 本地库与服务器库

    二. Git的基本命令(本地仓库管理)

    • git init: 初始化仓库(需要记)
    • git status: 查看工作空间的状态(需要记)
    • git add a.txt: 将已修改的文件纳入到暂存区。(需要记)
    • git add -A: 将所有的已修改的文件纳入到暂存区 (不用记)
    • git add -h: 查看git add 所有的参数 (需要记)
    • git rm --cached [文件名]: 将指定文件从暂存区移除,首次初始化提交的时候才会使用到(不用记)
    • git commit -m '提交说明': 将暂存区的内容提交到本地版本库 (需要记)
    • git log: 查看提交历史信息 (需要记)
    • git log -3: 查看最近3条提交信息(需要记)
    • git log --oneline: 将提交日志信息按行显示。(不用记)
    • git log --pretty=format:"%h - %an, %ar : %s": 按照指定的格式输出。(不用记)
    • git checkout -- a.txt: 撤销删除或者更新文件 (不用记)
    • git reset HEAD [文件名]: 将已追踪的指定文件从暂存区移除。(不用记)
    • git commit --amend -m 'new msg': 修正提交信息。 (需要记)
    • git commit -am 'msg': 将git add 与 git commit两条命令进行合并(需要记)
    • git log --graph --oneline: 查看日志的简单图形化信息(需要记)

    三. 修改用户信息

    在提交信息的时候会显示提交人的用户名和邮件,可以自定义该信息,可以在两个全局和局部进行设置:

    • C:\Users\Administrator\.gitconfig 全局设置
    • .git\config 局部设置,不同的项目情况下使用

    设置全局的信息使用如下命令:

    git config --global user.email "zou@qq.com"
    git config --global user.name "miller"
    

    设置局部信息使用如下命令:

    git config --local user.email "zou@qq.com"
    git config --local user.name "miller"
    

    四. git rm与rm的区别

    4.1 使用 rm 命令删除文件,如下:

    4.2 使用 git rm 删除文件,如下:

    4.3 说明

    • rm是操作系统级别的命令,只是将文件从工作区移除, 被删除的文件并没有纳入到暂存区;而git rm命令实际上是由两个命令(rm和git add)合成的,git rm删除了工作区的文件,并将删除的文件纳入到暂存区。

    • 当使用rm命令删除文件的时候,只需要通过 git checkout a.txt 即可撤销删除;而通过git rm命令删除文件,需要通过两个命令撤销修改,这两个命令一次为 git reset HEADgit checkout a.txt.

    五. .gitignore

    ​ 在Git中,有些文件或者文件夹并不需要纳入到版本控制系统,例如maven编译后的target目录,ide的配置文件,所以Git提供了一个非常优秀的解决方案,就是.gitignore。需要在Git的版本库中创建一个名为.gitignore的文件,文件的语法如下:

    settings.xml     #将同级目录下的settings.xml文件忽略
    /target          #忽略/target目录以及所有的子目录和文件
    /*/test          #忽略掉/abc/test  /def/test,但是不能忽略掉/a/b/test
    /*/*.iml         #忽略掉/abc/a.iml /def/bcd.iml,但是不能忽略掉/a/b/cde.iml
    /*.java          #忽略掉User.java, 但是不能忽略/com/Person.java
    /debug/*.java    #忽略掉/debug/A.java, 但是不能忽略掉/debug/a/C.java
    *.log            #忽略掉所有的以log结尾的文件
    bin/             #会忽略bin目录以及所有的子目录,但如果bin是文件则不忽略
    

    六. 分支

    • git branch: 查看所有的分支,以及当前所处的分支
    • git branch [分支名]: 创建分支,自定义分支名字
    • git branch [分支名] d7e347: 创建一个分支指向d7e347这个提交。
    • git checkout [分支名]: 切换到指定分支
    • git checkout -b [分支名]: 创建分支,并切换到该分支
    • git branch -d [分支名]: 删除指定分支
    • git merge [分支名]: 将指定分支合并到当前分支。
    • gitk --all: 图形化的方式查看git的分支信息,以及对文件提交信息。
    • git log --graph --oneline --all: 图形化的方式展示分支信息。
    • git branch -m [原分支名] [新分支名]: 更改分支名字.

    6.1 Git提交的原理

    ​ Git每次在提交的时候,会生成一个提交对象,那么这个新生成的提交对象有一个指针,该指针会指向上一次的提交对象,如下图所示:

    6.2 分支的原理

    Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。Git 的 master 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。

    • 如下图所示,master分支执行f30ab这个提交,而HEAD指向了master,意思是当前用户所处的分支是master.

    HEAD其实就是一个指针,指向的是当前用户所处的分支,可以在.git这个目录下的HEAD文件中查看到信息。

    • A. 使用 git branch testing 这个命令会创建一个testing分支,此时testing分支和master分支指向的是同一个提交,如下图所示:
    • B. 当使用git checkout testing 这个命令,会切换到testing这个分支,此时HEAD会指向testing,如下图:
    • C. 当在testing这个分支,编辑某个文件并提交。此时testing这个分支执行的是最新的提交,而master还是指向上次一的提交,如下图:
    • D. 再次切换到master这个分支,编辑某个文件并提交。此时master指向的是另外一个提交,如下图:
    • E. 此时用 git log --all --graph 看到的结果如下图所示:

    6.3 分支的合并

    • 在master分支执行 git merge testing 命令会出现冲突,如下图:
    • 冲突的原因是因为,有master和testing这两个分支最新的提交的上一次提交指向同一个提交,这种情况可能会导致冲突,该冲突需要手动的修改文件,此时文件内容如下图:
    • 修改文件的内容后,执行 git add a.txtgit commit -m 'merge completed' 即可完成合并。
    • 此时分支的形式如下:

    七. 版本的回退

    • git reset --hard HEAD^ : 回到上一个版本。

    • git reset --hard HEAD^^: 回到上两个版本。

    • git reset --hard HEAD~5: 回到上5个版本。

    • git reset --hard f1f52: 回到一个固定的版本, f1f52为commit_id的前几位,只要能够保证唯一性就可以。

    • 查看所有的操作日志命令:

      git reflog
      

    八. 保存工作现场

    当我们正在某个分支上工作的时候,而功能并没有完善,又或者代码没有编写完成,此时也不能提交。而被领导要求在其他分支上进行操作,在其他分支上也可以看到修改状态,可能造成在其他分支上误操作导致提交。这个时候就需要用到工作现场。

    • git stash: 保存工作现场。

    • git stash list: 查看所有的工作现场。

    • git stash pop: 弹出工作现场,并将工作现场从stash中删除。

    • git stash apply: stash中的内容并不会删除,需要通过 stash drop stash@{0} 删除工作现场。

    • git stash apply stash@{0}: 直接开始运用指定的工作现场。

    九. 标签与diff

    9.1 标签

    标签的作用是当项目发布一个里程碑的时候,给其一个做个标记,往往用来指定版本。标签的命令如下:

    • git tag v1.0: 创建一个V1.0的标签。
    • git tag: 查看所有的标签
    • git tag -d v1.0: 删除v1.0这个标签
    • git tag -a [标签名] [commit id]: 给指定的提交打标签

    9.2 diff

    diff命令是源于linux操作系统中的命令,用于查看两个文件中的区别,git也提供了该功能,命令如下:

    • git diff: 查看暂存区与工作区的文件的区别
    • git diff HEAD: 查看版本库最新一次提交的与工作区间的差异
    • git diff ba8dc34c: 查看指定提交与工作区间的差异
    • git diff --cached: 查看版本库与暂存区间文件的差异

    其他命令

    • git checkout 79af3: 切换到79af3这个提交点。

    • git blame a.txt: 追踪a.txt这个文件的提交信息。

    命令的区别:

    • git checkout dev: 切换分支。

    • git checkout -- a.txt: 丢弃掉工作目录中相对于上一次添加到暂存区的修改。

    相关文章

      网友评论

        本文标题:Git 基础篇

        本文链接:https://www.haomeiwen.com/subject/dqacpctx.html