当前位置: 首页 > 知识库问答 >
问题:

删除本地Git更改的各种方法

姬向明
2023-03-14

我刚刚克隆了一个git存储库并检查了一个分支。我工作了它,然后决定删除所有我的本地更改,因为我想要的原始副本。

简而言之,我必须执行以下两个命令来删除我的本地更改

git checkout .

git clean -f

我的问题是,

(1)这是摆脱局部变化的正确方法吗?否则请告诉我正确的方法。

(2)我们什么时候使用git reset--hard,因为即使没有这个命令我也能重置

谢谢

*解决方案:主要编辑:03/26:*用特定于git的术语[跟踪/未跟踪/分段/未分段]替换了许多模糊的术语

当我们进行本地更改时,可能只有三类文件:

类型1。分段跟踪的文件

类型2。未分段的跟踪文件

类型3。未分段的未跟踪文件,也称为未跟踪文件

  • 分段-移动到分段区域/添加到索引的分段
  • 跟踪-修改的文件
  • 未跟踪-新文件。总是没有演出的。如果分段,则表示它们被跟踪。

每个命令的作用:

>

  • Git签出。-仅删除未分段的跟踪文件[类型2]

    git clean-f-仅删除未分段的未跟踪文件[类型3]

    Git reset--硬-仅删除分段跟踪和未分段跟踪的文件[类型1,类型2]

    Git stash-u-删除所有更改[类型1、类型2、类型3]

    结论:

    很明显我们可以使用任何一种

    (1) combination of `git clean -f` and `git reset --hard` 
    

    (2) `git stash -u`
    

    以达到预期的效果。

    注意:Stashing,这个词的意思是“把(某物)安全地秘密地储存在指定的地方。”这始终可以使用Git stash pop来检索。因此在以上两个选项中进行选择是开发人员的决定。

    谢谢Christoph和Frederik Schøning。

    编辑:03/27

    我认为值得在Git clean-f中添加“小心”注释

    Git Clean-F

    没有回头路了。使用-n--dry-run预览您将造成的伤害。

    如果还想删除目录,请运行git clean-f-d

    如果只想删除忽略的文件,请运行git clean-f-x

    如果要删除忽略和未忽略的文件,请运行git clean-f-x

    参考:关于Git clean的更多信息:如何从当前Git工作树中删除本地(未跟踪的)文件?

    编辑:05/20/15

    放弃此分支上的所有本地提交[删除本地提交]

    为了丢弃此分支上的所有本地提交,为了使本地分支与此分支的“上游”相同,只需运行git reset--hard@{u}

    参考:http://setrobertson.github.io/gitfixum/fixup.html

    或者执行Git重置--硬起源/主[如果本地分支是master]

    注:2015年6月12日,这不是另一个问题的重复,所以被标记为重复的问题。这个问题解决了如何删除本地GIT更改[删除添加的文件,删除对现有文件添加的更改等,以及各种方法;其中另一个SO线程只解决了如何删除本地提交。如果您添加了一个文件,并且您想单独删除该文件,那么另一个SO线程不会讨论它。因此这不是另一个线程的重复]

    编辑:06/23/15

    如何还原已推送到远程存储库的提交?

    $ git revert ab12cd15
    

    编辑:09/01/2015

    从本地分支和远程分支删除以前的提交

    案例:您刚刚向本地分支机构提交了一个更改,然后立即推到远程分支机构,突然意识到,哦,不!我不需要这个零钱。现在做什么?

    Git重置--硬头~1[用于从本地分支删除提交]

    Git push origin Head--force[必须执行这两个命令。要从远程分支中删除]

    树枝是什么?它是当前签出的分支。

    编辑09/08/2015-删除本地git合并:

    我在master分支和合并的master分支以及一个新工作的分支Phase2

    $ git status
    # On branch master
    
    $ git merge phase2
    
    $ git status
    # On branch master
    # Your branch is ahead of 'origin/master' by 8 commits.
    

    问:如何摆脱这种合并?尝试的Git Reset-hardGit Clean-d-f都不起作用。

    唯一起作用的是以下任何一种:

    $ git reset --hard origin/master
    

    $ git reset --hard HEAD~8
    

    $git重置--硬9A88396F51E2A068BB7[sha提交代码-这是在所有合并提交发生之前存在的代码]

  • 共有2个答案

    万选
    2023-03-14

    此刻添加答案的理由:

    到目前为止,我把结论和“答案”加到了我最初的问题本身,使问题变得很冗长,因此转移到单独的答案。

    我还添加了更常用的git命令,这些命令可以帮助我在git上使用,也可以帮助其他人。

    基本上清除所有本地提交$git reset--hard$git clean-d-f

    执行任何提交之前的第一步是配置您的用户名和随提交一起出现的电子邮件。

    #设置要附加到提交事务的名称

    $ git config --global user.name "[name]"
    

    #将您想要保存到提交事务中的电子邮件设置为

    $ git config --global user.email "[email address]"
    

    #列出全局配置

    $ git config --list
    

    #列出远程URL

    $ git remote show origin
    

    #检查状态

    git status
    

    #列出所有本地和远程分支

    git branch -a
    

    #创建一个新的本地分支并开始处理此分支

    git checkout -b "branchname" 
    

    或者,它可以作为两个步骤来完成

    创建分支:Git branch BranchName处理此分支:Git checkout BranchName

    #提交本地更改[两步过程:-将文件添加到索引,这意味着添加到临时区域。然后提交此临时区域中存在的文件]

    git add <path to file>
    
    git commit -m "commit message"
    

    #签出其他当地分行

    git checkout "local branch name"
    

    #删除本地分支中的所有更改[假设您在本地分支中进行了一些更改,例如添加新文件或修改现有文件,或进行本地提交,但不再需要这些更改]Git Clean-d-fGit Reset--hard[清除对本地分支所做的所有本地更改,除非是本地提交]

    Git stash-u还删除所有更改

    注意:很明显,我们可以使用(1)git clean-d-fgit reset-hard的组合,或者(2)git stash-u来实现所需的结果。

    注1:Stashing,这个词的意思是“把(某物)安全地秘密地储存在指定的地方。”这总是可以用git stash pop来翻新的。因此在以上两个选项中进行选择是开发人员的决定。

    注意2:git reset--hard将删除工作目录更改。在运行此命令之前,请确保存储要保留的任何本地更改。

    #切换到主分支并确保您是最新的。

    git checkout master
    

    git Fetch[这可能是接收源/主机上的更新所必需的(取决于您的git配置)]

    git pull
    

    #将功能分支合并到主分支中。

    git merge feature_branch
    

    #将主分支重置为原始状态。

    git reset origin/master
    

    #不小心从本地删除了一个文件,怎么找回来?执行Git status以获取已删除资源的完整文件路径

    git checkout branchname <file path name>
    

    就是这样!

    #将主分支与其他分支合并

    git checkout master
    git merge someotherbranchname
    

    #重命名本地分支

    git branch -m old-branch-name new-branch-name
    

    #删除本地分支

    git branch -D branch-name
    

    #删除远程分支

    git push origin --delete branchname
    

    git push origin :branch-name
    

    #还原已推送到远程存储库的提交

    git revert hgytyz4567
    

    #使用GIT从上次提交分支

    git branch branchname <sha1-of-commit>
    

    #更改已推送到远程的最近提交的提交消息

    git commit --amend -m "new commit message"
    git push --force origin <branch-name>
    

    #放弃此分支上的所有本地提交[删除本地提交]

    为了丢弃此分支上的所有本地提交,为了使本地分支与此分支的“上游”相同,只需运行

    git reset --hard @{u}
    

    参考:http://setrobertson.github.io/gitfixum/fixup.html或dogit reset--hard origin/master[如果本地分支是master]

    #还原已推送到远程存储库的提交?

    $ git revert ab12cd15
    

    #从本地分支和远程分支删除以前提交

    用例:您刚刚向本地分支提交了一个更改,然后立即推到远程分支,突然意识到,哦,不!我不需要这个零钱。现在做什么?

    Git reset--硬头~1[用于从本地分支删除提交。1表示您所做的提交]

    Git push origin Head--force[必须执行这两个命令.才能从远程分支删除]。当前签出的分支将被引用为正在执行此操作的分支。

    #从本地和远程回购中删除一些最近的提交,并保留到所需的提交。(一种从本地和远程提交的还原)

    让我们假设您有3个提交被推送到名为“develop”远程分支

    commitid-1 done at 9am
    commitid-2 done at 10am
    commitid-3 done at 11am. // latest commit. HEAD is current here.
    

    恢复到旧的提交(更改分支的状态)

    Git log--Oneline--Decorate--Graph//查看您的所有commitids

    Git clean-d-f//清除任何本地更改

    Git reset--硬交换-1//本地还原到此交换

    Git push-u origin+Develop//将此状态推送到Remote。+执行强制推

    #Remove local git merge:case:我在master branch上,并与一个新工作的branch合并master branch phase2

    $ git status
    

    在分支主机上

    $git合并阶段2$git状态

    在分支主机上

    您的分支比“起源/主”早8次提交。

    问:如何摆脱这种本地git合并?尝试的Git Reset-hardGit Clean-d-f都不起作用。唯一起作用的是以下任何一种:

    $git重置--硬源/主源

    $git重置--硬头~8

    $git重置--硬9A88396F51E2A068BB7[sha提交代码-这是在所有合并提交发生之前存在的代码]

    #创建gitignore文件

    touch.gitignore//在mac或unix用户中创建文件

    样品.Gitignore内容:

    .project
    *.py
    .settings
    

    GIT小抄参考链接:https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf

    文德曜
    2023-03-14

    这完全取决于您正在尝试撤消/还原的内容。从阅读UBE的链接中的帖子开始。而是试图回答:

    硬复位

    git reset --hard [HEAD]
    

    完全删除对跟踪文件的所有分段和未分段更改。

    我发现自己经常使用硬重置,当我像“只要撤销一切,如果我做了一个完整的重新克隆从远程”。在你的情况下,你只是想要你的回购原封不动,这将会起作用。

    清洁

    git clean [-f]
    

    删除未跟踪的文件。

    用于删除临时文件,但保留对已跟踪文件的分段和未分段更改。大多数情况下,我可能最终会制定一个忽略规则,而不是重复清理--例如,对于C#项目中的bin/obj文件夹,您通常希望从repo中排除这些文件夹以节省空间,或类似的东西。

    -f(force)选项还将删除未被跟踪的文件,并且git通过ignore-rule忽略这些文件。在上面的例子中,使用忽略规则从不跟踪bin/obj文件夹,即使这些文件夹被git忽略,使用force-选项将从文件系统中删除它们。我偶尔看到这种方法的使用,例如在编写脚本部署时,您希望在部署、压缩或其他任何方法之前清理代码。

    Git clean不会接触已经被跟踪的文件。

    结帐“点”

    git checkout .
    

    在读你的帖子之前,我从来没有见过这个符号。我很难找到这方面的文档(也许有人能帮上忙),但经过一段时间的研究,它似乎意味着:

    “撤消我的工作树中的所有更改”。

    即。撤消跟踪文件中未分段的更改。它显然不会触及阶段性的更改,而不会处理未跟踪的文件。

    藏匿

    有些答案提到藏匿。正如其措辞所暗示的那样,当您正在处理某件事情(未准备好提交)时,您可能会使用stashing,并且您必须临时切换分支或以某种方式处理代码的另一个状态,稍后才能返回“杂乱的办公桌”。我不认为这适用于你的问题,但它绝对是方便的。

    总而言之

    通常,如果您确信已经提交并可能被推到了远程重要更改,如果您只是在玩游戏或类似的东西,那么使用git reset--hard head后接git clean-f将明确地将您的代码清除到如果刚刚从分支克隆并签出它就会处于的状态。需要强调的是,重置还将移除分段的、但未提交的更改,这一点非常重要。它将擦除所有尚未提交的(除了未跟踪的文件,在这种情况下,使用clean)。

    所有其他命令都是为了方便更复杂的场景,在这些场景中,需要一个粒度的“Undoing stuff”:)

    我觉得,您的第一个问题已经解决了,但最后,总结一下第二个问题:您从未发现需要使用Git reset-hard的原因是您从未执行过任何操作。如果执行了更改,git checkout.git clean-f都不会恢复该更改。

    希望这能涵盖。

     类似资料:
    • 所以。烦人。 为简洁起见编辑: 类似问题的答案state将修复问题,但我做错了吗?因为它说它不匹配任何文件?也许是因为我运行了git重置?

    • 删除列出的分支的所有尝试(根据下面的答案)都会导致错误: 我使用的是: git 1.7.4.1 ubuntu 10.04 GNU bash,version 4.1.5(1)-release GNU grep 2.5.4

    • 我正在使用Android Studio和Git与它一起定位。Android studio中Git的路径如下,C:\users\abc\appdata\local\github\portablegit_cf76fc1621ac41ad4fe86c420ab5ff403f1808b9\cmd\Git.exe 有一些本地文件更改,当我试图丢弃对这个文件的更改时,它说无法丢弃该文件。同样点击文件,比如打开

    • 本文向大家介绍Git 将本地更改推送到SVN,包括了Git 将本地更改推送到SVN的使用技巧和注意事项,需要的朋友参考一下 示例 命令 将为您的每个本地git提交创建SVN修订版。与SVN一样,您的本地git历史记录必须与SVN信息库中的最新更改同步,因此,如果命令失败,请尝试先执行git svn rebase。

    • 我有这样的promise,1是最新的,3是最老的: 提交1 提交2 提交3 如何删除提交 1 和 2,但保留更改并将其提交到?

    • 如何在本地删除空文件夹,并让通过拉-推共享远程文件夹的其他协作者也这样做?我知道git不会从这个意义上“跟踪”文件夹,但问题仍然存在。 e、 我将一个文件移动到另一个文件夹并提交了(移动的)更改。 但是我不能文件夹,因为我得到的不匹配不存在。 我可以做一个,但是它是如何被推上去的呢? 我可以直接文件,但如何正确地删除目录,并将其推送到存储库,然后在其他人拉取时将其推送到存储库,以便删除其现有文件夹