我们刚开始在我们公司的生产中使用git,每个人似乎都有同样的关注/问题。由于我们仍然使用git,我们经常最终弄乱我们的本地代理商。 (糟糕的合并,错误的命令等)。我们想要做的是将我们的本地存储库重置为给定的版本,并删除所有不良更改的残余。
我一直在阅读它,我看到我如何使用'git reset',它有各种选项可以移动头部并使我的工作区恢复到正确的状态,但我不知道是什么这留在了存储库以及如何清理它。
例如,如果我在本地存储库中执行错误合并:
git checkout master git merge wrong_branch
我可以在master中重置以在此之前返回到提交,但是合并提交是否仍然位于存储库对象数据库中?同样,如果它坐在那里我将我的分支推送到远程存储库,它是否会传递错误的合并数据?
有一些方法可以从我的本地存储库中完全远程地阻止错误的合并提交(或任何其他错误的修订),以确保我不会使用应该被忽略的数据污染公共存储库,就好像它从未发生过一样?
答案 0 :(得分:2)
首先,如果你还在学习git并且正在开发一个项目,请备份(即使你是专家,备份也很好)
对于您所说的示例,您只需执行以下操作:
git reset --hard ORIG_HEAD
回去。
合并提交仍然会在那里,但它会“悬空”并在某个时候清理,你不必担心它们。它们不会被推送到另一个存储库。
此外,git reflog
是您应该了解并熟悉的内容。
答案 1 :(得分:1)
其他答案已经指出,您可以使用重置功能在提交发生之前将HEAD移回提交。让我们看一下一个很小的例子吧。您希望在功能分支上工作并希望将其合并回主分支..
$ git log --online
695d21b add some content
9aefcac initial commit
现在你合并了功能分支..
$ git merge --no-ff feature-123
Merge made by the 'recursive' strategy.
feature-123.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 feature-123.txt
然而,在查看更改后,您意识到您不想合并 毕竟在这个分支。没问题。之前的日志输出显示了 master分支之前是 695d21b - 所以只需将HEAD指针移回那里:
$ git reset --hard 695d21b
现在你的工作副本看起来从未发生过。但是,既然你想知道存储库中是否还存在某些东西仍然存在,那么提交对象仍然存在于存储库中:
ec4b538 HEAD@{2}: merge feature-123: Merge made by the 'recursive' strategy.
695d21b HEAD@{6}: checkout: moving from feature-123 to master
c08056a HEAD@{7}: commit: add feature 123
695d21b HEAD@{8}: checkout: moving from master to feature-123
695d21b HEAD@{9}: commit: add some content
9aefcac HEAD@{10}: commit (initial): initial commit
此列表显示了HEAD在某些时候指向的所有提交。这很酷,因为它意味着即使你搞砸了,也几乎总有办法回到你最后的稳定状态。
现在,如果您仍然对某些合并或其他操作感到不安全,您可以随时创建一个抛弃分支并首先在那里尝试。当然,这在技术上可能不是必要的,因为我刚刚向您展示,但它可能会有所帮助,因为它 在那个分支中发生的事情并不重要。你可以在之后摆脱它。
如果你像上面的例子一样向后移动HEAD,你不必担心将垃圾推送到公共回购:'git push'不会超出你当前的HEAD。你需要注意的是,一旦你把东西推到公共回购中,你就不应该在当地摆弄历史了。
也许我对此有点过于复杂 - 希望它有所帮助:)
答案 2 :(得分:0)
只要没有引用指向它,它将在90天内被删除。除非你不小心提交了一个非常大的文件作为合并的一部分,否则我不会担心它。
答案 3 :(得分:0)
Gitx拥有最佳的GUI,用于可视化和重置我见过的分支。如果您需要将分支重置为先前的提交,您只需将分支图标拖动到任何想要当前的提交。我在命令行上完成了大部分的git工作,但是Gitx对于可视化历史记录和清理分支机构非常宝贵。