zoukankan      html  css  js  c++  java
  • Git学习笔记

    1.安装git

    sudo apt-get install git

    2.在命令行输入:

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

    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

     3.创建版本库(仓库),可以理解为是一个目录,这个目录里所有的文件都可以被Git管理起来,每个文件的修改,删除,Git都能被跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

    所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:(一般在家目录下)

    chris@chris:~$ mkdir cc    #根目录下创建一个空文件夹
    chris@chris:~$ cd cc    #进入这个空文件
    chris@chris:~/cc$ pwd      #显示当前目录
    /home/chris/cc        #此刻在linux的家目录下的cc文件夹下

    4.通过git init命令把这个目录变成Git可以管理的本地仓库:

    chris@chris:~/cc$ git init
    初始化空的 Git 仓库于 /home/chris/cc/.git/

    发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

    5.把文件添加到版本库

    首先在cc文件夹下(或其子文件下)创建一个‘readme.txt’的文件,用命令git add告诉Git,把文件添加到仓库:

    chris@chris:~/cc$ sudo vim readme.txt   #创建readme.txt文件
    chris@chris:~/cc$ git add readme.txt 

    如果没有提示任何内容,这就对了。readme.txt文件如下

    6.用命令git commit告诉Git,把文件提交到仓库:

    chris@chris:~/cc$ git commit -m '第一个文件,用于测试'
    [master (根提交) b684323] 第一个文件,用于测试
     1 file changed, 1 insertion(+)
     create mode 100644 readme.txt

    git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

    为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件。

    现在,已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下:

    chris@chris:~/cc$ git add readme.txt 
    chris@chris:~/cc$ git commit -m '第二次修改'
    [master b17a2f0] 第二次修改
     1 file changed, 1 insertion(+)

    像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。

    Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

    在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

    chris@chris:~/cc$ git log
    commit b17a2f0a42924e797948fc5e793b37d1fd81a1bb
    Author: Christian <huiyichanmian@yeah.net>
    Date:   Fri Oct 19 20:58:46 2018 +0800
    
        第二次修改
    
    commit b6843236540ac5525fc9750076a0e2daa1376a2e
    Author: Christian <huiyichanmian@yeah.net>
    Date:   Fri Oct 19 20:46:52 2018 +0800
    
        第一个文件,用于测试

    git log命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是第二次修改,最早的一次是第一个文件,用于测试。

    如果感觉看的眼花缭乱,可以用  git log --pretty=oneline

    chris@chris:~/cc$ git log --pretty=oneline
    b17a2f0a42924e797948fc5e793b37d1fd81a1bb 第二次修改
    b6843236540ac5525fc9750076a0e2daa1376a2e 第一个文件,用于测试

    现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是‘第一个文件,用于测试’的那个版本,怎么做呢?

    首先,Git必须知道当前版本是哪个版本,我们可以用git reflog 查看每个版本的版本号,然后git reset --hard 版本号 回退到相应的版本(git reset --hard HEAD~n没有实验成功,这里不班门弄斧)

    chris@chris:~/cc$ git reflog
    b17a2f0 HEAD@{0}: commit: 第二次修改 b684323 HEAD@{
    1}: commit (initial): 第一个文件,用于测试 chris@chris:~/cc$ git reset --hard b684323 HEAD 现在位于 b684323 第一个文件,用于测试

    chris@chris:~/cc$ git reset --hard b17a2f0
    HEAD 现在位于 b17a2f0 第二次修改

    7.版本库

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

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

    前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用git add 文件名 把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

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

    你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

    在工作区重新创建一个文件,test.txt,对原有的readme.txt进行一次修改。然后用git status查看一下状态

    chris@chris:~/cc$ git status
    位于分支 master
    尚未暂存以备提交的变更:
    (使用 "git add <文件>..." 更新要提交的内容)
    (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

    修改: readme.txt

    未跟踪的文件:
    (使用 "git add <文件>..." 以包含要提交的内容)

    test.txt

    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

    git 明确告诉我们。readme.txt被修改了,而且是暂存以备提交的变更,test.txt从未跟踪过。

    现在,使用两次命令git add,把readme.txttest.txt都添加后,用git status再查看一下:

    chris@chris:~/cc$ git add readme.txt 
    chris@chris:~/cc$ git add test.txt 
    chris@chris:~/cc$ git status 
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
        修改:     readme.txt
        新文件:   test.txt

     此时暂存区应该是这样子的:

    git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。,

    chris@chris:~/cc$ git commit -m '提交两个文件'
    [master e4fdae1] 提交两个文件
     2 files changed, 2 insertions(+)
     create mode 100644 test.txt

    一旦提交后,如果没有对工作区做任何修改,那么工作区就是“干净”的:

    chris@chris:~/cc$ git status 
    位于分支 master
    无文件要提交,干净的工作区

    现在版本库变成了这样,暂存区就没有任何内容了:

    8.管理修改

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

    还是老样子,修改readme,txt文件

    chris@chris:~/cc$ cat readme.txt 
    这是一个测试文件。
    第二次修改。
    第三次修改
    这是第四行

    然后 git add 添加到暂存区

    chris@chris:~/cc$ git add readme.txt 
    chris@chris:~/cc$ git status 
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
        修改:     readme.txt

    继续修改readme.txt

    这是一个测试文件。
    第二次修改。
    第三次修改
    这是第四行
    这是第五行

    用git commint 提交,然后查看状态

    chris@chris:~/cc$ git status 
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     readme.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

    明明提交了,怎么提示没有被提交呢。

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

    Git管理的是修改,当用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

    提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:

    chris@chris:~/cc$ git diff HEAD -- readme.txt
    diff --git a/readme.txt b/readme.txt
    index 68dcdde..b761a7b 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -2,3 +2,5 @@
     第二次修改。
     第三次修改
     这是第四行
    +这是第五行
    +

    那怎么提交第二次修改呢?你可以继续git addgit commit。

    9撤销修改

    在工作中我们难免会犯错,在你刚准备要提交的时候及时发现错误,就很容易去纠正它。

    手动把文件恢复到上一个版本的状态,用git status查看一下

    chris@chris:~/gityum$ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     readme.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

    你可以发现,git 会告诉你,git checkout -- file可以丢弃工作区的修改:

    命令git checkout -- readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    一种是readme.txt自修改后还没有放到暂存区,现在撤销修改就回到和版本库一模一样的状态;

    一种是readme.txt已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态

    总之,就是让这个文件回到最近一次git commit或git add的状态。

    然后你会发现文件内容果然复原了。

    如果git add到了缓存区,但是还没有commit,你发现了问题,用git status查看,修改只是添加到了缓存区,还没有提交。

    hris@chris:~/gityum$ git add readme.txt 
    chris@chris:~/gityum$ git status 
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
        修改:     readme.txt

    git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销,重新放回工作区

    chris@chris:~/gityum$ git reset HEAD readme.txt
    重置后取消暂存的变更:
    M    readme.txt

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,当我们用HEAD时,表示最新的版本。

    再次使用git status查看,现在缓存区是干净的,工作区有修改

    chris@chris:~/gityum$ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     readme.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

    然后在使用git checkout -- <file>丢弃工作区的修改。

    如果你不但改错了东西,还从缓存区提交到了版本库,这时候我们用上面讲的,

    我们可以用git reflog 查看每个版本的版本号,然后git reset --hard 版本号 回到这个指定的版本,前提是没有推送到远程库。

    撤销文件操作的总结:

      当你改乱了工作区的某个文件,想直接丢弃工作区修改,用git checkout -- file

      当你不但改乱了工作区某个问价内容,还添加到暂存区,想丢弃修改,,分两步,用git reset HEAD <file>回退到工作区,然后重复上面的操作。

      当已经提交了不合适的修改的内容到版本库,想要撤销本次操作,用git reflog查看每个版本的版本号,git reset -- hard 版本号  会退到指定的版本。

    10 删除文件操作

    在git中,删除也是一种修改操作,前面我们添加了一个test.txt文件并提交到了版本库

    一般情况下,我们会通常在文件管理其中把没用的文件删除,或者用rm命令

    这时候,git知道了你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你那些文件删除了

    chris@chris:~/gityum$ rm test.txt 
    chris@chris:~/gityum$ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     readme.txt
        删除:     test.txt

    现在就有两个选择,一是确实要从版本库中删除文件,那就用命令git rm 删除,并且git commit

    chris@chris:~/gityum$ git rm test.txt 
    rm 'test.txt'
    chris@chris:~/gityum$ git commit -m '删除文件'
    [master fa3b2eb] 删除文件
     1 file changed, 1 deletion(-)
     delete mode 100644 test.txt

    现在问价那就从版本库中删除了。

    第二种情况是,删错了,因为版本库中还有,所以可以轻松的把误删文件恢复到最新版本

    git checkout -- test.txt

    git checkout 其实使用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还远。

    建立远程仓库

    首先到托管服务器上创建一个空版本库,例如在github、coding、oschina等、

    然后克隆到本地(clone)创建一个新项目

    或者可以通过初始化项目创建一个新项目 git init

    • git remote add origin 远程仓库地址

    • 添加代码文件(git add)

    • 提交代码到本地库 git commit -m

    • 将代码推送到远端服务器 git push

    • 从远端服务器拉取代码git pull

    冲突管理 

    • 如果有多个人同时修改同一个文件的相同行,在推送时会有冲突

    • 发生冲突后,首先将服务器端代码拉到本地(pull),手动合并冲突

    • 然后添加修改后的代码文件,重新提交

    • 将代码推送到服务器

    创建公钥

      

    ssh-keygen -t rsa -C yourname

    进入.ssh目录,查看  id_rsa.pub文件,复制密钥

    登录github,设置,填入密钥,下次推送就不用登录github的账号密码了。

  • 相关阅读:
    5.深入TiDB:Insert 语句
    4.深入TiDB:执行计划执行过程详解
    3.深入TiDB:执行优化讲解
    2.深入TiDB:入口代码分析及调试 TiDB
    1.深入TiDB:初见TiDB
    开发必备之单元测试
    如何用好MySQL索引
    SpringBoot运行源码剖析(一)
    深入理解Java虚拟机读后感
    Java并发编程艺术读后感
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/9820024.html
Copyright © 2011-2022 走看看