丢弃Git中的本地提交

丢弃Git中的本地提交,git,Git,由于一些错误的选择,我的本地Git存储库目前比源代码提前了五次提交,并且状态不好。我想摆脱所有这些承诺,重新开始 显然,删除我的工作目录并重新克隆就可以了,但再次从GitHub下载所有内容似乎有些过火,并没有很好地利用我的时间 也许我需要的是git revert,但我不想在源代码之前提交10次(甚至6次),即使它确实将代码本身恢复到正确的状态。我只想假装过去的半小时从未发生过 有一个简单的命令可以做到这一点吗?这似乎是一个显而易见的用例,但我没有找到任何例子 请注意,此问题是关于提交的,而不是

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

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

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

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


请注意,此问题是关于提交的,而不是关于:

  • 未跟踪的文件
  • 未老化的变化
  • 已暂存但未提交的更改
试试:

git reset --hard <the sha1 hash>
git重置——硬

让你的头回到你想去的地方。使用gitk查看您要进行的提交。您也可以在gitk中执行重置操作。

如果您的多余提交仅对您可见,则只需执行以下操作即可
git重置——硬原点/
返回原点所在的位置。这会将存储库的状态重置为上一次提交,并将放弃所有本地更改


执行
git revert
会进行新的提交以删除旧的提交,从而保持每个人的历史记录正常。

只需删除本地主分支,然后像这样重新创建它:

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

如果您正在使用Atlassian SourceTree应用程序,则可以使用关联菜单中的重置选项


关于您的分支尝试:

git reset --hard origin/<branch_name>
git重置——硬原点/

使用“
git log
”或“
git status
”验证反转(到无本地提交的状态)。

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

gitk --all
回滚到该提交

git reset --hard sha1_id

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

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

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

git rebase-i HEAD~2
->它将重新设置最后两次提交的基础


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

删除最近的提交:

git重置——硬头~1


删除最近的提交,但不破坏已完成的工作:

git reset--soft HEAD~1

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

*也就是说,在
@{upstream}
-通常是
origin/
,但并不总是
git reset-硬
如果您在本地副本上犯了一些错误,并且希望确保这些错误不会被错误地推送到远程分支,那么这将非常有用

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

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

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

您的分支机构是最新的,
Origin/
删除未跟踪的文件(未提交的本地更改)

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

git reset --hard origin/<branch_name>
git重置——硬原点/

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

  • 团队资源管理器
    窗口中,连接到目标回购
  • 然后从
    分支
    ,右键单击感兴趣的分支并选择
    查看历史
  • 右键单击
    历史记录
    窗口中的提交,然后选择
    重置->删除更改(--hard)
  • 这将丢弃本地提交,并将repo的状态重置为所选提交。即,您在撤销回购后所做的更改将丢失。

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

    您可以发布:

    git reset --hard HEAD~5
    

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

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

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

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


    分离头
    如果您不在最新提交上-意味着
    头部
    指向历史记录中的先前提交,则称为
    分离头部

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

    有关如何从分离的头部恢复的几个选项:
    这将使你回到你想要的承诺


    “移动”你的头回到想要的位置

    #这将破坏任何本地修改。
    #如果你有未完成的工作要做,就不要做。
    git重置—硬0d1d7fc32
    
    git reset --hard origin/<branch_name>
    
    git reset --hard HEAD~5
    
    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
    git checkout HEAD@{...}
    
    git reset --hard origin/master
    
    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
    
    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*>