由于一些糟糕的挑选,我的本地Git存储库目前在原点之前提交了五个提交,并且状态不佳。我想摆脱所有这些提交并重新开始。
显然,删除我的工作目录并重新克隆会这样做,但是再次从GitHub下载所有内容似乎有些过分,而且不能很好地利用我的时间。
也许git revert
是我需要的,但我不希望在原点(甚至六个)之前提交 10 提交,即使它确实获得了代码本身回到正确的状态。我只想假装最后半小时从未发生过。
是否有一个简单的命令可以执行此操作?这似乎是一个明显的用例,但我没有找到任何例子。
请注意,此问题专门针对提交,不关于:
答案 0 :(得分:2024)
如果您的超额提交仅对您可见,您可以这样做
git reset --hard origin/<branch_name>
回到起源的地方。这会将存储库的状态重置为先前的提交,并将丢弃所有本地更改。
执行git revert
使新提交删除旧提交,以保持每个人的历史正确。
答案 1 :(得分:224)
只需删除您的本地主分支并重新创建它:
git branch -D master
git checkout origin/master -b master
答案 2 :(得分:168)
尝试:
git reset --hard <the sha1 hash>
将头重置到您想要的位置。使用gitk查看您想要的提交。你也可以在gitk中重置。
答案 3 :(得分:64)
删除最近的提交:
git reset --hard HEAD~1
删除最近的提交,而不会破坏您已完成的工作:
git reset --soft HEAD~1
答案 4 :(得分:45)
如果您使用 Atlassian SourceTree 应用,则可以使用上下文菜单中的重置选项。
答案 5 :(得分:31)
在你的分支尝试上:
git reset --hard origin/<branch_name>
使用&#34; git log
&#34;验证反转(到状态,没有本地提交)或&#34; git status
&#34;因此。
答案 6 :(得分:19)
git reset --hard @{u}
*删除当前分支上的所有本地更改,包括提交。令我惊讶的是,没有人发布此消息,因为考虑到您不必查找要还原到分支或与分支一起玩的提交。
*也就是说,重置为@{upstream}
的当前分支-通常为origin/<branchname>
,但并非总是如此
答案 7 :(得分:19)
简单的解决方案是将本地主分支HEAD与源/主分支HEAD匹配
git reset --hard origin/master
PS:Origin / master-是指向master分支的远程指针。 您可以使用任何分支名称替换master
答案 8 :(得分:12)
要查看/获取您想要返回的提交的SHA-1 ID
gitk --all
回滚到该提交
git reset --hard sha1_id
!注意。在该提交之后进行的所有提交都将被删除(以及对项目的所有修改)。因此,首先要将项目克隆到另一个分支或复制到另一个目录。
答案 9 :(得分:8)
对于未被推送的本地提交,您还可以使用git rebase -i
删除或压缩提交。
答案 10 :(得分:7)
我有一种情况,我想删除未推送的提交,但提交是在另一个提交之前。为此,我使用了以下命令
git rebase -i HEAD~2
- &gt;它将重新定义最后两次提交
我使用'drop'作为我想删除的提交签名。
答案 11 :(得分:3)
使用任意次数,以恢复到上一次提交,而不会删除您最近创建的任何文件。
git reset --soft HEAD~1
然后使用
git reset HEAD <name-of-file/files*>
取消登台或取消跟踪。
答案 12 :(得分:2)
对于那些对Visual Studio解决方案感兴趣的人,这里是练习:
Team Explorer
窗口中,连接到目标存储库。 Branches
中,右键单击所需分支,然后选择View history
。 History
窗口中右键单击提交,然后选择Reset -> Delete changes (--hard)
。那将丢弃您的本地提交,并将您的回购状态重置为选定的提交。即撤回仓库后所做的更改将丢失。
答案 13 :(得分:2)
在回答之前,让我们添加一些背景知识,解释这是什么HEAD
。因为下面的某些选项会导致头部脱离
First of all what is HEAD?
HEAD
只是对当前分支上当前提交(最新)的引用。
在任何给定时间只能有一个HEAD
。 (不包括git worktree
)
HEAD
的内容存储在.git/HEAD
内部,并且包含当前提交的40个字节的SHA-1。
detached HEAD
如果您不在最近的提交上,则意味着HEAD
指向历史上的先前提交,称为 detached HEAD
。< / p>
在命令行上,它看起来像这样-SHA-1而不是分支名称,因为HEAD
没有指向当前分支的尖端
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
这将签出指向所需提交的新分支。
该命令将签出给定的提交。
此时,您可以创建一个分支并从此开始工作。
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
您也可以随时使用reflog
。
git reflog
将显示更新HEAD
的所有更改,并且签出所需的reflog条目会将HEAD
设置为此提交。
每次修改HEAD时,reflog
git reflog
git checkout HEAD@{...}
这将使您回到所需的提交
git reset --hard <commit_id>
“将” HEAD“移动”回所需的提交。
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
git rebase --no-autostash
。git revert <sha-1>
“撤消”给定的提交或提交范围。
reset命令将“撤消”在给定提交中所做的任何更改。
带有撤消补丁的新提交将被提交,而原始提交也将保留在历史记录中。
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
此架构说明了哪个命令可以执行什么操作。
如您所见,reset && checkout
修改了HEAD
。
答案 14 :(得分:2)
如果您只想丢弃本地提交并将修改保留在文件中,请执行
git reset @〜
其他答案解决了硬重置
答案 15 :(得分:1)
删除未跟踪的文件(未提交的本地更改)
git clean -df
永久删除所有本地提交并获取最新的远程提交
git reset --hard origin/<branch_name>
答案 16 :(得分:1)
为要还原的提交找到sha1:
za$ git reflog
... snip ...
cf42fa2... HEAD@{0}: commit: fixed misc bugs
~
~
cf42fa2... HEAD@{84}: commit: fixed params for .....
73b9363... HEAD@{85}: commit: Don't symlink to themes on deployment.
547cc1b... HEAD@{86}: commit: Deploy to effectif.com web server.
1dc3298... HEAD@{87}: commit: Updated the theme.
18c3f51... HEAD@{88}: commit: Verify with Google webmaster tools.
26fbb9c... HEAD@{89}: checkout: moving to effectif
然后使用--mixed标志,以便您“重置HEAD和索引”:
za$ git reset --mixed cf42fa2
可用标志:
za$ git reset -h
-q, --quiet be quiet, only report errors
--mixed reset HEAD and index
--soft reset only HEAD
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
--keep reset HEAD but keep local changes
--recurse-submodules[=<reset>]
control recursive updating of submodules
-p, --patch select hunks interactively
-N, --intent-to-add
答案 17 :(得分:0)
如果
您的分支比“ origin/XXX
”领先5次提交。
您可以发出:
git reset --hard HEAD~5
它应该删除最近5次提交。
答案 18 :(得分:0)
如果您将本地存储库弄得一团糟,那么丢弃Git中本地提交的一种可靠方法是...
以我的经验,Eclipse很好地处理了周围的环境变化。但是,您可能需要在Eclipse中选择受影响的项目并清理它们以强制Eclipse重新构建它们。我想其他IDE也可能需要强制重建。
上述过程的一个附带好处是,您将发现您的项目是否依赖于未放入git的本地文件。如果发现丢失的文件,则可以从“ my_broken_local_repo”中复制它们并将其添加到git中。一旦确定新的本地存储库已具备所需的一切,就可以删除“ my_broken_local_repo”。
答案 19 :(得分:0)
git reset --hard <SHA-Code>
如果您在本地副本上犯了一些错误,想要确保不会被错误地推送到远程分支,这将派上用场。
可以通过查看git仪表板的webVersion获取分支上的最后一次提交来获得SHA代码。
这样,您可以与分支上的最后一次提交同步。
成功完成硬重置后,您可以执行git pull
,以确认syn没有新内容,即您可以看到该消息。
您的分支机构的日期为Origin/<Branch Name>