美文网首页
Git本地仓库基本操作

Git本地仓库基本操作

作者: 攻城老狮 | 来源:发表于2020-07-06 20:18 被阅读0次

    Git本地仓库基本操作

    参考文章:https://so.csdn.net/so/search/s.do?q=%20Git%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0&t=blog&u=u013490896


    一. 创建Git项目

    • 方法一

    在本地的工作目录初始化新仓库,此时Git会自动在当前目录下生成一个隐藏文件 .git 。在该文件里面存放关于Git版本控制相关的配置信息。

    $ git init
    
    • 方法二

    在远程仓库Github中新建一个项目,并复制新建项目的地址,执行如下操作从远端克隆一份项目,默认就是Git项目,受到Git的控制。

    # git clone [项目地址]
    $ git clone https://github.com/yaokuku123/git-remote.git
    

    二. 提交本地仓库流程

    实例:

    1. 在当前目录下新建一个文件,并写入内容。执行 git status 命令后,得到如下的结果:

    说明:从得到的输出结果可以发现,当我们新建一个文件后,由于没有加入Git的管理,所以此时显示的结果是未跟踪的文件(Untracked files)。

    $ echo "Hello World" > test.txt
    $ git status
    On branch master
    No commits yet
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            test.txt
    nothing added to commit but untracked files present (use "git add" to track)
    
    1. 将未跟踪的文件变为跟踪文件,并保存至暂存区。执行 git add 命令,得到如下结果:

    说明:此时未跟踪的文件已经被Git跟踪,并且加入至暂存区,等待被提交到本地仓库

    $ git add test.txt
    $ git status
    On branch master
    No commits yet
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
            new file:   test.txt
    
    1. 将暂存区的文件提交到本地仓库,执行 git commit 命令,得到结果如下:

    说明:在执行提交命令后,表示已经将该文件纳入Git的本地仓库。再次执行 git status 命令后,可以发现没有其他需要提交的任务。表示此时 工作区,暂存区,本地库 三个位置存储的内容一致

    # -m: 本次提交的说明摘要,若不加 -m ,则会进入vim编辑器,在编辑器的第一行开始写说明摘要
    $ git commit -m "create new file test.txt"
    $ git status
    On branch master
    nothing to commit, working tree clean
    

    三. 提交过程中的撤销命令说明

    实例:若按上述的常规操作,则会成功将工作区的文件纳入Git本地库中存储。但在过程中也会出现一些失误或者误操作,故了解提交过程中的撤销命令尤为重要

    1. 提交到暂存区的文件想要撤回

    接着上节的例子,此时我想在test.txt文件中添加一行信息,然后添加到暂存区。执行 git status 命令,发现已经成功添加到暂存区。

    $ echo "Hello Git" >> test.txt
    $ cat test.txt
    Hello World
    Hello Git
    $ git add test.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
    

    但此时我发现添加的内容有问题,想将暂存区的内容删除掉。那么此时就有以下几种可以选择的方式

    • 方法一:

    说明:此方法是通过在工作区修改想要更改的内容,之后重新添加到暂存区。将原先暂存区存储的就内容给覆盖掉。从而达到了删除之前暂存区内容的效果

    $ echo "Hello Git plus" >> test.txt
    $ git add test.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
    
    • 方法二:

    说明:此方法的原理是使用HEAD指针指向的本地仓库中 test.txt 的文件内容覆盖现在的暂存区内容,从而达到了取消暂存文件的效果。通过 git status 命令可以发现已经将暂存区的内容撤销。此方法是安全的,不会回滚工作区修改的内容

    $ git reset --mixed HEAD test.txt
    $ 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:   test.txt
    no changes added to commit (use "git add" and/or "git commit -a")
    $ cat test.txt
    Hello World
    Hello Git
    
    • 方法三:

    说明:此方法的原理是使用HEAD指针指向的本地仓库中 test.txt 的文件内容替换掉暂存区和工作区的文件。从而达到撤销暂存区内容的目的。但此方法不安全,会将工作区的内容全部回滚。通过查看test.txt文件中的内容可以发现之前添加的 Hello Git 内容已经消失

    $ git checkout HEAD test.txt
    $ git status
    On branch master
    nothing to commit, working tree clean
    $ cat test.txt
    Hello World
    
    • 方法四:

    说明:此方法的原理是使用HEAD指针指向的本地库中的文件替换全部暂存区的文件。从而达到撤销暂存区内容的目的。方法是安全的,不会回滚工作区修改的内容

    $ git reset --mixed HEAD
    $ 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:   test.txt
    no changes added to commit (use "git add" and/or "git commit -a")
    $ cat test.txt
    Hello World
    Hello Git
    
    • 方法五:

    说明:此方法的原理是使用HEAD指针指向的本地库中的文件替换全部暂存区和工作区的文件。从而达到撤销暂存区内容的目的。但此方法不安全,会将工作区的内容全部回滚。通过查看test.txt文件中的内容可以发现之前添加的 Hello Git 内容已经消失。

    $ git reset --hard HEAD
    $ git status
    On branch master
    nothing to commit, working tree clean
    $ cat test.txt
    Hello World
    

    2. 提交到本地仓库的文件想要撤回

    首先修改文件,将修改后的文件提交到本地仓库中

    $ git add test.txt
    $ git commit -m "add one line in test.txt"
    

    此时已经成功提交本次修改,但现在发现提交的内容存在问题或者秘密泄露,想要撤回本次的提交,可以如下的方式撤销本次操作

    说明:撤销提交到本地参考的操作可以使用 git reset 命令,其中有三个参数可供选择:

    • --soft:仅回滚本地仓库的内容,工作区和暂存区的内容不回滚。
    • --mixed:(默认) 仅回滚本地仓库和暂存区的内容,工作区的内容不回滚。
    • --hard:本地仓库,暂存区,工作区的内容全部回滚。(不安全)

    一般选择默认的 --mixed 即可满足需求。另外,HEAD^ 表示当前HEAD指针指向的上一个版本。以此类推 HEAD^^ 表示上两个版本

    $ git reset --soft HEAD^
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
    
    $ git reset --mixed HEAD^
    $ 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:   test.txt
    no changes added to commit (use "git add" and/or "git commit -a")
    
    $ git reset --hard HEAD^
    $ git status
    On branch master
    nothing to commit, working tree clean
    

    3. 工作区修改的文件想要放弃修改

    实例:我对 test.txt 文件中的内容做了修改,将原先的Hello World改为了Hello Coder,然后通过

    git status 命令查看发现此时文件处于已修改的状态

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

    若代码或内容改乱了,想要从头开始,丢弃现有的全部修改内容。可以使用如下的方法将工作区重置

    • 情形一,若没有添加到暂存区,可以使用该方法

    说明:该方法实际上是使用目前状态的暂存区内容覆盖工作区的内容,从而实现回滚工作区的效果。由 git status 命令可以看出已经回退了做出的修改

    $ git checkout -- test.txt
    $ git status
    On branch master
    nothing to commit, working tree clean
    $ cat test.txt
    Hello World
    
    • 情形二,若不巧已经添加到暂存区,可以使用该方法。首先回退暂存区,然后回退工作区

    说明:由于文件已经提交到暂存区了,所以无法直接使用 git checkout -- [file] 命令回退工作区。这是因为该方法是通过暂存区来覆盖工作区,而现在工作区和暂存区的内容一样了,故无法执行该操作。需要先使用之前介绍的方法回退暂存区的内容,再回退工作区即可

    $ git reset --mixed HEAD test.txt
    $ git checkout -- test.txt
    $ git status
    On branch master
    nothing to commit, working tree clean
    $ cat test.txt
    Hello World
    
    • 其他

    说明:不管上面何种情形,使用下面的两个方法之一直接暴力回退即可。该命令直接回退到未修改时候的纯净版

    $ git checkout HEAD test.txt
    $ git reset --hard HEAD
    

    四. 分支操作

    Git的分支实际上仅仅表示的是指向提交对象的可变指针。每次提交操作都会使其自动向前移动。Git的默认分支为master。

    1. 分支创建

    Git使用如下命令创建分支,该分支会指向当前所在的提交对象

    例如:创建一个新分支,名称为dev

    $ git branch dev
    

    2. 切换分支

    可以通过如下命令切换HEAD指针指向新创建的dev分支

    $ git checkout dev
    

    3. 切换并创建分支

    • 情形一,使用如下命令创建并切换分支是安全的,不会涉及到文件的删除或者更新。例如使用下面的命令创建test分支并切换到该分支
    $ git checkout -b test
    
    • 情形二,使用如下命令创建并切换到历史中的某个版本,由于该操作会导致当前版本会有文件的删除或者更改,所有会触发Git对该操作的安全检测。需要在工作区,暂存区没有任何更改的前提下,才可以执行。

      例如:创建test分支指向前一个版本,若此时工作区有修改或者暂存区有内容,则会报警告。需要将此次修改提交,或者回滚才可以继续执行该方法

    $ git checkout -b test HEAD^
    error: Your local changes to the following files would be overwritten by checkout:
            test.txt
    Please commit your changes or stash them before you switch branches.
    Aborting
    

    五. 其他常用操作

    1. 撤销Git的追踪

    说明:新建的文件未受到Git版本控制的追踪,可以使用 git add [file] 命令加入追踪。使用下面的命令可以放弃Git的追踪

    $ git rm --cached test.txt
    

    2. 删除文件

    • 使用git的方法
    $ git rm test.txt
    $ git status 
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            deleted:    test.txt
    $ git commit -m "delete test.txt"
    
    • 使用传统的系统删除命令的方式,与上述使用git的方式区别不大,需要额外增添一步添加到暂存区的命令
    $ rm test.txt
    $ git add test.txt
    $ git commit -m "delete test.txt"
    

    3. 修改文件名

    • 使用git的方法
    $ git mv test.txt test2.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            renamed:    test.txt -> test2.txt
    $ git commit -m "renamed test.txt"
    
    • 使用传统的系统移动命令的方式,与上述使用git的方式区别不大,需要额外增添一步添加到暂存区的命令。可以发现Git实质上管理采用的方式是将原文件拷贝一份重命名后,删除原文件
    $ mv test.txt test2.txt
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            deleted:    test.txt
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            test2.txt
    no changes added to commit (use "git add" and/or "git commit -a")
    $ git add .
    $ git commit -m "renamed test.txt"
    

    4. 查看日志

    每次提交到本地仓库成功均会生成日志,可以通过查看日志了解提交的整个流程链。也可以为之后切换版本,切换分支等操作提供基础

    说明:使用 git log 命令查看日志

    # --oneline 仅显示sha1和摘要信息
    # --graph 以图像化流程显示,方便之后分支众多的情况下查看日志
    # --all 查看所有分支的信息
    git log --oneline --graph --all
    

    5. 跳过暂存区

    若本次修改文件后想要直接提交,而不想先到暂存区再提交增加操作步骤的话。可以使用如下命令跳过暂存区。注意:若新创建文件而不是原有文件的修改,则不能跳过暂存区。需要先使用 git add [file] 命令追踪文件,再提交。

    $ git commit -a -m "quick commit"
    

    六. 总结图

    20181005102019719.png

    相关文章

      网友评论

          本文标题:Git本地仓库基本操作

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