各种方法来删除本地Git的变化

我只是克隆了一个git仓库并签出了一个分支。 我工作,然后决定删除我所有的本地更改,因为我想要的原始副本。

总之,我不得不做以下两个命令来删除我的本地更改

git checkout . git clean -f 

我的问题是,

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

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

谢谢

*解决scheme:主要编辑:03/26:*用git特定术语replace了许多含糊的术语[跟踪/未跟踪/暂停/未停止]

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

types1.分步跟踪文件

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

types3. Unstaged UnTracked文件又名UnTracked文件

  • 已分阶段 – 已移至暂存区/已添加到索引的那些分区
  • 跟踪 – 修改的文件
  • UnTracked – 新文件。 始终未分期。 如果上演,这意味着他们被追踪。

每个命令的作用是:

  1. git checkout . – 仅删除未分类的追踪文件[types2]

  2. git clean -f – 只删除Unstaged UnTracked文件[Type 3]

  3. git reset --hard – 只删除分步跟踪和未分级的跟踪文件[types1,types2]

  4. git stash -u – 删除所有更改[types1,types2,types3]

结论:

很明显,我们也可以使用

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

要么

 (2) `git stash -u` 

达到预期的效果。

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

谢谢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 [提交代码 – 这是你所有的合并提交之前发生的]

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

硬重置

 git reset --hard [HEAD] 

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

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

清洁

 git clean [-f] 

删除未跟踪的文件。

用于删除临时文件,但保留对已经跟踪的文件进行暂存和非暂存更改。 大多数情况下,我可能最终会制定一个忽略规则而不是反复清理 – 例如,对于C#项目中的bin / obj文件夹,您通常想从存储库中排除以节省空间等等。

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

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

结帐“点”

 git checkout . 

在阅读您的文章之前,我从未见过这种符号。 我很难find这方面的文档(也许有人可以帮忙),但是从玩一下,看起来像是这样:

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

即撤消跟踪文件中未分类的更改。 它显然没有触及分阶段的变化,只留下未跟踪的文件。

积攒

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

总结一下

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

所有其他的命令在那里,以方便更复杂的情况下,需要一个粒度的“撤消东西”:)

我觉得,你的问题#1已经被覆盖了,但是最后,在#2结束:你从来没有发现需要使用git reset --hard的原因 – 就是你从来没有上过任何东西。 如果你做了一个改变,既不是git checkout . 也不git clean -f会恢复。

希望这涵盖。

和git中的所有东西一样,有多种方法可以做到这一点。 你使用的两个命令是一种方法。 你可以做的另一件事就是用git stash -u把它们git stash -u-u确保新添加的文件(untracked)也包含在内。

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

  1. 它可能是最简单的(唯一的)单一的命令来完成你的目标
  2. 如果你以后改变了主意,你可以用git stash popgit stash pop取回所有的工作(就像在gmail中删除一封邮件,如果你之后改变了主意,就可以撤销)

至于你的其他问题git reset --hard不会删除未跟踪的文件,所以你仍然需要git clean -f 。 但是一个git stash -u可能是最方便的。

此时添加答案的原因:到目前为止,我在我的初始问题本身中添加了结论和“答案”,使问题变得非常冗长,因此转而单独回答,以便可以添加更多使用的git命令以及添加更多的帮助我的git命令,以帮助其他人。

#检查状态

 git status 

#创build一个新的本地分支

 git checkout -b "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 OR(2) git stash -u来实现所需的结果。

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

注2: git reset --hard会删除工作目录的变更。 运行此命令之前,请务必保留您要保留的任何本地更改。

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

 git checkout master 

git fetch [这可能是必要的(取决于你的gitconfiguration)接收更新在起源/主]

 git pull 

#将function分支合并到主分支中。

 git merge feature_branch 

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

 git reset origin/master 

#偶然从本地删除了一个文件,如何找回来? 做一个git status来获取已删除资源的完整文件path

 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 :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 : git reset --hard origin/master或做git reset --hard origin/master [如果本地分支是主]

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

 $ git revert ab12cd15 

#从本地分支和远程分支中删除以前的提交案例:您刚刚对您的本地分支进行了更改,并立即将其推送到远程分支,突然意识到,哦,不! 我不需要这个改变。 现在做什么? git reset --hard HEAD~1 [用于从本地分支中删除该提交。 1表示您提交的一个提交]

git push origin HEAD --force [这两个命令都必须执行。 从远程分支删除]。 分支表示当前签出的分支。

#删除本地git合并:案例:我在主分支和合并主分支与新工作分支phase2

 $ git status 

在分支主人

$ git merge phase2 $ git status

在分支主人

你的分支由8个提交提前“起始/主”。

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

$ git reset –hard origin / master

要么

$ git reset –hard HEAD〜8

要么

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

1.当你不想保留你的本地修改的时候。

 git reset --hard 

该命令将完全删除本地存储库中的所有本地更改。 这是在pull命令期间避免冲突的最佳方式,只有在您不想保留本地更改时才是如此。

2.当你想保持你的本地变化

如果你想从远程拉新的变化,并希望在这个拉的过程中忽略本地的变化,

 git stash 

它会隐藏所有的本地修改,现在你可以拖动远程修改,

 git pull 

现在,你可以带回你的本地变化,

 git stash pop 

使用:

 git checkout -- <file> 

放弃工作目录中的更改。

最好的方法是检查更改。

在名为project-name的项目中更改文件pom.xml,你可以这样做:

 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' 

为了抛弃所有我喜欢存放和丢弃的东西,这是丢弃所有东西的最快方法,特别是如果你在多个回购之间工作的话。

这将存储{0}键中的所有更改,并立即从{0}

git stash && git stash drop

首先检查是你的重要变化保存与否:

$ git状态

比尝试

$ git reset –hard

它会将你的分支重置为默认值

但如果你只需要撤消:

$编辑(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