zoukankan      html  css  js  c++  java
  • Git

    一、什么是Git?

      git就是分布式版本控制系统。简单来说就好比是协同编辑Excel,每一个编辑者在哪一处进行编辑,都会记录每次的改动并且告知其他编辑者,这样任何一个编辑者都可以回溯到任何一个时刻的版本文档。如下图(廖雪峰

     1.1 集中式和分布式

      集中式版本控制最大问题就是需要借助互联网才能工作。比如:CVS、SVN。

      分布式版本控制就相当于每个人的PC都是一个完整的版本库,不需要像集中式那样上传中央服务器,就算某一台PC坏掉了,直接从其他PC上拷贝一个就行。

    1.2 git、github、gitee(码云)

      git       是一种版本控制系统,是一个命令,是一种工具。

      github  是一个基于git实现在线代码托管的仓库,向互联网开放。

      gitee    即码云,是 oschina 免费给企业用的,不用自己搭建环境。

    二、Git使用

    2.1 Git安装

    •   Linux  sudo apt-get install git
    •   IOS     Xcode自带。“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”完成安装。
    •   windows 从官网下载,默认选项安装。 

    2.2 创建版本库

      版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

    1)首先,选择一个合适的地方,创建一个空目录(D://GitRepository)

    cd /D/GitRepository
    mkdir GitStudy
    cd GitStudy
    pwd
    /D/GitRepository/GitStudy

    2)把"/D/GitRepository/GitStudy"目录变成Git可以管理的仓库。

    git init
    Initialized empty Git repository in D:/GitRepository/GitStudy/.git/

    Git就把仓库建好了,使用ls -ah,发现有一个.git目录,这个目录是Git来跟踪管理版本库的(不要随意更改)。

    2.3 将文件添加到版本库

      值得注意的是所tml有的版本控制系统,只能跟踪文本文件的改动,比如TXT,Html,代码等等,像图片、视频这些二进制文件虽然也能由Git控制,但是只知道图片从100KB变成120KB,但图片内容不知道改了啥。由于Word是二进制格式,所以也不能查看更改内容。在进行测试使用txt文件时,使用Sublime或者notepad++来代替记事本(设置UTF-8 without BOM编码)。接下来举一个例子:将readme.txt文件添加到版本库。

    • 编写txt文件,放到GitStudy目录下(子目录也行)
    • 使用git add添加文件到仓库。
    • 使用git commit告诉Git,把文件提交到仓库
    git add readme.txt
    git commit -m "wrote a readme file"

    其中git commit命令,-m后面输入的是本次提交的说明(强烈建议)。如果没有配置git同学,配置一下用户名称和登录邮箱(详细配置)。

    git config --global user.name '用户名称'
    git config --global user.email '登录邮箱'

    2.4 时光穿梭机(版本回溯)

      再添加文件并且成功提交readme.txt文件后,某一天想更改txt内容(How to study Docker?)。更改为(How to study Docker? Good Good Study!Day Day Up!)。我们使用git status查看结果。

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

      git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt已经更改,但是还没有提交这个修改。如果我们想要看看具体修改了什么内容,可以使用git diff查看。

    $ git diff
    diff --git a/readme.txt b/readme.txt
    index 59c82a7..666af66 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1 +1,3 @@
    -How to study Docker?
     No newline at end of file
    +How to study Docker?
    +Good Good Study!
    +Day Day Up!
     No newline at end of file

    如果发现修改内容没有出错,那么就按部就班,添加提交readme.txt,git告诉我们工作目录干净

    git add readme.txt
    git commit -m "add some words"
    git status
    On branch master
    nothing to commit, working tree clean

    1) 版本回退

      在进行一次修改保存、添加、提交操作后。我们已经有三个版本了,使用git log来查看历史记录。

    $ git log
    commit 5a8bdfaf61c0d92adb8baf4619d299665af06a11 (HEAD -> master)
    Author: chw <734194171@qq.com>
    Date:   Mon Feb 17 15:04:44 2020 +0800
    
        add promised!
    
    commit 5cae7ff1c821aa2229fa4a6797e341fa0254094f
    Author: chw <734194171@qq.com>
    Date:   Mon Feb 17 14:59:33 2020 +0800
    
        add some Words
    
    commit 2cc0019db22107999c810a11bf6edd6f1deadca4
    Author: chw <734194171@qq.com>
    Date:   Mon Feb 17 14:43:39 2020 +0800
    
        wrote a readme file

     commit后的"5a8bdfaf61c0d92adb8baf4619d299665af06a11"是版本号,在git中,head表示当前版本,上一个版本就是head^,上上一个版本就是head^^,当然往上100个版本写100个^比较容易数不过来,所以写成head~100。现在,我想回到上一个版本(add some Words),就可以使用git reset命令。

    $ git reset --hard head^
    HEAD is now at 5cae7ff add some Words

    重新打开txt,内容被还原了。如果想回到任意一个版本,可以使用git reflog查看命令历史,确定版本号,然后根据版本号回到指定版本。--hard将会在下节讲解。

    2)工作区和暂存区

      廖老师已经讲得很清楚了,就不赘述了。

    3)撤销修改

      git checkout --file可以丢弃工作区的修改。其中:

    • 工作区中的文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    • 工作区已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

      比如说,有一个txt里面写着'1',添加提交后,将1改成2保存(工作区),然后执行git checkout -- test.txt,txt中返回1;在把1改成2的时候保存(工作区),将此时版本add进入暂存区,然后在工作区中将2修改3保存,然后执行git checkout -- test.txt,txt中返回2;

      git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用head时,表示最新的版本。还是上面的例子,当我们把2add进入暂存区,这个时候我们的head依旧指向1的那个版本,所以使用git reset head test.txt后,暂存区干净,然后在使用git checkout --file撤销工作区的修改。

    4)删除文件

      git rm file,然后commit

    2.4 远程仓库

      详细见。

    git remote add origin https://github.com/ccxiao5/study.git
    git push -u origin master

      其中远程库的名字就是origin,使用git push 就是把当前分支master推送到远程库中,由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。以后只要本地提交了,就可以通过git push origin master把本地master分支的最新修改推送至github。

      如果需要克隆远程库,用命令git clone

    $ git clone git@github.com:ccxiao5/test.git

    2.5 分支管理

      注意新建的分支与master分支以及head指针之间的关系,详细见。

      首先我们创建分支,并且切换到该分支上。

    git switch -c dev

      git switch命令加上-c参数表示创建并且切换,相当于

    git branch dev
    git switch dev

      使用git branch可以查看当前分支。使用git merge来吧dev的分支的工作成果合并到master。最后删掉dev分支。如果没有merge就想删除commit后的分支,需要用-D。如果可能Git会用Fast forward模式,这种模式下,删除分支后,会丢掉分支信息。我们可以使用--no--ff来禁用该模式,从而可以查看分支合并历史。

    git merge dev
    git branch -d dev
    git merge --no-ff -m "merge with no-ff" dev

    如果遇到冲突,需要解决冲突后再重新commit,使用下面命令可以查看merge情况。

    git log --graph --pretty=oneline --abbrev-commit

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

    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick<commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。详细见。

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin <branch-name>推送自己的修改;

    2. 如果推送失败,则因为远程分支比你的本地更(加)新,需要先用git pull试图合并;

    3. 如果合并有冲突,则解决冲突,并在本地提交;

    4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

    这就是多人协作的工作模式,一旦熟悉了,就非常简单。

    多人协作具体操作详细见

     2.6 标签管理

    • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

    • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;

    • 命令git tag可以查看所有标签。

    详细见。

    2.7 push/pull/fetch区别

    详细见

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/cc-xiao5/p/12320857.html
Copyright © 2011-2022 走看看