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

我刚克隆了一个git仓库并签出了一个分支。 我研究了它,然后决定删除所有本地更改,因为我想要原始副本。

总之,我必须执行以下两条命令来删除我的本地更改

git checkout .

git clean -f

我的问题是,

(1)这是摆脱本地变化的正确方法,否则请让我知道正确的方法。

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

谢谢

*解决方案:主要编辑:03/26:*用git特定术语替换了许多含糊的术语[已跟踪/未跟踪/暂停/未搁置]

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

键入1.分步跟踪文件

键入2.未冻结的跟踪文件

类型3. Unstaged UnTracked文件又名UnTracked文件

  • 已分阶段 - 已移至分段区/已添加到索引的分段
  • 追踪 - 修改后的文件
  • UnTracked - 新文件。 始终未分期。 如果上演,那意味着他们被追踪。
  • 每个命令的作用是:

  • git checkout . - 仅删除Unstaged追踪文件[Type 2]

  • git clean -f - 仅删除Unstaged UnTracked文件[类型3]

  • git reset --hard - 仅删除分步跟踪和未分级的跟踪文件[类型1,类型2]

  • git stash -u - 删除所有更改[类型1,类型2,类型3]

  • 结论:

    很明显,我们可以使用

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

    要么

    (2) `git stash -u`
    

    达到预期的效果。

    注意:藏起来,因为这个词的意思是'在某个特定的地方安全地秘密存储(某物)。' 这总是可以使用git stash pop来检索。 所以选择上述两种选择是开发者的呼吁。

    谢谢Christoph和FrederikSchø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://sethrobertson.github.io/GitFixUm/fixup.html

    或做git reset --hard origin/master [如果本地分支是master ]

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

    编辑:06/23/15

    如何恢复已经推送到远程存储库的提交?

    $ git revert ab12cd15
    

    编辑:09/01/2015

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

    案例:您刚刚对当地分支进行了更改并立即将其推送到远程分支,突然意识到,哦,不! 我不需要这个改变。 现在做什么?

    git reset --hard HEAD~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 reset --hard 9a88396f51e2a068bb7 [sha commit code - 这是你所有的合并提交之前出现的那个]


    这一切都取决于你想要撤消/还原的内容。 通过阅读宇部链接的帖子开始。 但要尝试一个答案:

    硬重置

    git reset --hard [HEAD]
    

    完全删除所有已执行和未执行的更改以跟踪文件。

    我发现自己经常使用硬重置,当我像“如果我从远程完成了一个完整的重复克隆就可以撤回所有的东西”。 在你的情况下,你只是想要你的回购原始,这将工作。

    清洁

    git clean [-f]
    

    删除未跟踪的文件。

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

    -f(强制)选项也将删除未被跟踪的文件,并且通过忽略规则也会被git忽略。 在上面的例子中,使用忽略规则永远不会跟踪bin / obj文件夹,即使这些文件夹被git忽略,使用force-option会将它们从文件系统中删除。 我零星地看到了这种用法,例如在脚本部署时,并且想在部署,压缩或其他方面清理代码。

    Git clean不会触及已被追踪的文件。

    结帐“点”

    git checkout .
    

    在阅读您的文章之前,我实际上从未看过这种表示法。 我很难为此寻找文档(也许有人可以提供帮助),但从玩一下,看起来像是这样:

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

    即撤销跟踪文件中未分类的更改。 它显然不会触及分阶段的变化,并且只留下未跟踪的文件。

    积攒

    一些答案提到存储。 正如措辞所暗示的那样,当你处于某些事情的中间时(或者没有准备好提交),你可能会使用隐藏方式,并且你必须暂时切换分支或以某种方式工作在代码的另一个状态,稍后再返回到“混乱”台”。 我不认为这适用于你的问题,但它绝对方便。

    总结一下

    一般来说,如果你确信你已经承诺并且可能被推到一个远程重要的改变,如果你只是在玩弄周围或类似的东西,使用git reset --hard HEAD然后git clean -f将彻底清理你的代码到状态,如果它刚刚被克隆并从分支中检出,它将会在。 重要的是要强调,重新设置也将消除阶段性但未确定的更改。 它会擦除所有未提交的内容 (除非未跟踪的文件,在这种情况下,请使用干净的文件)。

    所有其他命令都有助于实现更复杂的场景,其中需要粒度为“撤消内容”:)

    我觉得,你的问题#1已经被覆盖了,但最后,以#2结束:你从未发现需要使用git reset --hard是你从未上演任何东西。 如果你进行了一次改变,既没有git checkout . 也不git clean -f会恢复。

    希望这涵盖。


    与git中的所有内容一样,有多种方式。 你使用的两个命令是这样做的一种方式。 你可以做的另一件事就是用git stash -u存储它们。 -u确保新添加的文件(未跟踪)也包含在内。

    关于git stash -u的方便之git stash -u在于

  • 它可能是最简单的(唯一的)单一命令来完成你的目标
  • 如果您事后改变了主意,那么您可以使用git stash pop恢复所有工作(就像在Gmail中删除电子邮件,如果您之后改变主意,则可以撤消)
  • 至于你的其他问题git reset --hard不会删除未跟踪的文件,所以你仍然需要git clean -f 。 但是一个git stash -u可能是最方便的。


    此时添加答案的原因是:

    到目前为止,我在我的最初问题中加入了结论和“答案”,使得问题非常冗长,因此转向单独的答案。

    我还添加了更多常用的git命令 ,帮助我在git上帮助其他人。

    你做任何承诺之前, 首先一步是配置您的用户名和电子邮件,随着你的承诺出现。

    #提供您想要附加到提交事务的名称

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

    #提供您想要提交交易的电子邮件

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

    #列出全局配置

    $ git config --list
    

    #检查状态

    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"
    

    #checkout其他一些本地分支

    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:藏匿,因为这个词的意思是'在某个特定的地方安全地秘密存放(某物)。' 这总是可以使用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
    

    #rename本地分支

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

    #delete本地分支

    git branch -D branch-name
    

    #delete远程分支

    git push origin --delete branchname
    

    要么

    git push origin :branch-name
    

    #撤销已经推送到远程存储库的提交

    git revert hgytyz4567
    

    从之前使用GIT提交的#branch

    git branch branchname <sha1-of-commit>
    

    #改变已经被推送到远程的最近提交的提交消息

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

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

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

    git reset --hard @{u}
    

    参考:http: git reset --hard origin/master或者做git reset --hard origin/master [如果本地分支是master]

    #恢复已经推送到远程存储库的提交吗?

    $ git revert ab12cd15
    

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

    用例:您刚刚对当地分支进行了更改并立即将其推送到远程分支,突然意识到,哦,不! 我不需要这个改变。 现在做什么?

    git reset --hard HEAD~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 //查看你的所有提交

    git clean -d -f //清除所有本地更改

    git reset --hard commitid-1 //本地恢复到此提交

    git push -u origin +develop //将此状态推送到远程。 +做推力

    #删除本地git合并:案例:我在主分支和合并主分支上新运行的分支phase2

    $ git status
    

    在分支主人

    $ git merge phase2 $ git status

    在分支主人

    您的分支在8次提交之前领先于“origin / master”。

    问: 如何摆脱这种本地git合并? 试过git reset --hardgit clean -d -f两者都不起作用。 唯一有效的是以下任何一种:

    $ git reset --hard origin / master

    要么

    $ git reset --hard HEAD〜8

    要么

    $ git reset --hard 9a88396f51e2a068bb7 [sha commit code - 这是你所有的合并提交之前出现的那个]

    #create gitignore文件

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

    样品.gitignore内容:

    .project
    *.py
    .settings
    

    GIT备忘单的参考链接:https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf

    链接地址: http://www.djcxy.com/p/1357.html

    上一篇: Various ways to remove local Git changes

    下一篇: Git push rejected after feature branch rebase