【问题标题】:Revert staged changes, keep unstaged changes还原分阶段的更改,保留未分阶段的更改
【发布时间】:2016-10-24 10:57:14
【问题描述】:

我在 git 中有一些暂存和未暂存的更改,以及一些未跟踪的文件。我想保留未暂存的更改和未跟踪的文件,并丢弃暂存的更改。

在命令行上最简单的方法是什么?

【问题讨论】:

    标签: git commit revert git-reset


    【解决方案1】:

    我在 git 中有一些暂存和未暂存的更改,以及一些未跟踪的文件。我想保留未提交的更改和未跟踪的文件,并丢弃已提交的更改。

    正如您在评论中澄清的那样,您的意思是“...并放弃 已分阶段 的更改”(而不是 已提交的 更改)。通常,您将使用git reset 撤消git add。但是在您的情况下,您希望保留未分阶段的更改,因此:

    git commit     # move staged to a commit, does not touch unstaged changes/unadded files
    
    git checkout HEAD^    # checkout the previously committed version while keeping unstaged changes/unadded files   
    
    git branch yourbranchname --force    # to grab the branch and move it back as well
    

    【讨论】:

    • 实际上,这个问题在我的用例中确实有意义。所以我不想取消暂存,而是真正取消暂存并丢弃已暂存的更改,而不会丢失(当前)未暂存的更改...
    • 是的,但是您写了“放弃已提交的更改”。你的意思是“分阶段的变化”。此处的重要区别,您可能需要更新您的问题。
    • 哦,你当然是对的,那是一个错字。感谢您的提示,我更新了问题!
    【解决方案2】:
    git reset HEAD^
    

    将 HEAD 重置为其父级,现在提交更改在索引中被丢弃但保留在工作树中。

    git checkout -- paths_of_files_whose_changes_are_to_be_discarded_in_the_work_tree
    

    放弃工作树中的更改。

    【讨论】:

    • 对不起,问题中有一个错误,所以我更新了它(我错误地写了“commited”而不是“staged”)。所以我认为你的答案不再适合......
    • @JanRüegg 然后,git reset -- path_of_file 可以丢弃索引中文件的更改。另一个 git checkout -- path_of_file 可以丢弃工作树中的 chages。
    • 好主意...但是,索引中有很多文件,所以我选择了另一种解决方案来节省一些输入;)
    • @JanRüegg 只要有帮助就可以。
    【解决方案3】:

    恢复未暂存的更改保留暂存的更改,请将其添加到您的~/.gitconfig

    [alias]
        revert-unstaged = "!sh -c '{ git commit -m=tmp && git reset --hard HEAD && git reset --soft HEAD^ || git reset --hard HEAD; } > /dev/null 2>&1; git status'"
    

    然后您可以执行git revert-unstaged,它执行以下操作:

    • 如果有阶段性更改,则创建本地提交

    • 使用git reset --hard HEAD删除任何未暂存的更改

    • 如果已暂存更改,请还原本地提交以恢复它们

    • 运行 git status 以了解新状态的概览

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2018-04-04
      • 2011-10-18
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多