zoukankan      html  css  js  c++  java
  • Git学习及使用

    一、认知git理论

    1.git出现的背景

    版本控制

    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

    许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

    举个例子

    如果你毕业写过论文,那么你肯定遇见过这个问题,你的论文由于各种原因,不停的修改,最后导师还不满意,又要重新改,无穷无尽。

    到最后,你发现这TM一堆乱七八糟的文件,里面到底写了啥,又不敢随便删除,怕删了修改了的重要内容。

    当你写完后,还要U盘拷贝或者邮件发送,但是如果你又修改过,那么和导师的版本又不一样,这么令人发指的操作,是不是希望有一个软件,帮你记录文件变动的操作,同时还能一起操作,对于变动,只需要查看软件记录,就可以。这就是git诞生的初衷。

    2.git简介

    git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目。

    集中式和分布式版本控制系统

    集中式版本控制系统

    版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

    集中式版本控制,典型代表SVN

    缺点:

    • 集中式版本控制系统最大的毛病就是必须联网才能工作。

    • 受网络速度影响,网速慢提交也会很慢。

    • 如果集中式版本服务器宕机了,所有人都没法工作。

    分布式版本控制

    分布式版本控制,没有中央服务器的概念,每个人都有自己的版本库,因此每个人在工作时候,不需要联网,版本库本地即可管理。

    既然每个人都是一个完整的版本库,同事之间如果需要协作开发,就需要找一个用于“交换文件”的中央服务器,这个服务器不存在也不影响大家干活,只是用于交换文件内容。

    GIT最强大的功能还有分支管理,远甩SVN等软件。

    Git和SVN的区别

    1. Git是分布式的,SVN是集中式的

    2. Git把内容按元数据方式存储,而Git是按文件:所有的资源控制系统都市把文件的元信息隐藏在一个类似.svn,.cvs等文件夹里。

    3. Git分支和SVN的分支不同:分支在SVN中就是版本库中的另外一个目录。

    4. Git没有一个全局的版本号,SVN有。

    5. Git的内容完整性优于SVN,Git内容存储使用的是SHA-1的哈希算法,能确保内容的完整性。

    二、Git的安装

    1.Git不同系统环境的安装

    在 Linux 上安装

    如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装。 如果以Centos 上为例,你可以使用 yum:

    sudo yum install git

    如果你在基于 Debian 的发行版上,请尝试用 apt-get:

    sudo apt-get install git

    在 Mac 上安装

    在mac安装git方式很多,最简单是用brew包管理

    安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

    brew install git

    如果你想安装更新的版本,可以使用二进制安装程序。 官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac

    Windows安装

    在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。

    安装完成后,在开始菜单里找到“Git”--->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

    2.Git运行前的基本配置

    既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

    Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

    1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。

    2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。

    3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。 --local 当前仓库配置

    用户信息配置

    当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:

    $ git config --global user.name "ryxiong"
    $ git config --global user.email "275310126@qq.com"

    Git相关配置命令

    git --version  # 查看git版本
    git config --system --list # 查看系统所有linux用户的通用配置,此命令检查/etc/gitconfig
    git config --global --list # 查看当前linux用户的配置,检查~/.gitconfig文件
    git config --local --list # 查看git目录中的仓库配置文件,.git/config文件
    git config --global user.name "ryxiong"  # 配置当前linux用户全局用户名,这台机器所有git仓库都会用这个配置
    git config --global user.email "275310126@qq.com"  # 配置当前linux用户全局邮箱
    git config --global color.ui true  # 配置git语法高亮显示
    git config --list  # 列出git能找到的所有配置,从不同的文件中读取所有结果

    三、码云远程仓库的创建

    远程仓库就是你用来提交代码的远程地址。这里演示码云的远程仓库建立

    新建或者加入一个组织,就可以建立你自己的远程仓库。 

    远程仓库的建立流程如下

     

    git添加远程仓库的操作流程如下

    在本地仓库(也就是提交代码的文件夹下)右键 git bash here命令,弹出git命令窗口,执行如下命令为本地仓库连接远程仓库。

    四、Git的详细使用

    1.git工作流程

    使用git就是将本地文件(工作目录workspace)的文件,添加到暂存区(stage),然后提交到本地仓库(repository),最终可以协同开发,推送到远程仓库(remote)

    2.建立Git仓库

    git版本库,也叫做git仓库(repository),也就是一个文件夹。

    这个目录的所有内容被git软件管理,所有的修改,删除,git都会跟踪记录,便于可以跟踪历史记录,以后可以还原文件。

    git管理本地仓库

    切换到本地仓库的文件夹,右键git bash here

    执行如下命令

    git init  # 初始化本地仓库,用git来管理这个文件夹

    使用git init 后会在该文件夹下生成一个.git文件夹,那么.git文件夹中有什么呢?

    [root@pyyuc ~/git_learning/mysite 11:08:19]#tree .git
    .git
    ├── branches
    ├── config    这个项目独有的配置
    ├── description
    ├── HEAD    head文件指示目前被检出的分支
    ├── hooks  hooks目录包含服务端和客户端的钩子脚本 hook scripts
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   └── update.sample
    ├── index  index文件保存暂存区的信息,只有git add之后才会生成,默认还没有这个文件
    ├── info    info目录是全局性排除文件,用于放置不想被记录在.gitignore文件中的忽略模式(ignored patterns)
    │   └── exclude
    ├── objects  存储所有数据内容
    │   ├── info
    │   └── pack
    └── refs  refs目录存储指向数据(分支)的提交对象的指针
        ├── heads
        └── tags
    .git文件结构

    获取远程仓库代码

    如果你想获取github上的代码,或者你公司gitlab私有仓库的代码,可以使用git clone命令,下载克隆远程仓库的代码。

    git clone https://github.com/django/django.git

    你会发现所有的项目文件都在这里,等待后续开发。

    3.git记录更新到本地仓库

    在工作文件夹的每一个文件,只有两种状态,一个是未跟踪,一个是已跟踪

    • 已跟踪的指的是已经被纳入git版本管理的文件,在git快照中有他的记录

    • 未跟踪的是这个文件既不在git快照中,也不在暂存区

    git init初始化时的工作文件夹,都属于已跟踪了,后续的编辑操作都会标记为,已修改文件,因此需要将修改后的文件,加入暂存区,然后提交暂存区的文件。

    检查文件状态

    git status:此命令查看git工作目录的文件,处于生命周期的哪一个状态 注意,只能在git工作目录中输入这个命令,他会去找.git文件夹

    • 如果没有修改,git status会看到此状态,没有任何东西需要提交

    [root@pyyuc ~/git_learning/mysite 12:00:34]git status
    On branch master
    Initial commit
    nothing to commit (create/copy files and use "git add" to track)

    说明当前工作目录很干净,所有的已跟踪文件,已经被提交且未更改。 此时处在master默认分支。

    • 如果修改过文件,查看git status

    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   readme.txt
    no changes added to commit (use "git add" and/or "git commit -a")

    上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

    4.git常用流程

    1.第一次使用初始化

    这种场景针对远程仓库中没有代码的情况,也就是没有本地仓库中没有的代码;

    选择一个作为本地仓库的文件夹,如D:git_project

    git config --global user.name "ryxiong"  # 初始化git服务密码
    git config --global user.email "275310126@qq.com"   # 邮箱,初始化git服务帐号
    
    git init  # 初始化git本地仓库,生成.git文件夹
    
    git remote add orgin 远程仓库地址  # 本地仓库关联远程仓库

    2.如果远程仓库的代码,本地没有,先拉远程代码到本地

    这种场景是远程仓库中有你想要保留的代码,这些代码在本地仓库中没有,需要先执行一个命令,将远程仓库代码复制到本地。

    git pull origin master  # 将远程仓库的代码复制到本地
    
    git config --global user.name "ryxiong"  # 初始化git服务密码
    git config --global user.email "275310126@qq.com"   # 邮箱,初始化git服务帐号
    
    git init  # 初始化git本地仓库,生成.git文件夹
    
    git remote add orgin 远程仓库地址  # 本地仓库关联远程仓库

    3.收集、修改、删除代码后提交远程仓库

    当远程仓库和本地仓库连接完成后,所有代码的收集、修改、删除都可以使用下面的一套流程来完成。

    git status  # 查看git操作状态
    git add "提交文件名" . 表示目录下所有文件
    git commit -m "注释"  提交任务
    git push origin master  # 推送远程仓库

    5.给文件重命名

    我们还是在git版本库中操作,修改main.py为mymain.py

    mv main.py  mymain.py
    # 查看状态
    git status
    ​
    # 直接mv的操作,会被git记录为两个形容,一、删除原有文件、二、新建了mymain.py文件
    # 此时新文件还未被跟踪,需要git add , git commit
    # 原本的main.py还需要从暂存区删除
    ​
    [root@pyyuc ~/mysite 14:57:57]git status
    On branch master
    Changes not staged for commit:
        (use "git add/rm <file>..." to update what will be committed)
        (use "git checkout -- <file>..." to discard changes in working directory)
        deleted:    main.py
    Untracked files:
        (use "git add <file>..." to include in what will be committed)
        mymain.py
    no changes added to commit (use "git add" and/or "git commit -a")
    ​
    git rm main.py  删除暂存区的main.py
    git commit -m "mv mymain.py"  提交新的mymain.py

    这样的步骤很麻烦,可以直接git mv 命令即可

    刚才的mv记录,可以通过git log查看历史记录,已经提交的id

    可以通过git reset 回退历史版本,回退到改名之前

    [root@pyyuc ~/mysite 15:10:12]git log
    commit f60fa7f1312843aa57edc9464192c9d891f23fb5
    Author: pyyu <yc_uuu@163.com>
    Date:   Sat Dec 22 15:08:02 2018 +0800
        mv mymain.py
    commit 65e0a2239909fd5aabc5928ec4431de3f163a195
    Author: pyyu <yc_uuu@163.com>
    Date:   Sat Dec 22 14:51:07 2018 +0800
        echo main.py
    ​
    # 回退到上一次commit版本,(注意这个命令,很危险,慎用)
    git reset --hard 65e0a2239909fd5aabc5928ec4431de3f163a195 
    --hard  # 清空暂存区和工作目录资料

    改名最正确的姿势

    git mv main.py mymain.py  
    git commit -m "mv mymain.py"

    6.Git保存提交记录

    当你的代码写好了一部分功能,就可以保存一个"存档",这个存档操作就是git commit,如果代码出错,可以随时回到"存档"记录

    查看"存档"记录,查看commit提交记录的命令 git log

    git log命令显示,从最新的commit记录到最远的记录顺序。

    git log --oneline    一行显示git记录
    git log --oneline  --all  一行显示所有分支git记录
    git log --oneline --all -4 --graph  显示所有分支的版本演进的最近4条
    git log -4  显示最近4条记录
    git log --all     显示所有分支的commit信息
    ​
    git branch -v 查看分支信息
    git help --web log 以web界面显示log的参数

    7.git版本回退,回到过去

    git log  # 可以查看历史版本记录
    git reset --hard  # 命令可以回退版本
    git reset --hard HEAD^  # 回退到上个版本
    HEAD  # 表示当前版版本
    HEAD^  # 表示上个版本
    HEAD^^  # 上上个版本
    ​
    也可以直接git reset --hard 版本id号

    五、git分支

    1.git分支是什么

    2.为什么用git分支

    假设你要开发一个同性在线交友的网站,这个写代码的工作进行分配,分给两个小弟进行功能开发,一个是alex分支,一个是egon分支,他俩自己的分支别人看不到,当他俩代码写完后,合并到master主分支上,这样既保证主代码的安全,又能协同开发,互不影响。

    3.git分支实战

    git branch 分支名linux     创建分支linux
    git checkout 分支名linux    切换分支到linux
    git branch    查看当前分支情况,在哪一个就有*符
    git check -- filename 一键还原文件,将git仓库的文件覆盖当前文件,危险命令
    git checkout -b name  创建+切换新的分支
    ​
    练习
    创建linux分支,提交代码
    git branch linux
    git checkout linux
    touch first.py
    git add first.py
    git commit -m “fenzhi linux commit v1”
    ​
    此时切换回master分支,发现没有first.py文件
    ​
    自动合并分支到master
    git checkout master
    git branch 
    git merge linux    合并linux分支到master分支
    ​
    合并完最好删掉无用的分支
    git branch -d linux
    ​
    自动合并可能会出现冲突报错,需手动解决冲突,解决自己想要的内容
    对同名同目录的同一个文件操作,修改同一行数据就会冲突
    git checkout master
    echo “master” >> readme
    git commit -a -m “master commit “ 提交代码到master仓库
    ​
    切换到linux分支,此时已经看不到master主干的代码修改
    git checkout linux
    echo “linux” >> readme
    git commit -a -m "linux commit”
    git checkout master 此时查看文件内容,应该只有master,并没有linux
    git merge linux  合并linux分支的代码,发现有一行冲突(both modified),
    master与linux字符串,手动修改后重新提交
    ​
    git commit -a -m "master merge commit” 提交本地代码到代码仓库
    当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
    解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
    用git log --graph命令可以看到分支合并图。
    View Code
    衣带渐宽终不悔,为伊消得人憔悴!
  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/10934427.html
Copyright © 2011-2022 走看看