Git指南 - 3个小时搞定git

作者: 司鑫 | 来源:发表于2017-01-13 12:17 被阅读3079次

    先奉上Git常用命令速查表,方便大家查阅。


    图片来自于网络

    再来个目录说明,大家可以根据自己所需进行选择学习

    简单目录说明

    1 git简介


    Git是世界上最牛逼的分布式版本控制系统。

    分布式版本控制系统:版本控制是一个用来记录一个或多个文件内容变化,以便将来查阅特定版本的修订情况的系统。

    分布式和集中式的区别:

    集中式版本控制系统:版本库是集中存放在中央服务器中,大家工作的时候自己的电脑必须要联网,才能拉获取到最新的版本库,工作结束后在上传至中央服务器。最新的版本库只存在于中央服务器中,安全性较低,提交速度较慢。

    分布式版本控制系统:分布式版本控制系统可以没有中央服务器,因为每个人电脑中都会有一份完整的版本库,有人的版本库丢失了只需要向其他人复制一份就可以了,这样大大的提高了安全性。当然,分布式版本控制系统一般也是有一个中央服务器的,这样更加方便大家的文件的修改及统一。

    2 安装


    git安装自行解决🤓

    Tip:以下操作使用 Git Bash

    为了大家好,我就只截图,不贴代码啦😀

    3 创建版本库


    1)创建一个目录 or 进入一个目录

    img1

    2)使用 git init 将一个文件夹变成一个仓库

    img2

    这样一个空的仓库就创建了,仓库中的.git目录就是最好的证明,初始化仓库.git文件夹默认是隐藏的,可以手动设置可见性,也可以通过ls -sh来查看,这个目录就是git的核心,用来跟踪版本库的,即每个文件的修改、删除、还原都会被跟踪。

    4 git的基本操作


    首先,我们需要先来了解一下工作区,暂存区的概念。

    img3
    • 工作区(Working Directory):就是我们电脑上可以看到的目录

    • 版本库(Repository):版本库就是我们初始化仓库时多出来的那个 .git文件夹。版本库中还包含了几个重要的东西。

    • 暂存区(Stage):工作区的文件使用add命令后会加入暂存区,而没有直接到仓库。

    • maste分支:master分支也是在仓库初始化时自动创建的,当暂存区的文件commit后就会默认加入仓库的master分支。


    为了便于观察,就使用idea来做实验,文件不同的颜色对应不同的状态

    • 工作区:文件颜色是红色
    • 暂存区:文件颜色是绿色
    • 本地仓库中:文件颜色是白色
    • 对本地仓库文件修改后:文件颜色是蓝色

    一步:先在工作区创建一个文件

    img4

    二步:将工作区文件add到暂存区

    img5

    三步:将暂存区文件commit到本地仓库

    img6

    四步:对仓库中文件进行修改后的状态变化

    img7

    在上述每一个步骤中都可以通过git status来查看工作区状态,通过git diff来查看修改的内容。

    5 撤销修改


    • 撤销工作区的修改
      git checkout -- file:把文件放在工作区的修改全部撤销

    1)修改后还没有被放到暂存区,将撤销回到git add的状态。

    img8

    2)已经添加到暂存区后做了修改,将撤销回到git commit状态

    img9
    • 撤销已到缓存区的修改
      命令git reset HEAD file,HEAD为当前最新的版本。
      作用:将add进缓存区中的文件退回到工作区中。

    6 版本回退、文件删除


    先来了解两个命令:

    • git log:查看版本库状态
    img10
    可见我们刚才一共提交了三个版本,当我们需要回退版本时需要使用
    git reset --hard HEAD^命令, HEAD表示当前的版本,HEAD^ 表示上一个版本,上上个版本就是HEAD^^了,以此类推。HEAD~50即回退50个版本。
    • git reflog:查看历史命令状态
      img11
      git loggit reflog最大的不同就是使用git reflog会有一个commit id,但我们需要回退版本的时候只需要找到对应的commit id号就可以了.。即
    git reset --hard commit_id
    

    对文件的删除方式有两种

    • git rm file命令:在删除的时候会将删除操作记录下来。
    • rm file命令:在删除文件的时候不会将删除操作记录下来。
    img12

    但我们还是可以用版本回退来恢复误删的文件。

    7 远程仓库(以码云平台为例)


    本地、远程仓库联系

    既然是远程仓库,那么我们就要想办法去将本地的代码上传到远程仓库,
    具体的步骤:
    1)在码云上创建一个仓库。

    2)本地初始化一个仓库,且仓库不能为空,否则当提交到远程仓库是失败

    3)使用git remote add origin '远程仓库地址'命令关联远程仓库

    4)关联远程仓库
    第一次关联使用git push -u origin master命令,加上-u参数,git会把本地仓库master分支内容推送到远程仓库的master分支,并且会将本地的master分支和远程的master分支关联起来,以后本地提交时只需要使用git push origin master命令即可。当远程仓库为空时可以关联成功。

    第一次关联流程
    SSH KEY配置

    SSH key提供了一种与GitHub通信的方式,通过这种方式,能够在不输入密码的情况下,将GitHub作为自己的remote端服务器,进行版本控制。

    1)创建一个SSH key

    ssh-keygen -t rsa -C "youremail"
    

    随后一路回车吧,使用默认值就好。完成后会在用户目录下(C:\Users**.ssh)目录中id_rsaid_rsa.pub两个文件。

    • id_rsa.pub:需在码云个人资料中配置,主要用来加密,当你拉取数据时进行加密。
    • id_rsa:私钥,本地保留,对拉取到本地的数据进行解密

    2)在码云上设置公钥信息

    设置密钥

    只有设置了SSH的电脑上才会免密码操作,其它没有设置的当需要提交的时候还是需要登录账号密码。当然你也可以在多个电脑上设置SSH,而且不管是id_rsa还是id_rsa_pub丢失,都必须重新生成密钥。

    push/pull
    克隆

    两种方式:

    git clone [-b <branchName>] ‘仓库地址’  //https协议
    git clone [-b <branchName>]  git@'平台地址':‘用户名’/‘仓库名’.git    //ssh协议,速度较快
    

    8 分支管理


    分支概念

    当我们每次提交时,都会产生一个版本,这些版本共同连成一条时间线,这条时间线就是一个分支。

    分支基础
    • 在我们没有创建分支时,git会默认给我们创建一个master分支。刚才讲的HEAD是指向分支的,即当前分支,在这就是指向master分支,而master才是指向提交的。
      • 查看当前分支
    git branch           //会列出所有分支,分支前有*号的表示当前分支
    
    HEAD/maste指向
    • 每次提交,master分支都会向前进一步。
    maste分支移动
    • 当我们创建一个分支dev时,Git会创建一个新的指针devdev指针会指向master相同的提交版本节点,而HEAD也会指向 dev分支上,即当前版本是dev上的当前最新版本。
    • 创建dev分支,并切换到该分支
    git branch dev       //创建分支
    git checkout dev   // 切换分支
     或
    git checkout -b dev //创建并切换分支
    
    创建dev分支
    • 当我们创建分支并切换到该分支后,Git会将HEAD指向所创建的分支dev上,从而我们以后再提交时,master分支的指针将不会改变,而dev分支的指针会向前移动。
    dev指针移动
    • 当然有创建就会有合并, 在dev上的工作做完后,就可以把dev分支和master分支合并,合并也非常简单,只需要将master指向dev的当前提交即可。合并之后,HEAD会指向master分支。
    • 合并分支
    git merge dev //快速模式合并,直接将当前所处分支指针指向dev的当前提交版本。
    
    分支合并
    • 最后在合并之后也是可以把dev指针给删除掉。
    • 分支删除
    git branch -d dev   //删除dev分支
    

    当前分支在没有提交的情况下删除使用

    git branch -D dev
    
    解决合并冲突

    当然咯,在现实情况下,多多少少还是会出现在merge的时候出现冲突的,即同一个文件在两个分支中都被修改了,在合并时使用快速合并模式*就会产生冲突。

    merge冲突发生

    打开冲突的文件,Git会用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们可以对其修改后继续提交。

    • <<<<<<< 和 ======= 之间是我们做的修改
    • ======= 和 >>>>>>>之间是我们要合并的那个分支做的修改
    冲突文件
    分支管理策略

    在合并时,Git会默认使用Fast forward(快速合并模式),在这种模式下,当我们删除分支后,相应的分支信息也会被删除。

    如果要强制禁用Fast forward模式,在merge时Git就会生成一个新的commit,这样,我们就可以从分支历史上看到这条提交记录

    实战:在dev分支对文件readme.txt修改,add,commit后,切换到master分支对readme.txt修改,add,commit后使用:

    git merge --no-ff -m'提交信息' dev
    

    这样就会产生一个新的commit,而且当前分支的修改会被merge的分支覆盖,使用带参数的git log查看分支历史

    git log --graph --pretty=oneline --abbrev-commit
    
    查看分支历史

    1)BUG分支

    在实际的开发过程中,我们需要去修复一个bug时,我们一般都会去创创建一个issue分支去修复这个bug,所以我们会把当前的工作现场存储起来。

    • 将当前工作现场隐藏
    git stash
    
    • bug处理完成,删除issue分支
    • 查看stash内的工作现场

    git stash list

    
    ![查看所有工作现场](https://img.haomeiwen.com/i3126293/95ca7c934eee9210.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    - 恢复指定现场
    

    git stash apply stash@{0} //恢复现场
    git stash drop stash@{0} //删除stash内的stash@{0}工作区

    git stash pop stash@{0} //恢复现场并删除stash@{0}工作区

    
    #### 9 多人协作
    ***
    当我们从远程仓库克隆时,Git会自动的将本地的master分支和远程的master分支关联起来,远程仓库的默认地址是origin。
    
    可以使用`git remote`来查看远程仓库信息
    或
    用`git remote -v`查看抓取和推送的master地址
    
    **1) 推送分支**
    
    

    git push origin master

    
    **2)抓取分支**
    
    Ⅰ 使用`git push origin branch_name`推送自己的修改
    
    Ⅱ 若推送失败,则使用`git pull`试图合并
    
    Ⅲ 如果出现冲突,那么就解决冲突,并在本地提交
    
    Ⅳ没有冲突或解决掉冲突后继续执行 Ⅰ
    
    #### 10 标签管理
    ***
    在发布一个版本时,我们一般会再该版本上添加一个版本号做标识。这样我们在版本库中查询时也可以一目了然。
    - 给当前分支创建标签
    

    git tag <tag_name>

    - 给历史提交记录创建标签
    

    git tag <tag_name> 历史版本号 //(版本号用git reflog查询)

    - 创建标签时填加备注信息
    

    git tag -a <tag_name> -m 'remark'

    - 查看标签信息
    

    git show <tag_name>

    - 查看所有标签
    

    git tag

    ***
    
    - 删除标签
    

    git tag -d <tag_name>

    - 推送标签到远程
    

    git push origin <tag_name> //推送单个标签
    git push origin --tags //将全部未推送的的标签推送到远程

    - 删除远程标签
     - 先删除本地标签
     - 再删除远程标签
    

    git push origin :refs/tags/<tag_name>

    
    #### 11  补充
    ***
    - 把本地的分支提交到远程的某个分支(远程分支可以是未创建的)
    

    git push origin own_branch:remote_branch

    - 删除远程的分支
    

    git push origin :remote_test //远程的分支被删除,本地的分支不会被删除

    - 将一个文件从暂存区中删掉,但还存在与硬盘中
    

    git rm --cache fileName

    - 撤销上一次提交。
    
    

    --soft 参数:将上一次的修改放入 staging area
    --mixed 参数:将上一次的修改放入 working directory
    --hard 参数:直接将上一次的修改抛弃

    ![image.png](https://img.haomeiwen.com/i3126293/de192a11c0798478.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    - 查看远端仓库
    

    git remote -v

    
    - 拉取远程分支到本地分支
    

    git pull origin remote : local

    
    
    - 推送本地分支到远程分支
    

    git push origin local : remote

    
    - 查看某个文件的修改人
    

    git blame fileName

    
    - 获取远程的修改,但并不合并到当前分支
    

    git fetch branchName

    
    - 撤销当前的commit
    

    git revert [HEAD]

    > 这样整个git基础就完结了。由于笔者也是刚刚接触git不久,所以文中有不足的地方望大家多多指正😀

    相关文章

      网友评论

      • _借东西的小人:大哥越来越厉害了😋🙃
      • 李程鹏:写的很用心:+1:
        司鑫:谢谢:smile:
      • 木书:和svn有啥区别呢?
      • 自由的呼唤:打开冲突的文件,Git会用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们可以对其修改后继续提交

        这段怎么理解?我刚刚用github,在github里面怎么处理呢?
        司鑫:github 是个代码托管平台,我们用的是 git 工具来操作我们的代码。

        当我们 merge 时可能发生文件冲突的情况,打开冲突文件
        文件的格式如下:

        <<<<<<<
        我们刚刚的修改
        =======
        别人做的修改
        >>>>>>>

        <<<<<<<和=======之间是我们刚刚的修改
        ======= 和>>>>>>>之间是别人的修改

        我们可以对该文件进行相应的修改再次提交即可。

      • Li_Michael:您好,请问这些图怎么做的呢,比如img8,包括前面文件截图的处理,要用什么软件呢?谢谢:pray:
        司鑫:@木子大叔 是x-mind:sweat:
        Li_Michael:@Acey 谢谢:pray:
        司鑫:截图一般就用qq截图了,方便对图片作简单的处理。
        其它的用的是edraw,里面有很多的模版库。
        第一张目录说明用的是x-xind。
      • Li_Michael:您好,总结梳理包括排版都非常喜欢,我在做生物信息知识的分享,会用到git,请问可以转载吗?如果可以我应该怎么配合呢?非常感谢!
        司鑫:谢谢您的认可。可以转载呢。只需要把本文链接附上就可以了。
      • 为什么一定要起昵称:为了你那个git安装图片我来评论一发……
        司鑫:@为什么一定要起昵称 :grin: 那个图是网上找的,当你鼠标停留在上面会出现那个提示,然后截的图。
        为什么一定要起昵称:@Acey 我倒不是说这个,你截图里还有一个“点击查看源网页”。。。
        司鑫:哈哈,想着安装教程挺多的,就没写了:smile:
      • 刘雪玲0909:git文件夹默认是隐藏的,可以手动设置可见性
        菜鸟一枚,请问怎么手动设置
        司鑫:windows下面:
        1 ctrl+E打开我的电脑
        2 顶部导航有个查看
        3 点击选项打开文件夹选项
        4 查看 tab下面有个显示隐藏的文件、文件夹

        Linux下面:
        在任意目录下按 ctrl+h即可
      • 兔龍:先收藏, 但是实话说, 并不喜欢git.
        司鑫:@兔龍 哈哈,用习惯了感觉就挺好用
      • 我稀饭猪头:好东西,学习了,真的很感谢!
        司鑫:@我稀饭猪头 别的?
        我稀饭猪头:@Acey 还有别的吗??
        司鑫::blush: 大家一起努力
      • 243d702d9909:好东西,学习了
        司鑫::smile: ,后面还会不断的补充。
      • RdouTyping:赞 先收藏学习!
        司鑫:谢谢:blush:
      • 165647195bbf:去看廖雪峰的博客,git 入门的好教程...
        司鑫:嗯嗯,廖雪峰的博客也看了一些,确实非常的详细。作为一个新手来说,如果能尽可能的用截图的形式去表达步骤和结果,这样可以使读者理解的更加透彻:grin:
      • 那一年漫天雪:收藏!
        司鑫:@那一年漫天雪 谢谢,后期还会不断的补充哦:grin:
      • 6d96978eeefb:强
        司鑫:@TW李鹏 :sweat: 还需多应用,整理的还不够完善。

      本文标题:Git指南 - 3个小时搞定git

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