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

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

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

git checkout .


git clean -f

我的问题是,

(1)这是摆脱局部更改的正确方法吗,或者请让我知道正确的方法。

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

谢了

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

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

类型1.分阶段跟踪文件

类型2.未分阶段跟踪文件

类型3.未暂存的未跟踪文件a. k. a未跟踪文件

  • 分期-移动到分期区域/添加到索引的那些
  • 跟踪-修改文件
  • 未跟踪-新文件。始终未暂存。如果暂存,这意味着它们被跟踪。

每个命令做什么:

  1. git checkout .-仅删除未分阶段跟踪的文件[类型2]

  2. git clean -f-仅删除未暂存的未跟踪文件[类型3]

  3. git reset --hard-仅删除分阶段跟踪和未分阶段跟踪的文件[类型1,类型2]

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

结论:

很明显我们可以用任何一个

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

(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]

注:06/12/2015 这是没有另一个SO问题的副本,被标记为重复。这个问题解决如何删除本地GIT更改[删除添加的文件,删除添加到现有文件的更改等以及各种方法;在另一个SO线程中的哪里只解决如何删除本地提交。如果你添加了一个文件,并且你想单独删除它,那么另一个SO线程不会讨论它。因此这不是另一个的副本]

编辑:06/23/15

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

$ git revert ab12cd15

编辑:09/01/2015

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

case:您刚刚向本地分支提交了更改,并立即推送到远程分支, 突然意识到,哦,不!我不需要这个改变。现在做什么?

git reset --hard HEAD~1[用于从本地分支删除该提交]

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

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

Edit 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提交代码-这是在所有合并提交发生之前存在的代码]

684276 次浏览

与git中的所有内容一样,有多种方法可以做到这一点。您使用的两个命令是一种方法。您可以做的另一件事是简单地将它们与git stash -u一起存储。-u确保还包括新添加的文件(未跟踪)。

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

  1. 它可能是实现目标的最简单(唯一?)的单一命令
  2. 如果你后来改变主意,你会得到所有你的工作与git stash pop(这就像删除gmail中的电子邮件,如果你后来改变主意,你可以撤消)

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

这完全取决于您要撤消/恢复的内容。从阅读Ube链接中的帖子开始。但要尝试回答:

硬重置

git reset --hard [HEAD]

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

我发现自己经常使用硬重置,当我像“就像我从远程完成了完整的重新克隆一样撤消所有内容”时。在您的情况下,您只希望您的存储库保持原始,这将起作用。

干净

git clean [-f]

删除未跟踪的文件。

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

-f(force)选项也会删除那些没有被跟踪的文件也被git忽略了。在上面的例子中,使用忽略规则永远不会跟踪bin/obj文件夹,即使这些文件夹被git忽略,使用force选项会将它们从文件系统中删除。我偶尔看到过这种用途,例如在脚本部署时,你想在部署、压缩或其他之前清理代码。

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

结帐“点”

git checkout .

在阅读你的帖子之前,我实际上从未见过这个符号。我很难找到这个留档(也许有人可以帮忙),但是从玩的角度来看,它看起来像是:

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

即。撤消跟踪文件中的未分阶段更改。它显然不会触及分阶段更改并留下未跟踪的文件。

藏匿

有些答案提到了stash。顾名思义,当你正在做某事(还没有准备好提交),你必须临时切换分支或以某种方式处理你的代码的另一个状态,然后回到你“凌乱的办公桌”时,你可能会使用stash。我不认为这适用于你的问题,但它肯定很方便。

总结一下

一般来说,如果你确信你已经提交并可能推送到远程重要更改,如果你只是在玩或类似的东西,使用git reset --hard HEAD后跟git clean -f将明确地将你的代码清理到状态,如果它刚刚被克隆并从分支签出,它将处于状态。非常重要的是要强调,重置还将删除分阶段但未提交的更改。它会抹去一切没有犯下的罪行(未跟踪的文件除外,在这种情况下,使用干净)。

所有其他命令都是为了促进更复杂的场景,其中需要“撤销东西”的颗粒度:)

我觉得,你的问题#1已经涵盖了,但最后,总结一下#2:你从未发现有必要使用git reset --hard的原因是你从未上演过任何东西。如果你上演了一场变革,git checkout .git clean -f都不会逆转这一点。

希望这涵盖。

最好的方法是检查更改。

在名为project ect-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'

此刻添加答案的原因:

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

我还添加了更多常用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:存储,因为这个词的意思是“将(某物)安全秘密地存储在指定的地方”。这总是可以使用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://sethrobertson.github.io/GitFixUm/fixup.html 或者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合并: 案例: 我在主分支和合并主分支与一个新工作的分支阶段2

$ git status

在分支主机上

$ git merge phase2 $ git status

在分支主机上

您的分支领先于“原始/主”8次提交。

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

$git重置--硬源/主

$git重置--hard HEAD~8

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

#创建gitignore文件

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

示例. gitignore内容:

.project
*.py
.settings

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

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

git reset --hard

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

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

如果您想从远程拉取新更改并想忽略 然后在这个拉取过程中发生局部变化,

git stash

它将隐藏所有本地更改,现在您可以拉取远程更改,

git pull

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

git stash pop

用途:

git checkout -- <file>

丢弃工作目录中的更改。

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

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

git stash && git stash drop

首先检查您的重要更改是否已保存:

$git状态

比 尝试

$git重置

它将重置您的分支为默认

但如果你只需要撤消:

$编辑(1) #添加frotz. c文件 filfre. c$mail x(2) $git重置
(3)$gitgit://info.example.com/nitfol


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

我认为git有一件事没有被清楚地记录下来。我认为它实际上被忽视了。

git checkout .

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

git clean -fd适用于未跟踪的文件。

然后git reset简单地删除暂存,但是git checkout有点太麻烦了。一个接一个地指定文件或使用目录并不总是理想的。有时我想删除的更改的文件在我想保留的目录中。我希望这个命令可以删除未暂存的更改,给你。谢谢。

但是我认为他们应该只有git checkout,没有任何选项,删除所有未暂存的更改,不要触及暂存的。这有点模块化和直观。更像git reset所做的。git clean也应该做同样的事情。

选项1:放弃跟踪和未跟踪的文件更改

放弃对暂存和非暂存文件所做的更改。

$ git reset --hard [HEAD]

然后完全丢弃(或删除)未跟踪的文件。

$ git clean [-f]

备选办法2:藏匿

你可以先把你的修改

$ git stash

然后根据您想要做的事情删除或弹出它。请参阅https://git-scm.com/docs/git-stash#_synopsis

选项3:手动将文件恢复到原始状态

首先我们切换到目标分支

$ git checkout <branch-name>

列出所有有更改的文件

$ git status

手动将每个文件恢复到原始状态

$ git restore <file-path>