如何git stash只播放文件?

时间:2015-09-07 10:04:37

标签: git

在交互式rebase期间,我经常发现我想在当前变更集之前进行一些更改,例如如果我有:

A->BCD->E

我想转到:

A->D->BC->E

所以我做了一个交互式rebase,并编辑相关的变更集。所以我希望能够:

  1. reset --soft
  2. 提交BCD
  3. unstage D
  4. 存储分阶段的更改
  5. 提交D
  6. 弹出藏匿处
  7. 提交
  8. 这是可能的,还是有更简单的方法来实现这个目标?

1 个答案:

答案 0 :(得分:0)

我在官方git邮件列表上提出了这个问题,但没有得到真正的答案。 http://git.661346.n2.nabble.com/Proposal-for-git-stash-add-staged-option-td7629171.html

以下是我现在使用的内容:

这样就可以git cstash "optional message"将所有staged个文件藏匿到藏匿处。 它处理脏和清洁状态。

#/bin/sh
#
function evil_git_dirty {
  [[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]] && echo "dirty" || echo "clean"
}

function create_stash {
    # And convert into a stash
    if [ "$1" == "" ]
    then
        # Unnamed stash
        git stash
    else
        # Named stash
        git stash save "$1"
    fi
}

IS_DIRTY=$(evil_git_dirty)

echo "$IS_DIRTY"

if [ "$IS_DIRTY" == "clean" ] 
then
    create_stash "$1"
    exit 0
fi

# Put staged files in a tempory commit
git commit -m 'temporary, will be stashed soon' --no-verify
# Put everything else in a temporary stash
git add .
git stash
# Remove commit
git reset HEAD^1

git add .

create_stash "$1"
# Pop the temporary stash
git stash pop stash@{1}
git reset .