如何将git staging用作临时空间?

时间:2016-10-14 13:45:16

标签: git

我正在尝试找出在进行更改时在代码版本之间来回切换的最简单方法。当我处于某事的中间并且想要测试其他东西时我会使用git stash,但在这种情况下这似乎有些过分,因为它不能在单个文件上完成。

我尝试做的是git add {file}暂时存储更改,然后git checkout {file}以恢复到以前的状态。目的是将暂存作为文件的临时保留区域,然后将暂存文件拉回到我的工作目录中。我很惊讶,虽然在暂存文件后,结帐对工作目录中的文件没有影响。是否有一系列命令选项可以让这个工作流按我的意愿运行?

更新1:

根据文档显示,如果第2步有办法不覆盖索引,这将会起作用

  1. git add {file}
  2. git checkout HEAD {file}
  3. git checkout {file}
  4. 更新2:

    在受到ElpieKay的帖子的启发后,我看到将命令输出写入文件,我发现another answer克服了上述第2步的限制。使用git show HEAD:{file} > {file}我现在可以覆盖文件的工作目录版本而不覆盖索引。然后调用checkout将索引版本拉入工作目录。结合git checkout-index,我得到了这个......

    1. git add {file}
    2. git show HEAD:{file}> {文件}
    3. git checkout-index -f

1 个答案:

答案 0 :(得分:0)

如果git commit不够好,您可以使用git stash

首先让我们制作一个标签来跟踪当前分支的尖端。

    git tag start

对某些文件进行更改后,

    git add .
    git commit -m 'version 1'
    git tag v1
    #do the test

进行其他更改,

    git reset start --hard
    git add .
    git commit -m 'version 2'
    git tag v2

假设您对file-a的不同版本感兴趣,请使用git checkout v1 -- file-agit checkout v2 -- file-agit checkout start -- file-a在工作树中切换file-a。最后,git tag -d start v1 v2删除标记。在此之前,如有必要,请运行git reset start --hard。分支也可以代替标签。

直接操作blob是另一种方法。

    #make some changes to file-a
    #modify, modify, modify
    #create the blob of this file-a and make a tag for it.
    git tag v1 $(git hash-object -w file-a)

    #restore file-a to HEAD's version
    git checkout -- file-a

    #make some other changes to file-a
    #oh, oh, ah, ah
    #create the blob of this file-a and make another tag for it.
    git tag v2 $(git hash-object -w file-a)

    #now we want version1's file-a
    git cat-file -p v1 > file-a

    #now we want version2's file-a
    git cat-file -p v2 > file-a

完成所有操作后,运行git tag -d v1 v2。至于临时斑点,如果你不再需要它们就把它们留下来,它们不会打扰你。