【问题标题】:How to switch and save without commit in git?如何在不提交的情况下在git中切换和保存?
【发布时间】:2017-07-27 13:28:25
【问题描述】:

我在一个分支上工作,突然我不得不切换到另一个分支来修复一个紧急的错误。问题是我对当前分支所做的更改仍然是一团糟,我不想提交它并留下一些零碎的提交消息。

有什么方法可以在不提交的情况下保存当前更改?

【问题讨论】:

标签: git github


【解决方案1】:

是的,您可以使用 stash。

git stash

它会将所有未提交的内容保存在一个特殊区域中,您可以稍后使用它来取回它

git stash apply

您可以通过以下方式查看存储中的内容

git stash list

【讨论】:

    【解决方案2】:

    Stash 显然有效。我只是想提出一个可行的选择,即使不是更好的选择,只提交你所拥有的一切,原因如下:

    1. Stash 与当前分支、索引和工作空间分开保存,不太明显。除非您要解决其他问题并快速切换回来,否则一段时间后实际上更容易混淆存储状态。
    2. 只要您不推送提交,在您的环境中提交您的更改不会影响任何其他人或任何人。完成该功能后,您可以随时重新组织提交。与 stash 相比,在其所属的功能分支上提交更易于以后管理。

    【讨论】:

    • 您也可以设置git log 命令来显示存储。对我来说,它们以与提交类似的方式出现(作为图中的一个节点,并且有一个祖先提交作为父级)。关于你的第二点,这取决于你的工作流程,有些人更喜欢只提交带有非常描述性消息的小提交,其他人(比如我自己)更喜欢工作,但我们认为当时最有效,并将提交压缩为“假” 让别人容易消化的历史。对于遵循第一种方法的人来说,很容易做出他们会忘记的混乱提交。
    • ... stash 有助于避免这种情况。我认为不同的人使用 git 的不同功能,它支持很多工作流,这很棒。
    • @instantepiphany 没有参数。这真的取决于个人风格和环境。
    【解决方案3】:

    这是受@jingx 的回答启发而设置的一个简洁的小bash 函数:

    gcl() { 
        echo "### Adding any wip files";
        git add .; 
        echo "### Committing files with a temporary commit";
        git commit --no-verify -am 'local commit - work in progress';
        echo "### Checking out branch";
        git checkout "$1";
        x="$(git log -1 --pretty=%B)"
        if [ "$x" = "local commit - work in progress" ]; then
            echo "### Undoing last commit";
            git reset --soft HEAD^
        else 
            echo "### Not undoing last commit"
        fi
        echo "gcl complete"
    }
    

    将其添加到您的 .bashrc 或 .profile 中,然后使用 gcl my-branch 切换分支并将您的工作保存为本地提交,同时在更改时解压缩您的本地提交。


    例如,假设您使用的是 branch1 并且有未提交的更改。做一个

    gcl urgent-fix

    做任何你需要做的事,然后跳回去

    gcl branch1

    您未提交的更改将与您离开时一样。

    尽管确实发生了提交,但它不会被远程推送,因此可以在本地撤消而不会产生任何后果。

    【讨论】:

    • 哇!非常感谢。这是完美的!
    • gcl 代表 Git Checkout save Local
    猜你喜欢
    • 2016-07-09
    • 2023-04-05
    • 2012-11-18
    • 2019-12-13
    • 2020-08-29
    • 1970-01-01
    • 2023-04-05
    • 2021-01-18
    • 2010-10-03
    相关资源
    最近更新 更多