在git中应用存储更改,其中存储包含已移动的文件

时间:2014-01-22 10:20:38

标签: git git-stash

我当前的分支已将某些文件移动到不同的文件夹,并且创建的存储库已对位于旧文件夹中的文件进行了更改。如何在不破坏任何东西的情况下正确应用存储,并且想知道最简单的方法。

2 个答案:

答案 0 :(得分:3)

我看到了一些简单的步骤:

  1. 将部分文件(仅git stash show所需的文件)移回旧地方:

    git mv file old_place/file
    
  2. 将存储应用于这些文件:

    git stash pop
    
  3. 合并更改(如果有):

    vim ...
    git add ...
    
  4. 将文件移回适当的位置:

    git mv old_place/file file
    
  5. 之后,您将使用 stash 添加到 index 文件中。

答案 1 :(得分:1)

  

我当前的分支已将某些文件移动到不同的文件夹,并且创建的存储库已对位于旧文件夹中的文件进行了更改。

这是典型的git stash试图检测已移动/重命名的文件 这不再是Git 2.12(2017年第一季度)的问题:

commit 9d4e28eJeff King (peff)(2016年12月6日) Junio C Hamano -- gitster --合并于commit db09f21,2016年12月19日)

  

stash:更喜欢管道git-diff

     

启用diff.renames配置时(使用Git 2.9及更高版本,   它默认启用,这使情况更糟)," git stash"如果删除文件并添加了另一个内容非常相似的文件,则行为不端。

     

创建存储时,我们需要查看工作树和HEAD之间的差异,并使用git-diff瓷器进行操作。
  由于git-diff默认情况下启用了瓷器配置,因此至少会出现一个问题。 --name-only格式不会提及重命名的源端,这意味着我们将无法隐藏删除   重命名的一部分。

     

我们可以通过传递--no-renames来解决这个问题,但这是一个更大问题的症状。我们应该在这里使用diff-index管道,默认情况下没有启用重命名,也不尊重任何管道   可能令人困惑的配置选项。

这意味着以下内容将起作用:

mv file renamed &&
git add renamed &&
git stash &&
git stash apply

将要恢复的内容是名为' renamed'的文件,而不是名为' file'的文件。 (在renamed之前移动为&{39; git stash'