关于git bash:删除本地git更改的各种方法

Various ways to remove local Git changes

我刚刚克隆了一个Git存储库并签出了一个分支。我处理了它,然后决定删除所有本地更改,因为我需要原始副本。

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

1
2
3
git checkout .

git clean -f

我的问题是,

(1)这是消除局部变化的正确方法吗,否则请告诉我正确的方法。

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

谢谢

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

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

Type 1. Staged Tracked files

Type 2. Unstaged Tracked files

Type 3. Unstaged UnTracked files a.k.a UnTracked files

  • 阶段-移动到临时区域/添加到索引的区域
  • 跟踪-修改的文件
  • 未跟踪-新文件。总是不老化。如果是阶段性的,这意味着它们被跟踪。

每个命令的作用:

  • git checkout .—仅删除未老化的跟踪文件[类型2]

  • git clean -f—仅删除未老化的未跟踪文件[类型3]

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

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

  • 结论:

    很明显我们可以使用

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

    1
    (2) `git stash -u`

    达到预期的效果。

    注:藏匿,顾名思义是"将(某物)安全地、秘密地存放在指定的地方",通常可以用git stash pop检索到。因此,在上述两个选项之间进行选择是开发人员的职责。

    谢谢你,克里斯托夫和弗雷德里克·施?宁。

    编辑: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年12月6日这不是另一个问题的副本,因此问题被标记为副本。这个问题解决了如何删除本地git更改[删除添加的文件,删除添加到现有文件的更改等以及各种方法;在另一个so中,线程只处理如何删除本地提交。如果你添加了一个文件,并且你想单独删除它,那么另一个线程就不会讨论它了。因此,这不是另一个的副本]

    编辑:06/23/15

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

    1
    $ git revert ab12cd15

    编辑:2015年1月9日

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

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

    git reset --hard HEAD~1[用于从本地分行删除该承诺]

    git push origin HEAD --force[两个命令都必须执行。用于从远程分支删除]

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

    编辑2015年8月9日-删除本地Git合并:

    我在江户十一〔16〕分公司,并将江户十一〔16〕分公司与新成立的江户十一〔21〕分公司合并。

    1
    2
    3
    4
    5
    6
    7
    8
    $ 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。两个都不起作用。

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

    1
    $ git reset --hard origin/master

    1
    $ git reset --hard HEAD~8

    $ git reset --hard 9a88396f51e2a068bb7[sha提交代码-这是在所有合并提交发生之前出现的代码]


    这完全取决于您正试图撤消/还原的内容。首先阅读ube链接中的帖子。但要想回答:

    硬复位

    1
    git reset --hard [HEAD]

    完全删除对跟踪文件的所有阶段性和非阶段性更改。

    我发现自己经常使用硬重置,当我像"撤销一切,就像我从远程完成了一个完整的重新克隆"。在你的情况下,如果你只是想要你的复古,这会起作用。

    干净的

    1
    git clean [-f]

    删除未跟踪的文件。

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

    -f(force)选项还将删除未被跟踪的文件,这些文件也将被git忽略,尽管忽略规则。在上述情况下,使用忽略规则从不跟踪bin/obj文件夹,即使Git忽略了这些文件夹,使用force选项也会将它们从文件系统中删除。我偶尔会看到这种用法,例如在编写部署脚本时,您希望在部署、压缩或其他任何操作之前清理代码。

    Git Clean不会触摸已经被跟踪的文件。

    结账"点"

    1
    git checkout .

    在阅读你的帖子之前,我从来没有见过这个符号。我很难找到这方面的文档(也许有人能帮上忙),但从四处游玩来看,这似乎意味着:

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

    即撤消跟踪文件中的未分页更改。它显然不涉及阶段性的更改,只留下未跟踪的文件。

    贮藏

    有些答案提到了藏匿。正如措辞所暗示的那样,当您正处于某件事情的中间时(还没有准备好提交),您可能会使用stashing,并且您必须临时切换分支或以某种方式处理代码的另一种状态,然后返回到"凌乱的办公桌"。我不认为这适用于你的问题,但它确实很方便。

    总结

    一般来说,如果您确信自己已经承诺并可能推动进行一项远程重要更改,如果您只是在玩游戏或类似游戏,那么使用git reset --hard HEAD,然后使用git clean -f,最终会将您的代码清理到状态,如果它刚刚被克隆并从分支中签出,它就会进入状态。必须强调的是,重置也将删除阶段性但未提交的更改。它将擦除所有未提交的文件(未跟踪的文件除外,在这种情况下,使用clean)。

    所有其他的命令都是为了简化更复杂的场景,在这些场景中需要"撤销内容"的粒度:)

    我觉得,你的问题1被涵盖了,但最后,总结一下2:你从未发现有必要使用git reset --hard的原因是你从未策划过任何事情。如果你进行了改变,那么无论是git checkout .还是git clean -f,都不会恢复这一点。

    希望这能覆盖。


    和Git中的所有东西一样,有多种方法可以做到这一点。您使用的两个命令是一种方法。你可以做的另一件事就是把它们和git stash -u一起藏起来。-u确保还包括新添加的文件(未跟踪)。

    关于git stash -u的便利之处在于

  • 这可能是最简单的(仅是?)完成目标的单一命令
  • 如果你事后改变主意,你可以用git stash pop把所有的工作都拿回来(这就像在gmail中删除一封电子邮件,如果你事后改变主意,你可以撤销它)。
  • 至于你的另一个问题,git reset --hard不会删除未跟踪的文件,所以你仍然需要git clean -f。但一个git stash -u可能是最方便的。


    此时添加答案的原因:好的。

    到目前为止,我把结论和"答案"添加到我最初的问题本身,使问题非常冗长,因此转向了单独的答案。好的。

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

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

    执行任何提交之前的第一步是配置用户名和电子邮件,这些用户名和电子邮件与提交一起出现。好的。

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

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

    #设置要提交到提交事务的电子邮件好的。

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

    #列出全局配置好的。

    1
    $ git config --list

    #列出远程URL好的。

    1
    $ git remote show origin

    检查状态好的。

    1
    git status

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

    1
    git branch -a

    #创建新的本地分支并开始处理此分支好的。

    1
    git checkout -b"branchname"

    或者,它可以作为一个两步的过程来完成好的。

    创建分支:git branch branchname。本部门工作:git checkout branchname。好的。

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

    1
    2
    3
    git add <path to file>

    git commit -m"commit message"

    #结帐其他本地分行好的。

    1
    git checkout"local branch name"

    #删除本地分支中的所有更改[假设您在本地分支中做了一些更改,如添加新文件或修改现有文件,或进行本地提交,但不再需要这些更改]git clean -d -fgit reset --hard[清除对本地分支机构所做的所有本地更改,除非本地提交]好的。

    git stash -u也删除了所有更改好的。

    注:很明显我们可以使用(1)git clean –d –fgit reset --hard的组合或(2)江户十一〔6〕。达到预期的效果。好的。

    注1:藏匿,这个词的意思是"将(某物)安全秘密地存储在指定的地方"。这可以使用git stash pop进行检索。因此,在上述两个选项之间进行选择是开发人员的职责。好的。

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

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

    1
    git checkout master

    git fetch[这可能需要(取决于您的git配置)来接收源站/主服务器上的更新]好的。

    1
    git pull

    #将功能分支合并到主分支。好的。

    1
    git merge feature_branch

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

    1
    git reset origin/master

    #意外地从本地删除了一个文件,如何恢复?执行git status以获取已删除资源的完整文件路径好的。

    1
    git checkout branchname <file path name>

    就是这样!好的。

    #将主分支与其他分支合并好的。

    1
    2
    git checkout master
    git merge someotherbranchname

    #重命名本地分支好的。

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

    #删除本地分支好的。

    1
    git branch -D branch-name

    #删除远程分支好的。

    1
    git push origin --delete branchname

    或好的。

    1
    git push origin :branch-name

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

    1
    git revert hgytyz4567

    #使用git从以前的提交分支好的。

    1
    git branch branchname <sha1-of-commit>

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

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

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

    为了放弃该分支上的所有本地提交,为了使本地分支与该分支的"上游"相同,只需运行好的。

    1
    git reset --hard @{u}

    参考:http://sethrobertson.github.io/gitfixum/fixup.html或者做git reset --hard origin/master【如果本地分行是主分行】好的。

    #是否恢复已推送到远程存储库的提交?好的。

    1
    $ git revert ab12cd15

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

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

    git reset --hard HEAD~1用于从本地分支机构删除该提交。1表示您作出的承诺]好的。

    git push origin HEAD --force[两个命令都必须执行。用于从远程分支删除。当前签出的分支将被称为进行此操作的分支。好的。

    #从本地和远程repo中删除一些最近的提交,并保留到所需的提交。(一种从本地和远程恢复提交)好的。

    假设您有3个承诺,您已将其推送到名为"EDOCX1"(3)的远程分支。好的。

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

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

    看你所有的委员好的。

    git clean -d -f//清除任何局部更改好的。

    git reset --hard commitid-1//本地恢复到本委员会好的。

    git push -u origin +develop//将此状态推到远程。+用力推好的。

    #删除本地Git合并:案例:我在主分支机构,并将主分支机构与新工作的分支机构合并,第2阶段好的。

    1
    $ git status

    在分支主机上好的。

    $ git merge phase2$ git status好的。

    在分支主机上好的。

    您的分支机构在8次提交之前领先于"原始/主"。好的。

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

    $git reset--硬原点/主节点好的。

    或好的。

    $git重置--硬头~8好的。

    或好的。

    $ git reset --hard 9a88396f51e2a068bb7[sha提交代码-这是在所有合并提交发生之前出现的代码]好的。

    #创建gitignore文件好的。

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

    sample.gitignore内容:好的。

    1
    2
    3
    .project
    *.py
    .settings

    参考链接到git备忘表:https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf好的。好啊。


    1。当您根本不想保留本地更改时。

    1
    git reset --hard

    此命令将从本地存储库中完全删除所有本地更改。这是在pull命令期间避免冲突的最佳方法,除非您根本不想保留本地更改。

    2。当您想保留本地更改时

    如果要从远程提取新更改并忽略在这一拉动过程中的局部变化,

    1
    git stash

    它将存储所有本地更改,现在您可以提取远程更改,

    1
    git pull

    现在,您可以通过以下方式恢复本地更改:

    1
    git stash pop


    我认为Git有一件事没有明确记录。我认为它实际上被忽视了。

    git checkout .

    伙计,你救了我一天。我总是想尝试使用修改过的代码。但是,有时候事情最终会弄乱修改后的代码,添加新的未跟踪文件等。所以我想做的是,准备好我想要的,做那些乱七八糟的事情,然后快速清理,如果我高兴的话提交。

    git clean -fd对未跟踪的文件很有效。

    然后,git reset简单地删除了分阶段的,但git checkout有点麻烦。逐个指定文件或使用目录并不总是理想的。有时,我想删除的更改文件在我想保留的目录中。我希望有一个命令可以删除未经处理的更改,现在您就可以了。谢谢。

    但我认为他们应该让git checkout没有任何选择,删除所有未经调整的变化,而不是触及舞台。它有点模块化和直观。更像是git reset所做的。git clean也应该这样做。


    用途:

    1
    git checkout -- <file>

    放弃工作目录中的更改。


    对于放弃所有我喜欢的藏匿和放弃的藏匿,这是最快的方法放弃所有,特别是如果你在多个回购之间工作。

    这将隐藏{0}键中的所有更改,并立即将其从{0}中删除。

    git stash && git stash drop


    最好的方法是检查更改。

    在名为project name的项目中更改文件pom.xml,可以执行以下操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    git status

    # modified:   project-name/pom.xml

    git checkout project-name/pom.xml
    git checkout master

    # Checking out files: 100% (491/491), done.
    # Branch master set up to track remote branch master from origin.
    # Switched to a new branch 'master'

    首先,检查您的重要更改是否通过以下方式保存:

    $ git status

    比尝试

    $ git reset --hard

    it will reset your branch to default

    但如果你需要撤销:

    $ edit (1)
    $ git add frotz.c
    filfre.c $ mailx (2)
    $ git reset
    (3) $ git pull git://info.example.com/ nitfol

    阅读更多信息>>https://git-scm.com/docs/git-reset