Git

作者: zheting | 来源:发表于2018-04-08 20:44 被阅读10次

    official website: https://git-scm.com/

    Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

    Git is easy to learnand has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.

    Download Git

    Git for Windows: https://git-scm.com/download/win
    百度网盘:https://pan.baidu.com/s/168C8BXbhNoS1MPzLh68jWw

    Install Git

    安装完成,右击菜单选项出现如下图选项,选择Git Bash Here,弹出command line窗口表示安装成功


    Download GUI Clients(optional)

    https://git-scm.com/downloads/guis/

    Git Useage

    • git init 初始化一个repository
      create empty directory: D:\important\git\learningGit
      说明:也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。

    在当前目录右击,选择Git Bash Here

    输入 git init命令,会生成 .git的隐藏目录,这个目录所在的目录就变成了Git可以管理的一个仓库。
    注意:.git这个目录是Git用来跟踪管理版本库的,不要修改和删除这个目录。

    • git add 添加文件到repository

    编写一个文件,如: demo.txt

    执行命令git add demo.txt,没有任何回显提示,表示添加repository到成功

    • git commit commit file to repository
    • git log 显示从最近到最远的日志

    --pretty=oneline 简化显示为一行

    说明:2a164e0df388ac4ab8f763efb7ce57ccb74329b2 是coommit_id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,如果大家都用1,2,3……作为版本号,那肯定就会冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。

    在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。

    现在给 demo.txt 添加一行字:只解沙场为国死,何须马革裹尸还。 commit
    再添加一行字: 一寸丹心图报国,两行清泪为思亲。commit

    • git reset 版本回退(前提是没有推送到远程库)
      回退到 “何须马革裹尸还”,从日志可以知道commit id : 366a1c78e92c2cc7e15ca8ec0d1a1746f3bcc2f4

    此时git log 发现 “add 一寸丹心图报国”没有了

    如果又想回到“add 一寸丹心图报国” 可以用命令 git reflog 查看命令历史

    此时 b37d185 就是commit id(这个是简写的,只要id是唯一可以不写全部的id值)

    工作区(Working Directory)

    就是你在电脑里能看到的目录,比如我的learningGit文件夹就是一个工作区:

    版本库(Repository)

    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

    git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

    Git跟踪并管理的是修改,而非文件

    为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

    你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

    给demo.txt中添加一行“商女不知亡国恨,隔江犹唱后庭花”
    执行命令 git add demo.txt
    再添加一行:“国破山河在,城春草木深”
    执行命令 git commit -m 新增两行诗歌

    git status 查看文件状态,发现是 modified, 说明没有提交,但是刚才已经执行了commit命令

    image.png

    咦,怎么第二次的修改没有被提交?

    别激动,我们回顾一下操作过程:

    第一次修改 -> git add -> 第二次修改 -> git commit

    你看,我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。 这也说明 为什么git管理的是修改。

    git checkout 类似windows中的撤销功能。

    新增一行 “苟利国家生死以,岂因祸福避趋之”

    git checkout -- demo.txt
    

    总之,就是让这个文件回到最近一次git commit或git add时的状态。这句话的意思是说,如果执行了git add命令以后,修改了文件demo.txt,你执行 git checkout只能把git add 以后的修改撤销掉。git commit类似。

    如果想把git add(还没有git commit)的内容撤销掉用命令git reset HEAD file, 该命令可以把暂存区的修改撤销掉,重新放回工作区。

    新增一行 “苟利国家生死以,岂因祸福避趋之” 并执行 git add demo.txt,可以使用git reset HEAD file把暂存区的修改放回工作区,然后使用git checkout -- demo.txt 回到修改前

    小结:
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,git rest --head commit_id,不过前提是没有推送到远程库。

    git rm 删除一个文件

    当要删除一个受git控制的文件,不能直接在文件管理器中删除(删除也是一个修改操作),因为如果直接删除工作区和版本库中不一致了,正确的做法是 git rm 并且git commit

    创建一个分支

    git  branch dev
    

    git branch 会列出所有的分支,当前分支前面会有一个星号‘*’

    分支切换

    git checkout  dev
    
    创建分支和切换分支一个命令完成
    git checkout -b dev2
    

    分支合并 git merge

    git merge dev
    

    git merge命令用于合并指定分支到当前分支。

    分支删除

    git branch -d dev
    

    小结:
    Git鼓励大量使用分支:
    查看分支:git branch
    创建分支:git branch <name>
    切换分支:git checkout <name>
    创建+切换分支:git checkout -b <name>
    合并某分支到当前分支:git merge <name>
    删除分支:git branch -d <name>

    git log --graph命令可以看到分支合并图

    git remote -v 查看远程repository的信息

    相关文章

      网友评论

        本文标题:Git

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