Git的反转集结区(Git invert staging area)

2019-08-16 16:11发布

我有我的临时区域的变化,和其他人没有上演(有些文件有在国内外享有很高的暂存区的变化)。 我想反转临时区域的内容和未上演的变化。 难道没有做这样的本地侧分支提交,或diff文件,或藏匿[等]更复杂的动作,以做一个快捷方式存在 ? 谢谢。

Answer 1:

下面是我如何做到这一点:

  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


Answer 2:

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

  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,而不是上面的命令,但我不知道,真的会得到你什么?

此外,您还可以查看该手册页git diff-*git apply第一命令,看是否有可能让你感觉使用其他选项。



Answer 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



Answer 4:

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

首先git reset将从“分期”的所有文件删除到“未上演提交的文件”。 这是两个“分期”和文件“没有上演提交的文件”,则会保留最近当前在您的“文件未上演犯”的变化

然后

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

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

反之,当你git reset ,你可以git checkout /path/to/file为当前文件“不会上演承诺”你不希望添加到分期。 这将从“不上演提交”删除特定文件

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



文章来源: Git invert staging area