如何在不提交的情况下保护当前分支的状态?

时间:2018-06-06 13:03:06

标签: git

我在一个尚未准备好承诺的分支上,但我想尝试一些实验性的东西。我想隐藏分支的当前状态,以便在出现问题时可以恢复。

当我执行git stash时,它会将分支恢复到之前的提交,因此工作树是干净的,我可以签出一个新的实验分支。一旦进入新分支,我运行git stash apply以获取原始状态以尝试我的实验性更改。

我做了一些更改并决定废弃它们。当我结帐到第一个分支并运行git stash apply我得到一个错误,我在实验分支中做的所有更改都在那里。如何在实验变更之前获得原始状态?感谢。

例如:

  • 我创建了另一个测试回购,因为我不知道自己在做什么。我创建了一个名为test.txt的文件并执行初始提交。
  • 然后执行git checkout -b branch1并在文本文件类型"分支1更改"。
  • 然后我git stash来保护当前分支的未提交状态。它删除了我刚刚做的,工作树是干净的。
  • 所以我做git checkout -b experiment
  • 在那里我做git stash apply并恢复原状态。
  • 我做出改变并决定我不想要它们。
  • 然后我做git checkout branch1。现在来自实验分支的更改已经存在,当我尝试git stash apply恢复旧状态时,我收到错误。

我想知道正确的方法来简单地保护一个分支的当前状态,这个状态还没有准备好为了尝试实验而提交。

2 个答案:

答案 0 :(得分:3)

你正在过度思考这个问题。如果要保护当前状态,请提交。只要您不推送提交,就可以稍后将其从历史记录中删除,方法是使用--amend选项进行后续提交,或者使用交互式rebase压缩它。 (或其他方式,视情况而定。)

(我不是说你不能使用存储 - 这毕竟是一种临时提交的机制。但正如你所观察到的那样,以这种方式使用存储不是'自然或直观,这是因为这不是什么藏匿的设计。存储是为了保留您的WIP和分阶段的变化,而你转移做其他事情,这与检查有些不同 - 指出您的更改,以便您可以继续工作,然后恢复到当前状态。)

答案 1 :(得分:1)

Git阶段本身的创建部分是为了处理您当前的确切场景。

要添加Mark的答案,在您的情况下,您甚至可能不需要存储或提交。您可以暂存当前已完成的工作,然后尝试一些事情,这将改变您的工作目录,但阶段。然后,如果您对这项工作感到满意,可以将其添加到舞台上。否则,您可以将工作目录中已更改的文件重置为上次暂存时的状态。工作流程看起来像这样:

obj, _ = Ingredient.objects.get_or_create(**ingredient)

如果实验确实有效,那么您可以再次执行# work work work git add test.txt # try something out, modify test.txt # if it didn't work out, then just reset test.txt to the stage git checkout -- test.txt ,将更改添加到舞台并提交。