美文网首页
Git 学习笔记汇总

Git 学习笔记汇总

作者: 陈小陌丿 | 来源:发表于2017-02-08 10:03 被阅读0次

    Git 学习笔记 --- 安装和基本配置


    基本资料

    GitHub地址

    https://github.com/

    感谢 廖雪峰同学写的博客,帮助我更好的学习GitHub。
    廖雪峰博客地址

    http://www.liaoxuefeng.com

    廖雪峰GitHub教程地址

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

    注: 该笔记是给我自己用的,以便自己能够快速浏览,帮助自己更快的学会GitHub。
    如果要学习的话,推荐移步廖雪峰的博客来学习!


    安装Git

    检测 GitHub 是否被安装(查询版本)

    git --version

    CentOS 下安装

    yum install git

    Ubuntu 安装

    sudo apt-get install git

    配置用户名和邮件(全局)

    git config --global user.name "Your Name"
    git config --global user.email "email@example.com"

    SSH Key的配置

    切换到用户根目录 看看有没有.ssh 目录

    cd
    ls -a
    cd .ssh
    ls

    这个目录下应该包含两个文件
    id_rsa和id_rsa.pub两个文件, 这两个就是SSH Key的秘钥对。
    id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

    如果没有则 生成
    生成命令
    ssh-keygen -t rsa -C "你的邮箱地址"

    生成过程

    # 输入命令 
    [root@www ~]# ssh-keygen -t rsa -C "812069449@qq.com"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    
    # 输入密码 可留空 
    Enter passphrase (empty for no passphrase): 
    
    # 再次输入密码
    Enter same passphrase again: 
    
    # 文件生成后的路径 
    # 私钥路径
    Your identification has been saved in /root/.ssh/id_rsa.
    # 公钥路径
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    
    

    将生成的密钥 配置到远端服务器

    **读公钥内容 **

    cat ~/.ssh/id_rsa.pub

    在浏览器打开 GitHub 并配置值

    网址:https://github.com/settings/keys

    这里写图片描述

    测试ssh key是否成功

    ssh -T git@github.com

    *** 安装和基本配置 笔记内容结束 ***


    Git 学习笔记 --- 工作区 和 暂存区


    创建一个仓库


    首先登录GitHub并进入主页

    网址:https://github.com/

    首页
    创建仓库
    这里写图片描述
    这里写图片描述

    关联仓库到本地

    首先本地需要创建一个文件夹用来存储

    mkdir test

    初始化Git 环境

    cd test
    git init

    克隆远程环境

    git clone https://github.com/xiaomochen/test.git

    关联远程环境

    git remote add origin git@github.com:xiaomochen/test.git

    查看远程仓库信息

    查看基本信息
    git remote

    查看详细信息
    git remote -v

    新文件提交

    添加一个文件到暂存区

    git add readme.txt

    将暂存区的操作 提交到当前分支

    git commit -m '这里是描述'

    查看当前 仓库的状态信息

    git status

    新文件提交实例

    新增一个文件
    touch new.html

    向文件填写内容
    echo "this is new file" > new.html

    将文件提交到暂存区(实际上就是做个记录)
    git add new.html

    提交这个版本
    git commit -m '我提交了一个文件'

    第一次 提交的时候 带上 -u 参数 以关联分支
    git push -u origin master

    版本撤回

    查看版本历史信息

    git log

    格式化显示 (一行一行的显示)
    git log --pretty=oneline

    查看所有的版本历史信息 包括未来的
    如果你退回了某个版本后 想要返回到 最新的版本就要用到这个命令

    git reflog

    重置到某个版本

    git reset -- hard 版本编号

    重置到上一个版本
    HEAD 表示的是 最新的版本
    HEAD^ 表示的是 上一个版本
    HEAD^^ 表示的是 上面的第二个版本 ^的个数就是 版本的个数
    HEAD~100 表示的是 前第100个版本

    git reset --hard HEAD^

    冲突处理

    同步线上的数据到本地

    git pull

    查看两个版本的 数据差别

    git diff

    查看工作区和版本库里面最新版本的区别

    git diff HEAD -- readme.txt

    实例场景:

    猴子A 修改了test.html 文件提交后,
    正好猴子B 也在修改这个文件,
    猴子B 提交的时候GitHub会返回一个错误信息


    这里写图片描述

    大致的意思是:
      更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这可能是另外一个版本库已经推送了相同的引用。再次推送前,您可能需要先合并远程变更。

    PS: git 并不会像 SVN 那样自动合并内容,如果有冲突,只能通过手工自己修改

    解决流程解析

    1. 首先需要把远程的数据的拉下来
    2. 然后手动修改文件,选择需要保留的数据
    3. 提交最新的代码

    解决冲突实例

    先更新文档
    git pull

    查看冲突
    git diff

    编辑文件并保存
    vim 冲突的文件

    提交修改
    git add 冲突的文件

    合并到当前分支
    git commit -m '新增了 xxx 功能'

    提交到远程
    git push

    撤销修改

    git checkout -- readme.txt

    注意中间是两个 -

    命令 git checkout -- readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销。
    这里有两种情况:
    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    删除文件

    删除本地文件

    rm -rf test

    删除库中的文件

    git rm test.txt

    实例

    删除本地文件
    rm -rf test

    删除库中的文件
    git rm test.txt

    提交删除操作
    git commit -m "remove test.txt"

    如果是删错了 版本库里还有的话 可以恢复

    git checkout -- test.txt

    用reset 也可以达到同样的目的 HEAD 表示库中的最新版本

    git reset HEAD test.txt

    *** 工作区 和 暂存区 笔记内容结束 ***

    Git 学习笔记 --- 分支管理


    查看本地分支

    git branch


    查看所有分支 包括线上的

    git branch -a


    根据当前分支 创建新分支

    git branch [name]
    git branch dev


    根据当前分支 创建并切换分支

    git checkout -b [name]
    git checkout -b dev


    指定基础分支 创建新分支

    git checkout -b 新分支名 基础分支名

    本地的
    git checkout -b feature-x develop

    线上的
    git checkout -b feature-x origin/develop


    关联线上的分支

    git branch --set-upstream 本地分支名 线上分支名

    git branch --set-upstream dev origin/dev


    切换分支

    git checkout [name]

    git checkout dev


    将新分支推送到远程

    git push origin test


    删除分支
    注意删除的分支不能是 当前正在使用的分支

    git branch -d [要删除的分支名]

    git branch -d dev


    删除远程分支
    将一个空分支 push 到线上的 xxx 分支 相当于删除

    git push origin :branch-name


    强制删除分支
    如果这个分支中还有 未提交的数据 那么 删除该分支的时候是拒绝的
    提示用以下命令 强制删除

    git branch -D feature-vulcan


    合并分支

    git merge [要合并的分支名]

    快进模式
    git merge dev

    普通模式
    git merge --no-ff dev -m '合并了一个分支'


    分支模式

    no-ff指的是强行关闭fast-forward方式。

    fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit

    git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

    图示:

    图示
    图示

    分支模式小结:
    --no-ff:不使用fast-forward方式合并,保留分支的commit历史
    --squash:使用squash方式合并,把多次分支commit历史压缩为一次


    Git分支管理策略

    移步 http://www.ruanyifeng.com/blog/2012/07/git.html 有详细介绍

    分支管理策略小结:

    分支名 作用 临时分支?
    master 对外发布的正式分支 否 线上的主要分支
    develop 开发分支 否 线上本地都可以有
    feature 功能分支 是临时分支 用完即删
    release 预发布分支 是临时分支 用完即删
    fixbug 修补bug分支 是临时分支 用完即删

    stash 功能

    保存当前工作区

    git stash


    显示 已经保存过的 工作区列表

    git stash list


    恢复 已经保存的工作区

    git stash apply


    删除 已经保存的工作区

    git stash drop


    恢复并删除 已经保存的工作区

    git stash pop


    使用场景

    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    *** 分支管理 笔记内容结束 ***


    Git 学习笔记 --- 标签管理


    查看标签列表

    git tag


    给当前分支 打上一个 标签
    默认标签是打在最新提交的commit上的。

    git tag [标签名称]


    给指定的commit id 打上一个标签

    git tag [标签名] [commit id]

    git tag v0.9 6224937


    还可以创建带有说明的标签

    git tag -a [名称] -m [描述] [commit id]

    git tag -a v0.1 -m "version 0.1 released" 3628164


    查看指定标签的信息

    git show [标签名]

    git show v0.9


    删除标签

    git tag -d [标签名]

    git tag -d v0.9


    推送标签到远程仓库

    git push origin [标签名]、

    git push origin v.1.0


    一次性推送 全部尚未推送到远程的本地标签

    git push origin --tags


    删除远程 标签

    git push origin [标签路径]

    git push origin :refs/tags/v0.9

    *** 标签管理 笔记内容结束 ***


    Git 学习笔记 --- 自定义Git


    GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
    所有配置文件可以直接在线浏览:https://github.com/github/gitignore


    忽略特殊文件

    主要编辑 工作区根目录下的 .gitignore 文件

    忽略文件的原则是:

    • 忽略操作系统自动生成的文件,比如缩略图等;

    • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

    • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。


    创建 .gitignore 文件

    touch .gitignore


    编辑完成后 要提交到 远程

    git add .gitignore
    git commit -m '提交配置文件'
    git push


    .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!


    **如果添加不上 很有可能是因为.gitignore 的配置 而被忽略 **
    如果你确实想添加该文件 则需要在 add 后面 加个 -f 参数

    git add -f .gitignore

    或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

    git check-ignore -v App.class

    忽略特殊文件 小结

    • 忽略某些文件时,需要编写.gitignore;

    • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!


    配置别名

    新增别名

    例: 配置一个st 的命令 来代替 status

    git config --global alias.[名称] [对应的命令]

    git config --global alias.st status

    当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:

    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.br branch

    以后提交就可以这么写

    git ci -m "bala bala bala..."

    除了 直接指定命令 后面可以跟个 命令组成的 字符串

    例如 撤销修改

    之前的

    git reset HEAD file

    配置命令

    git config --global alias.unstage 'reset HEAD'

    配置命令之后的

    git unstage test.html

    实际执行的是
    git reset HEAD test.html

    配置一个git last,让其显示最后一次提交信息:

    git config --global alias.last 'log -1'

    配置一个lg, 让其显示分支日志

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    

    试一下 git lg 的效果

    这里写图片描述

    配置文件

    配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

    配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

        $ cat .git/config 
        [core]
            repositoryformatversion = 0
            filemode = true
            bare = false
            logallrefupdates = true
            ignorecase = true
            precomposeunicode = true
        [remote "origin"]
            url = git@github.com:michaelliao/learngit.git
            fetch = +refs/heads/*:refs/remotes/origin/*
        [branch "master"]
            remote = origin
            merge = refs/heads/master
        [alias]
            last = log -1
    

    别名的配置就是放在 alias 下, 可以直接编辑。

    而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

    $ cat .gitconfig
    [alias]
        co = checkout
        ci = commit
        br = branch
        st = status
    [user]
        name = Your Name
        email = your@email.com
    

    配置小结

    仓库的配置文件路径

    .git/config


    个人的配置文件路径

    用户主目录/.gitconfig


    忽略文件的 配置文件的路径
        项目根目录下的 .gitignore
        该配置修改后 也可以做版本管理


    配置别名

    git config --global alias.[别名] [命令 或者 命令字符串]

    *** 自定义Git 笔记内容结束 ***


    相关文章

      网友评论

          本文标题:Git 学习笔记汇总

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