Git倒置临时区域

moa*_*ala 11 git staging git-stage

我有我的临时区域的变化,和其他人没有上演(有些文件有在国内外享有很高的暂存区的变化).我想反转暂存区域的内容和未暂存的更改.为了做到这一点,是否存在快捷方式,而不执行更复杂的操作,如本地侧支持提交,差异,或存储[等]?谢谢.

twa*_*erg 5

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

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

    git diff-files -p > /tmp/unstaged.patch
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为您已经添加到索引中的内容生成补丁 HEAD

    git diff-index --cached -p HEAD > /tmp/staged.patch
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将索引和工作目录重置为 HEAD

    git reset --hard HEAD
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将未暂存的补丁应用于工作目录和索引,从而导致这些更改暂存

    git apply --index /tmp/unstaged.patch
    
    Run Code Online (Sandbox Code Playgroud)
  5. 仅针对您的工作目录应用您的暂存补丁

    git apply /tmp/staged.patch
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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


gtd*_*gtd 5

这是我的方法:

  1. 将索引提交到临时提交
  2. 将其余部分提交给第二临时提交
  3. 使用交互式rebase切换提交的顺序
  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
Run Code Online (Sandbox Code Playgroud)


Ale*_*spo 0

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

首先git reset,这会将所有文件从“暂存”删除为“未暂存提交的文件”。“暂存”和“未暂存用于提交的文件”中的文件将保留当前在“未暂存用于提交的文件”中的最新更改

然后

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

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

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

然后运行,git add .将“未暂存提交”中的所有文件添加到“暂存”中 - 以适合您的情况为准