• git学习(1)-git基础


    Git 学习

    首先安装 git ,安装过程很简单,省略。

    安装完git之后需要配置git

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

    初始化仓库

    切换到你想要当作仓库的目录使用命令:

    git init
    

    工作区和暂存区

    如图所示,git分为工作区和版本仓库两个部分

    其中版本仓库里边包含暂存区(stage)和【主】分支(master)

    提交文件到暂存区

    当我们编辑好一个文件想要将它加入到版本控制/版本仓库中去,第一步是要将文件提交到版本仓库的暂存区(stage),使用命令 git add <filename>·:

    $ git add file.txt
    

    如果想把当前目录下的所有文件和文件夹都添加到暂存区

    $ git add .
    

    tips:. 表示当前目录

    将暂存区的文件提交到版本仓库的分支

    一般情况下,我们将文件提交到暂存区之后,接下来的一步就是将文件提交至仓库分支上,这样才能达到版本控制的目的。使用命令git commit -m "some commit messages"

    $ git commit -m "first commit message"
    

    查看提交记录

    查看详细提交记录使用命令:

    $ git log
    # 我们会看到像这样的输出
    commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
    Author: 。。。作者信息
    Date:   Fri May 18 21:06:15 2018 +0800
    
        append GPL
    
    commit e475afc93c209a690c39c13a46716e8fa000c366
    Author: 。。。作者信息
    Date:   Fri May 18 21:03:36 2018 +0800
    
        add distributed
    
    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: 。。。作者信息
    Date:   Fri May 18 20:59:18 2018 +0800
    
        wrote a readme file
    

    有些场景下需要过滤掉一些不需要的信息,可以添加一些参数:

    $ git log --pretty=oneline
    $ git log --oneline # 这两句都是可以的 上面一句显示的commit id更长 更全一点
    

    什么是 commit id?

    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: 。。。作者信息
    Date:   Fri May 18 20:59:18 2018 +0800
    
        wrote a readme file
    

    如上所示,这是git log 的其中一条 commit eaadf4e... commit 后边跟的这一串就是 commit id,注意commit 是很重要的一个东西 接下来我们还会用到这个。

    查看当前仓库状态

    如果我们忘记了我们提交的状态,可以使用命令:

    $ git status
    

    来查看当前仓库的状态 git 的提示非常友好,我们可以根据提示做相应的操作。

    撤销修改

    有两种撤销修改的场景

    1. 在工作区的文件撤销修改
    2. 已经被添加到暂存区的文件修改

    第一种情况,工作区的文件撤销修改 首先查看一下仓库状态:

    $ 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:   afile
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    可以看到,git 为我们提供了友好的提示 git checkout -- <file> 可以丢弃工作区的修改。

    $ git checkout -- afile
    

    上边命令的意思就是 把 afile 文件在工作区的修改全部撤销掉.

    第二种情况,我们已经把文件放到暂存区了,但还没有commit提交到分支上, 同样的我们先查看仓库状态:

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
    	modified:   afile
    

    可以看到 git 给我们的提示,使用git reset HEAD <file> 可以将暂存区的修改撤销掉(unstage), 重新放回到工作区:

    $ git reset HEAD afile
    Unstaged changes after reset:
    M	afile
    

    当我们用HEAD时,表示最新的版本。

    当我们再用 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:   afile
    

    这样我们就又回到了第一种情况,使用同样的操作git checkout -- file 可以丢弃工作区修改。

    版本回退

    首先 我们需要回忆一下两个知识点:

    1. git log 命令
    2. commit id

    使用 git log 可以查看提交日志,每一条提交日志里边都包含 commit id 即版本号。

    还拿我们之前的例子来说,假设,我们查看 git 日志是下面的情况:

    $ git log
    commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
    Author: 。。。作者信息
    Date:   Fri May 18 21:06:15 2018 +0800
    
        append GPL
    
    commit e475afc93c209a690c39c13a46716e8fa000c366
    Author: 。。。作者信息
    Date:   Fri May 18 21:03:36 2018 +0800
    
        add distributed
    
    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: 。。。作者信息
    Date:   Fri May 18 20:59:18 2018 +0800
    
        wrote a readme file
    

    可以看到,apend GPL 即有(HEAD -> master) 标注的提交版本是最新版本(当前版本),现在我们有某些需求,想要回退到 上一个版本即add distributed 版本。

    我们只需要使用命令:

    $ git reset --hard HEAD^
    

    上边我们说到 HEAD 版本是最新版本, 那我们要回退一个版本可以使用 HEAD^ 做标记,回退两个也就是上上一个版本可以使用HEAD^^,那假如说要回退50个或者 100甚至更多版本写100个^也不太好数,所以git 就为我们提供了另外一种方式(波浪号后边跟数字)即HEAD~100

    运行完上边的命令,我们又后悔了怎么办?

    查看一下日志:

    $ git log
    commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
    Author: 。。。作者信息
    Date:   Fri May 18 21:03:36 2018 +0800
    
        add distributed
    
    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: 。。。作者信息
    Date:   Fri May 18 20:59:18 2018 +0800
    
        wrote a readme file
    

    回退真的成功了,我们后悔了,怎么回去,git 还是有给我们留了后悔药的。

    我们上边提到的第二个概念 commit id 可以帮助我们回到未来时刻。

    如果没有关掉命令窗口,网上翻旧可以找到append GPL 的commit id是1094adb...,它就是我们回到未来的钥匙。

    $ git reset --hard 1094ad
    HEAD is now at 83b0afe append GPL
    

    看提示,我们已经回来了。可以使用 git log 自己验证一下。

    同样的 commit id 可以用来回退版本。

    总结一下:三种方式

    git reset --hard HEAD^  # 回退两个版本可以使用 HEAD^^
    git reset --hard HEAD~13  # 13 是你想回退13个版本
    git reset --hard 1094ad  # 1094ad 表示某一次提交的 commit 前几位
    

    需要解释一下两个点:

    --hard 参数是什么意思,这里我们学习期间先直接用就行了,后边会说到。

    版本号commit id 当我们使用的时候不需要给完整的 commit id,因为 git 很聪明的会帮我们区匹配。一般情况下 会取版本号前几位,注意不能取1-2位这种的,相似性太高了,git会无法确定是那个版本。

    删除文件

    在开发过程中,避免不了删除文件,通常我们会通过文件管理器,或者rm命令删除文件

    这里准备一个文件 gitrm.txt 并将它提交到了代码仓库

    $ git add gitrm.txt
    
    $ git commit -m "add gitrm.txt"
    [master b84166e] add gitrm.txt
     1 file changed, 1 insertion(+)
     create mode 100644 gitrm.txt
    

    现在将它删除掉

    $ rm gitrm.txt
    

    此时,工作区和版本库已经不一致了,git会知道你删除了一个文件 git status 查看一下

    $ 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:    gitrm.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    正如上边 git 给我们的提示一样,我们现在有两个选择:

    1. 使用 git rm <file> 然后commit 删除掉仓库里边的文件。
    2. 如果发现删错了,后悔了, 使用 git checkout -- <file> 可以将版本库中的文件放到工作区

    注意:git checkout 使用版本库中的版本替换工作区版本,所以无论工作区是修改还是删除都会被替换掉。另外没有被添加到过版本库的文件是没办法恢复的。

  • 相关阅读:
    Linux内核学习笔记七——内核同步机制和实现方式
    Linux内核学习笔记五——中断推后处理机制
    Linux内核学习笔记十——虚拟文件系统概念
    Android中LocalSocket使用
    Linux下常见命令
    Linux内核学习笔记八——定时器和时间管理
    Linux内核学习笔记九——内核内存管理方式
    [Android]Android的常用adb命令
    Linux内核学习笔记六——并发和同步概念
    Linux内核学习笔记十一——I/O层和I/O调度机制
  • 原文地址:https://www.cnblogs.com/sha-ka/p/13246510.html
Copyright © 2020-2023  润新知