我有我的临时区域的变化,和其他人没有上演(有些文件有在国内外享有很高的暂存区的变化)。 我想反转临时区域的内容和未上演的变化。 难道没有做这样的本地侧分支提交,或diff文件,或藏匿[等]更复杂的动作,以做一个快捷方式存在 ? 谢谢。
Answer 1:
下面是我如何做到这一点:
- 提交索引到一个临时提交
- 提交剩余的二次临时提交
- 开关与互动底垫的托提交的顺序
- 混合复位
- 软复位
它可以被输入了手动蛮快的,特别是如果你使用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:
有可能做到这一点的方法不止一种,但我想我会采取这种方式 - 我们目前无法预建的快捷方式,但你可以很容易地编写自己的脚本来遵循这个过程:
产生这是当前的工作目录中,但不是在你的指数,但(东西你没有做过的东西补丁
git add
了)git diff-files -p > /tmp/unstaged.patch
生成了你已经添加到索引与目前的补丁
HEAD
git diff-index --cached -p HEAD > /tmp/staged.patch
重置您的索引和工作目录到你的
HEAD
git reset --hard HEAD
应用您未分级的补丁到两个工作目录和索引,导致这些变化正在上演
git apply --index /tmp/unstaged.patch
应用您上演补丁只针对你的工作目录
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 .
这将增加在“未上演承诺”到“升级”的所有文件 - 无论是你的情况更容易