zoukankan      html  css  js  c++  java
  • git的几个常用基本操作

    需求一:如何把stage中的修改还原到work dir中

    这个需求很常见,也很重要,比如我先将当前work dir中的修改添加到stage中,然后又对work dir中的文件进行了修改,但是又后悔了,如何把work dir中的全部或部分文件还原成stage中的样子呢?

    来个实际场景,我先新建两个文件,然后把他们都加到stage

    $ touch a.txt b.txt
    $ git add .
    $ git status
    On branch master
    Changes to be committed:
        new file:   a.txt
        new file:   b.txt
    

    然后我又修改了a.txt文件:

    $ echo hello world >> a.txt
    $ git status
    On branch master
    Changes to be committed:
        new file:   a.txt
        new file:   b.txt
    
    Changes not staged for commit:
        modified:   a.txt
    

    现在,我后悔了,我认为不应该修改a.txt,我想把它还原成stage中的空文件,怎么办?

    答案是,使用 checkout 命令:

    $ git checkout a.txt
    Updated 1 path from the index
    
    $ git status
    On branch master
    Changes to be committed:
        new file:   a.txt
        new file:   b.txt
    

    看到了么,输出显示从index区(也就是stage区)更新了一个文件,也就是把work dira.txt文件还原成了stage中的状态(一个空文件)。

    当然,如果work dir中被修改的文件很多,可以使用通配符全部恢复成stage

    $ git checkout .
    

    有一点需要指出的是,checkout命令只会把被「修改」的文件恢复成stage的状态,如果work dir中新增了新文件,你使用git checkout .是不会删除新文件的。

    需求二:比如说commit完之后,突然发现一些错别字需要修改,又不想为改几个错别字而新开一个commithistory

    那么就可以使用下面这个命令:

    $ git commit --amend
    

    这样就是把错别字的修改和之前的那个commit中的修改合并,作为一个commit提交到history区。

    需求三:将history区的文件还原到stage区

    这个需求很常见,比如说我用了一个git add .一股脑把所有修改加入stage,但是突然想起来文件a.txt中的代码我还没写完,不应该把它commithistory区,所以我得把它从stage中撤销,等后面我写完了再提交。

    $ echo aaa >> a.txt; echo bbb >> b.txt;
    $ git add .
    $ git status
    On branch master
    Changes to be committed:
        modified:   a.txt
        modified:   b.txt
    

    如何把a.txtstage区还原出来呢?可以使用 git reset 命令:

    $ git reset a.txt
    
    $ git status
    On branch master
    Changes to be committed:
        modified:   b.txt
    
    Changes not staged for commit:
        modified:   a.txt
    

    你看,这样就可以把a.txt文件从stage区移出,这时候进行git commit相关的操作就不会把这个文件一起提交到history区了。

    上面的这个命令是一个简写,实际上reset命令的完整写法如下:

    $ git reset --mixed HEAD a.txt
    

    其中,mixed是一个模式(mode)参数,如果reset省略这个选项的话默认是mixed模式;HEAD指定了一个历史提交的 hash 值;a.txt指定了一个或者多个文件。

    该命令的自然语言描述是:不改变work dir中的任何数据,将stage区域中的a.txt文件还原成HEAD指向的commit history中的样子。就相当于把对a.txt的修改从stage区撤销,但依然保存在work dir中,变为unstage的状态。

    需求四:将work dir中的修改提交到history区

    这个需求很简单,先git add然后git commit就行了,或者一个快捷方法是使用命令git commit -a

    需求五:将history区的历史提交还原到work dir中

    这个场景,我说一个极端一点的例子:比如我从 GitHub 上clone了一个项目,然后乱改了一通代码,结果发现我写的代码根本跑不通,于是后悔了,干脆不改了,我想恢复成最初的模样,怎么办?

    依然是使用checkout命令,但是和之前的使用方式有一些不同:

    $ git checkout HEAD .
    Updated 12 paths from d480c4f
    

    这样,work dirstage中所有的「修改」都会被撤销,恢复成HEAD指向的那个history commit

    注意,类似之前通过stage恢复work dircheckout命令,这里撤销的也只是修改,新增的文件不会被撤销。

    当然,只要找到任意一个commit的 HASH 值,checkout命令可就以将文件恢复成任一个history commit中的样子:

    $ git checkout 2bdf04a some_test.go
    Updated 1 path from 2bdf04a
    # 前文的用法显示 update from index
    

    比如,我改了某个测试文件,结果发现测试跑不过了,所以就把该文件恢复到了它能跑过的那个历史版本……

    需求六:由于HEAD指针的回退,导致有的commit在git log命令中无法看到,怎么得到它们的 Hash 值呢?

    只要你不乱动本地的.git文件夹,任何修改只要提交到commit history中,都永远不会丢失,看不到某些commit只是因为它们不是我们当前HEAD位置的「历史」提交,我们可以使用如下命令查看操作记录:

    $ git reflog
    

    比如resetcheckout等等关键操作都会在这里留下记录,所有commit的 Hash 值都能在这里找到,所以如果你发现有哪个commit突然找不到了,一定都可以在这里找到。

  • 相关阅读:
    XAML中的戏法
    提前预览Visual Studio 2010
    大道至简
    Windows Service下的MessageBox
    WPF中使用Expression Encoder SDK开发流媒体
    使用latex
    [zz]2D动画制作工具比较
    android platform_frameworks_base
    Fast and easy high resolution fractals with a pixel shader
    Bézier Surface
  • 原文地址:https://www.cnblogs.com/kyoner/p/13343163.html
Copyright © 2011-2022 走看看