Git倒置临时区域

时间:2013-01-31 15:05:08

标签: git staging git-stage

我的暂存区域已经发生变化,而其他人尚未暂存(某些文件在暂存区域内外都有变化)。 我想反转暂存区域的内容以及未暂存的更改。是否存在快捷方式,而不执行更复杂的操作,如本地侧支持提交,差异或存储[等]?感谢。

4 个答案:

答案 0 :(得分:4)

这可能不止一种方法,但我认为我会采用这种方法 - 目前没有预先构建的快捷方式,但你可以很容易地编写自己的脚本来遵循这个过程:

  1. 为您当前在工作目录中但尚未在索引中的内容生成补丁(您尚未执行的操作git add

    git diff-files -p > /tmp/unstaged.patch
    
  2. 根据当前HEAD

    为您已添加到索引中的内容生成修补程序
    git diff-index --cached -p HEAD > /tmp/staged.patch
    
  3. 将索引和工作目录重置为HEAD

    git reset --hard HEAD
    
  4. 将未分段的补丁应用于您的工作目录和索引,从而导致这些更改被暂存

    git apply --index /tmp/unstaged.patch
    
  5. 仅对您的工作目录

    应用暂存的补丁
    git apply /tmp/staged.patch
    
  6. 根据更改的确切性质,步骤4和/或5可能会导致您需要手动解决的某些合并冲突,但我不确定是否有一种干净的方法可以完全避免这种可能性。

    您可以使用git stash来完成第1步和第4步,而不是上述命令,但我不确定这会给你带来什么......

    此外,您可能需要先查看git diff-*git apply命令的手册页,看看是否有其他选项可供您使用。

答案 1 :(得分:4)

我是这样做的:

  1. 将索引提交到临时提交
  2. 将余数提交给辅助临时提交
  3. 使用交互式rebase
  4. 切换提交顺序
  5. 混合重置
  6. 软重置
  7. 可以非常快速地手动输入,特别是如果您使用Vim进行提交消息:

    git commit -m tmp1
    git add . # optionally with `git add -u` if there are deletions
    git commit -m tmp2
    git rebase -i HEAD~2 # swap the order of the commits; `ddp:wq` in vi
    git reset HEAD~1
    git reset HEAD~1 --soft
    

答案 2 :(得分:3)

根据gtd的答案和脚本反转提交的能力,这就是我现在正在使用的内容:

[alias]                                                                                                                                                                                                              
    swaplast = !git tag _invert && git reset --hard HEAD~2 && git cherry-pick _invert _invert~1 && git tag -d _invert                                                                                            
    invertindex = !git commit -m tmp1 && git add -A && git commit -m tmp2 && git swaplast && git reset HEAD~1 && git reset HEAD~1 --soft

在我的博客上发布:http://blog.ericwoodruff.me/2013/12/inverting-git-index.html

答案 3 :(得分:0)

这是我用来解决这个问题的方法。

第一个git reset,它会将“暂存”中的所有文件删除为“未提交提交的文件”。 “暂存”和“未提交提交的文件”中的文件将保留当前位于“未提交提交的文件”中的最新更改

然后

git add /path/to/file您需要添加到暂存的特定文件

不完全是捷径,但它完成了工作

相反,在git reset之后,您可以git checkout /path/to/file查找当前“未进行提交”的文件,您不想将其添加到暂存中。这将从'not staged to commit'

中删除特定文件

然后运行git add .,这会将'not staged for commit'中的所有文件添加到'staging'中 - 以您的情况更容易为准