14

我的暂存区发生了变化,而其他的还没有暂存(有些文件在暂存区内外都有变化)。我想反转暂存区的内容和未暂存的更改。是否存在一个快捷方式来做到这一点,而无需执行更复杂的操作,如本地分支提交、差异或存储 [等]?谢谢。

4

4 回答 4

6

这是我的做法:

  1. 将索引提交到临时提交
  2. 将剩余部分提交到辅助临时提交
  3. 使用交互式变基切换提交的顺序
  4. 混合复位
  5. 软复位

它可以非常快地手动输入,特别是如果您使用 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
于 2013-03-25T12:16:35.073 回答
5

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

  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
    

根据更改的确切性质,步骤 4 和/或 5 可能会导致您需要手动解决一些合并冲突,但我不确定是否有一种干净的方法可以完全避免这种可能性。

您可能可以使用git stash完成步骤 1 和 4 而不是上述命令,但我不确定这是否真的会给您带来任何好处……</p>

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

于 2013-01-31T16:13:26.567 回答
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

于 2013-12-08T19:43:24.103 回答
0

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

首先git reset,它将所有文件从“暂存”删除到“未暂存以提交的文件”。“暂存”和“未暂存提交的文件”中的文件将保留您当前在“未暂存提交的文件”中的最新更改

然后

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

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

相反,在 you 之后git reset,您可以git checkout /path/to/file为当前“未暂存以进行提交”的文件添加您不想添加到暂存中的文件。这将从“未暂存提交”中删除特定文件

然后运行git add .它会将“未暂存以供提交”中的所有文件添加到“暂存”中 - 以您的情况更容易为准

于 2013-01-31T15:13:46.330 回答