如何将git存储库一劳永逸地重置为干净状态

时间:2015-09-21 13:17:59

标签: git

我不经常使用git或linux命令行,看起来我搞砸了很多。我是一个Windows用户,我使用cygwin来模仿那个环境。

情况:

我跟踪了多个存储库,一个是我工作的,另一些是我只读的。

有时,当我不长时间拉扯他们(一个人提前超过2k)时,有时候git status告诉我,分支已经发散了。我不知道这是怎么发生的,但我接下来提交了2k提交,然后提前1次提交。然后由于某些文件导致冲突而无法解决拉动失败。

这给我留下了一个问题,我现在有了一个我无法再从中拉出来的存储库,因为它存在冲突。

所以我的问题是:如何在不遇到冲突的情况下再次有效地从该存储库中提取?我不在乎任何改变。

这是我每次搞砸时必须要做的解决方案:

git log --max-parents=0 head # copy ID on bottom
git reset --hard <ID-you-have-copied>
git clean -f -d
git pull

这是愚蠢的,我喜欢在一个命令中拥有它。我知道git别名,但我不知道,如何从命令1获取提交ID到命令2.我也可以使用我可以放在某个地方的shell脚本,这对我来说这样做,但它应该是动态的,没有硬编码ID。

看起来我必须在错误的不存在的提交后面重置分支,然后我可以再次转发

有什么明显的东西我不见了吗?

3 个答案:

答案 0 :(得分:2)

我不确定git --max-parents=0 head命令是什么。

但我想你可以简单地这样做(origin&amp; master可以用所需的远程和分支名称替换):

git fetch origin master
git reset --hard FETCH_HEAD
git clean -f -d

这会将当前分支指针和工作树重置为最新提取的提交(并以与命令相同的方式删除未跟踪的文件)。

注意:这将删除存储库中的所有本地更改,包括已提交和未提交的更改。 (通过引用git reflog虽然)

仍可以恢复已提交的更改

答案 1 :(得分:0)

删除已签出的分支并重新检查,这将绕过所有合并。

答案 2 :(得分:0)

我会做@Alderath指示的内容,但不一定会立即重置你的HEAD。只需执行git fetch origin master(或任何分支即可获得新提交)。 Git fetch只是检索来自origin的提交,而git pull检索并合并,这可能比你想要咬掉的更多(正如你所发现的那样)。然后找出与'git log master ... origin / master'或git diff相同的区别。现在弄清楚你想对这些差异做些什么。您可以尝试在origin / master之上重新定义或合并您的工作,或者只是在origin / master之上重新启动您的更改,如果它只是分歧太大而无法使merge / rebase更容易。

相关问题