有没有比“git reset--hard”更安全的移动分支指针的方法?

有没有比“git reset--hard”更安全的移动分支指针的方法?,git,Git,在使用git时,我倾向于使用许多“高级”功能来重写和重新组织本地历史,然后再推到远程。我经常用来更改当前分支指向的提交的一个命令是git reset--hard。不幸的是,当在本地目录中使用未提交的更改运行此命令时,可能会产生一些不希望看到的效果。由于这个特性,我在过去失去了工作(虽然通常不多,但我倾向于经常提交) 对于更改我当前分支所指向的提交,是否有一种替代方法来替代git reset--hard,当我的工作目录中有未提交的更改时,这不会导致数据丢失?(理想情况下,我想要像git check

在使用git时,我倾向于使用许多“高级”功能来重写和重新组织本地历史,然后再推到远程。我经常用来更改当前分支指向的提交的一个命令是
git reset--hard
。不幸的是,当在本地目录中使用未提交的更改运行此命令时,可能会产生一些不希望看到的效果。由于这个特性,我在过去失去了工作(虽然通常不多,但我倾向于经常提交)


对于更改我当前分支所指向的提交,是否有一种替代方法来替代git reset--hard,当我的工作目录中有未提交的更改时,这不会导致数据丢失?(理想情况下,我想要像
git checkout
这样的东西,它可以更改我当前的分支指针,而不是更改头。)

当您可以使用
git checkout
时,为什么要找像
git checkout
这样的东西呢


您正在寻找的选项是
-B
,它将签出指定的ref并从中创建新分支,或更新现有分支。即使您指定了已在的分支,它也可以工作。

这些将保留您的更改

git reset --soft


完成其中一项后,您可以使用
git diff
评估是否要放弃更改。

git v1.7.3发行说明。。。“git checkout-B”是在“git branch-f”之后加上“git checkout”@uweguder的一个较短的说法,或者发行说明不完整,或者在以后的版本中有所放宽。如果您在分支
master
git分支-f master
是一个错误(“致命:无法强制更新当前分支”),但是
git checkout-B master
可以工作。我已经用Git1.9.4测试过了,这几乎是完美的。我不知道git签出的
选项。现在我只需要写一个别名来处理“当前分支”的填充,这样我就不必每次都键入它了。谢谢你的帮助。;-)@hvd我猜发行说明中的解释是试图非常简洁,结果是不正确的,没有考虑到分支未切换的特殊情况。我的想法也同样草率,没有意识到你的问题是这个特例,并在评论之前测试它。无论如何,我的主要观点是-B被添加到1.7.3中。例如,在Ubuntu Lucid或CentOS/RHEL 6中还不可用。对于任何感兴趣的人,我现在使用以下别名:move branch=!git checkout-B
git rev parse--abbrev ref HEAD
这样做的问题是,它不仅保留了工作目录中的更改,还保留了分支本身的更改。我当然希望对分支重置进行更改,这就是为什么我首先要移动分支指针。
git reset --mixed