由于一些糟糕的选择,我的本地Git存储库目前比原始库提前了五次提交,并且状态不佳。我想摆脱所有这些承诺,重新开始。

很明显,删除我的工作目录并重新克隆就可以了,但再次从GitHub下载所有内容似乎太过了,而且没有很好地利用我的时间。

也许git-restore是我需要的,但我不想在源代码之前提交10次(甚至6次),即使它确实将代码本身恢复到正确的状态。我只想假装最后半小时从未发生过。

有一个简单的命令可以做到这一点吗?这似乎是一个明显的用例,但我找不到任何例子。


请注意,这个问题专门针对提交,而不是:

未跟踪的文件未分级更改已分段但未提交的更改


Try:

git reset --hard <the sha1 hash>

将你的头重置到你想去的任何地方。使用gitk查看你想去哪一个提交。你也可以在gitk内重置。


如果您的超额提交仅对您可见,您可以git reset--硬原点/<branch_name>移回原始位置。这将将存储库的状态重置为上一次提交,并放弃所有本地更改。

执行git还原会生成新的提交以删除旧的提交,从而使每个人的历史保持正常。


只需删除本地主分支,然后按如下方式重新创建:

git branch -D master
git checkout origin/master -b master

如果您使用的是Atlassian SourceTree应用程序,可以使用上下文菜单中的重置选项。


尝试分支时:

git reset --hard origin/<branch_name>

因此,使用“gitlog”或“gitstatus”验证反转(状态,无本地提交)。


要查看/获取提交的SHA-1 id,您也需要返回

gitk --all

回滚到该提交

git reset --hard sha1_id

!笔记在提交之后进行的所有提交都将被删除(以及对项目的所有修改)。因此,首先最好将项目克隆到另一个分支或复制到另一目录。


对于未被推送的本地提交,还可以使用gitrebase-i删除或压缩提交。


我有一种情况,我想删除一个未被推送的提交,但该提交在另一个提交之前。为此,我使用了以下命令

git rebase-i HEAD~2->它将对最后两次提交进行重新基化

我使用“drop”作为我想要删除的提交签名。


删除最近的提交,而不破坏您所做的工作:

git reset—软HEAD~1

删除最近的提交并删除更改:

git重置--硬HEAD~1


gitreset-hard@{u}*删除当前分支上的所有本地更改,包括提交。我很惊讶还没有人发布这篇文章,考虑到你不必查找要恢复到的内容或使用分支。

*也就是说,在@{upstream}-通常是origin/<branchname>处重置为当前分支,但并不总是这样


git reset --hard <SHA-Code>

如果您在本地副本上犯了一些错误,希望确保不会被错误地推送到远程分支,这将非常有用。

SHA代码可以通过查看git仪表板的webVersion获取,以获取分支上的最后一次提交。

这样,您可以与分支上的最后一次提交同步。

您可以在成功完成硬重置后执行git pull,以确认syn没有任何新内容,即您可以看到消息。

您的分支机构是最新的来源/<分支机构名称>


删除未跟踪的文件(未提交的本地更改)

git clean -df

永久删除所有本地提交并获取最新的远程提交

git reset --hard origin/<branch_name>

对于那些对Visual Studio解决方案感兴趣的人,以下是演练:

在团队资源管理器窗口中,连接到目标存储库。然后从“分支”中,右键单击感兴趣的分支并选择“查看历史记录”。右键单击历史窗口中的提交,然后选择重置->删除更改(--hard)。

这将丢弃本地提交,并将回购的状态重置为所选提交。也就是说,取消回购后的更改将丢失。

更新

上述程序在VS2019之前运行良好;在VS2022中,有新的Git体验。工作流程类似,但UI有点不同。使用Git菜单中的管理分支,而不是团队资源管理器。现在只需单击左侧的分支,其历史记录将显示在右侧。然后右键单击->重置->删除更改(--hard)


如果您的分支比“origin/XXX”领先5次提交。

您可以发布:

git reset --hard HEAD~5

它应该删除最后5个提交。


在回答之前,让我们添加一些背景,解释一下这个HEAD是什么。因为下面的一些选项会导致头部分离

首先,什么是头部?

HEAD只是对当前分支上当前提交(最新)的引用。在任何给定时间只能有一个HEAD。(不包括git工作树)

HEAD的内容存储在.git/HEAD中,它包含当前提交的40字节SHA-1。


分离式封头

如果您不在最近一次提交中,这意味着HEAD指向历史上的先前提交,它称为分离的HEAD。

在命令行上,它看起来像-SHA-1而不是分支名称,因为HEAD没有指向当前分支的末端

关于如何从分离的HEAD恢复的几个选项:


git校验

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>

数字刷新

您也可以始终使用reflog。git reflog将显示更新HEAD的任何更改,检查所需的reflog条目将将HEAD设置回该提交。

每次修改HEAD时,reflog中都会有一个新条目

git reflog
git checkout HEAD@{...}

这会让你回到你想要的承诺


git reset--hard<commit_id>

将你的头“移”回所需的位置。

# 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 2.7以来)您也可以使用git rebase--也可以不使用autostash。


git还原<sha-1>

“撤消”给定的提交或提交范围。重置命令将“撤消”给定提交中所做的任何更改。将提交带有撤销补丁的新提交,而原始提交也将保留在历史记录中。

# 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>

此模式说明了哪个命令执行什么操作。正如您可以看到的那样,重置和签出修改HEAD。


如果你让你的本地repo变得一团糟,那么在Git中丢弃本地提交的一个可靠方法就是。。。

使用“git-config--getremote.login.url”获取远程源的url将本地git文件夹重命名为“my_broken_local_repo”使用“gitclone<url_from_1>”获取远程git存储库的新本地副本

根据我的经验,Eclipse可以很好地处理周围的世界变化。然而,您可能需要在Eclipse中选择受影响的项目并清理它们,以迫使Eclipse重新构建它们。我想其他IDE可能也需要强制重建。

上述过程的一个副作用是,您将发现您的项目是否依赖于未放入git的本地文件。如果您发现缺少文件,那么可以将它们从“my_broken_local_repo”复制到git中。一旦您确信新的本地存储库具备所需的一切,就可以删除“my_broken_local_repo”。


简单的解决方案是将本地主分支HEAD与源/主分支HEAT匹配

git reset --hard origin/master

PS:origin/master-是指向主分支的远程指针。您可以用任何分支名称替换master


如果您只想丢弃本地提交并将修改保存在文件中,那么请执行git复位@~其他答案解决了硬重置问题


查找要还原到的提交的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

使用任意次数,恢复到上次提交,而不删除最近创建的任何文件。

git reset --soft HEAD~1

然后使用

git reset HEAD <name-of-file/files*>

拆下或解开。


您可以使用此git命令

git reset --hard origin/<branch_name>

对于所有未标记的更改,git checkout--。

对于特定文件git checkout--路径/to/file/to/revert


更新时间:

您可以在此处使用新的GIT LFS:https://git-lfs.github.com/

git lfs migrate import --include="*.file_type"

然后git push


您可以考虑使用带有drop命令的交互式rebase

比如说最后三次犯罪。。。

git rebase -i HEAD~3

交换拾取命令

pick <hash1> Commit message 1
pick <hash2> Commit message 2
pick <hash3> Commit message 3

用于放置命令

drop <hash1> Commit message 1
drop <hash2> Commit message 2
drop <hash3> Commit message 3

TL;博士

在你的树枝上

git reset--hard HEAD^将丢弃最后一次本地提交

git reset--hard HEAD~n将丢弃最后n个本地提交


$ git fetch origin
$ git reset --hard origin/master

这将下载最新版本的远程分支,并用它覆盖本地分支,从而有效地丢弃所有本地提交。如有必要,用适当的远程分支名称替换原始/主分支。