2013-01-31 38 views
9

我的临时区域发生了变化,还有一些还没有暂存(某些文件在暂存区域内外都有变化)。 我想反转暂存区域的内容以及未暂存的更改。为了做到这一点,是否存在一个快捷方式,而不需要执行更复杂的操作,如本地侧枝提交,差异或存储[等]?谢谢。Git反转临时区域

+8

的可能重复[?什么是交换的最短途径演出和Git中不分阶段的变化(http://stackoverflow.com/questions/3573410/what-is-最短路到交换分阶段和非分段更改在git) –

+0

哇,感谢您的链接。不一样的搜索条件,但同样的问题,的确如此。 – moala

回答

0

这是我用来解决这个问题。

第一个git reset它将删除所有文件从'staging'到''文件没有提交'提交'。这是两个“分期”和文件“没有上演提交的文件”,则会保留最近当前在更改“文件没有上演犯”

然后

git add /path/to/file你所需要的特定文件要添加到分期

不完全是一条捷径,但它能够完成

反向地工作,你git reset后,你可以git checkout /path/to/file对于目前“没有上演承诺”你不要的文件”你想添加到分期。这将从“不上演犯”

然后运行git add .这将增加在“未上演承诺”到“升级”的所有文件删除特定的文件 - 无论是你的情况更容易

+0

实际上,我最好不要手动做,因为上演和非上演之间的界限是相当复杂的:即使在一些文件里面,一些行是上演的,其他的非上演的。 – moala

+0

你看起来我最近编辑关于文件既上演也不上演? –

+0

你是什么意思“你可以结账你不想要的文件[...]”?这对我来说是相当隐晦的...... – moala

3

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

  1. 生成为您目前正在使用的东西打补丁rking目录,但不是在你的指数,但(东西你没有为做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. 一pply你不分阶段的补丁都工作目录和索引,导致这些变化正在上演

    git apply --index /tmp/unstaged.patch 
    
  5. 应用您上演补丁只针对你的工作目录

    git apply /tmp/staged.patch 
    

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

你也许可以使用git stash完成步骤1和4,而不是上面的命令,但我不知道,真的会得到你任何东西

此外,您还可以查看该手册页git diff-*git apply首先查看是否有其他选项可能对您有用。

4

这里是我如何做到这一点:

  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 
+0

我喜欢这个,除了手动编辑交换提交。 http://stackoverflow.com/questions/16203562/programmatically-swap-last-two-commits –

+0

好点。但对我个人而言,这个问题并不足以写出一个快捷方式脚本,并记住它的名称和工作原理。互动式重新装订我几乎每天都会这样做,它对我来说非常直观和高效。 – gtd

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

+2

我已经做了一些调查和测试,这是我的未经授权的文档:'swaplast'交换最后一次和最后一次提交。注意:它会在不通知的情况下丢弃未经改动的更改。 'invertindex'交换暂存和未暂存的更改,包括未跟踪的文件。 – Melebius

+0

如果由于某种原因失败了,你可能需要运行'git cherry-pick --abort',然后才能再次运行'git invertindex'。 – u01jmg3