我只是克隆了一个git存储库,并签出了一个分支。我对它进行了修改,然后决定删除所有局部更改,因为我想要原始副本。

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

git checkout .

git clean -f

我的问题是,

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

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

谢谢

*解决方案:重要修改:3月26日:* 用git专用术语替换了许多模糊的术语 (跟踪/无足迹的/策划/ unstaged]

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

1型。阶段性跟踪文件 2型。未分级跟踪文件 类型3。unstaging UnTracked files,又名UnTracked files

staging -那些被移动到staging区域/添加到索引的数据 跟踪-修改文件 UnTracked -新文件。总是unstaged。如果是阶段性的,那就意味着他们被跟踪了。

每个命令的作用:

Git结帐。-仅删除未分期的跟踪文件[类型2] git clean -f -删除unstage UnTracked文件[Type 3] git reset——hard -只删除阶段性跟踪和非阶段性跟踪文件[类型1,类型2] git stash -u删除所有更改[类型1,类型2,类型3]

结论:

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

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

OR

(2) `git stash -u`

达到预期的结果。

注意:Stashing,这个词的意思是“将(某物)安全秘密地存放在指定的地方”。这总是可以检索使用git stash流行。 因此,在上述两个选项中做出选择是开发者的决定。

谢谢克里斯托夫和弗雷德里克·舍宁。

编辑:03/27

我认为值得注意的是get clean -f

Git clean -f

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

如果你也想删除目录,运行git clean -f -d

如果你只想删除被忽略的文件,运行git clean -f -X

如果你想删除被忽略的文件以及非被忽略的文件,运行git clean -f -x

参考:更多关于git清洁:如何从当前git工作树中删除本地(未跟踪)文件?

编辑:05/20/15

丢弃该分支上的所有本地提交[删除本地提交]

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

参考:http://sethrobertson.github.io/GitFixUm/fixup.html

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

注意:06/12/2015 这不是另一个被标记为重复的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合并:

我在主分支和合并的主分支与一个新的工作分支阶段2

$ 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 -hard和git clean -d -f 两者都没有成功。

唯一有效的方法是以下任何一种:

$ git reset --hard origin/master

or

$ git reset --hard HEAD~8

or

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


当前回答

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

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

少不更事的藏货,少不更事的藏货

其他回答

与git中的所有东西一样,有多种方法来实现它。您使用的两个命令是一种方法。你可以做的另一件事是简单地用git stash -u隐藏它们。-u确保新添加的文件(未跟踪的)也包括在内。

git stash -u的便利之处在于

这可能是实现你的目标最简单的(唯一的?)单一命令 如果你改变了你的想法之后,你得到你所有的工作与git stash pop(这就像删除电子邮件在gmail,你可以撤销,如果你改变了你的想法之后)

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

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

硬重置

git reset --hard [HEAD]

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

我发现自己经常使用硬重置,当我“就像从远程重新克隆一样撤销所有内容”时。在你的情况下,你只是想让你的回购原始,这是可行的。

清洁

git clean [-f]

删除未被跟踪的文件。

用于删除临时文件,但保留已跟踪文件的阶段性和非阶段性更改。大多数时候,我可能最终会创建一个忽略规则,而不是重复清理——例如,对于c#项目中的bin/obj文件夹,你通常会想要从你的repo中排除以节省空间,或者类似的事情。

-f (force)选项也会删除文件,这些文件不会被跟踪,也会被git通过ignore-rule忽略。在上面的例子中,使用ignore-rule永远不会跟踪bin/obj文件夹,即使这些文件夹被git忽略,使用force-选项也会将它们从文件系统中删除。我偶尔也见过这种用法,例如,在编写部署脚本时,你想在部署、压缩或其他任何事情之前清理代码。

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

检出“点”

git checkout .

在阅读你的文章之前,我实际上从未见过这个符号。我很难找到这方面的文档(也许有人可以帮忙),但从周围玩一点,它看起来意味着:

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

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

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

总结一下

Generally, if you are confident you have committed and maybe pushed to a remote important changes, if you are just playing around or the like, using git reset --hard HEAD followed by git clean -f will definitively cleanse your code to the state, it would be in, had it just been cloned and checked out from a branch. It's really important to emphasize, that the resetting will also remove staged, but uncommitted changes. It will wipe everything that has not been committed (except untracked files, in which case, use clean).

所有其他命令都是为了方便更复杂的场景,其中需要一个“撤消东西”的粒度:)

我觉得,你的问题#1已经涵盖了,但最后,总结#2:你从未发现需要使用git重置的原因是你从未上演过任何事情。如果你换了个地方,也不是收银。gitclean -f也不会把它还原。

希望这能覆盖。

最好的方法是检查变化。

在一个名为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'

选项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>

此时添加答案的原因:

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

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

基本上就是清理所有本地提交 $ git重置-困难和 $ 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分支branchname 操作这个分支:git checkout branchname

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

git add <path to file>

git commit -m "commit message"

#结帐其他本地分支

git checkout "local branch name"

#移除本地分支中的所有更改[假设你在本地分支中做了一些更改,如添加新文件或修改现有文件,或进行本地提交,但不再需要这些] Git clean -d -f和Git reset——hard[清除所有对本地分支的本地更改,除非本地提交]

Git stash -u也会删除所有更改

注意: 很明显,我们可以用任何一个 (1)结合git clean -d -f和git reset——硬 或 (2) git stash -u 达到预期的结果。

注1:Stashing,这个词的意思是“将(某物)安全秘密地存放在指定的地方”。这总是可以使用git隐藏流行检索。因此,在上述两个选项中做出选择是开发者的决定。

注2:git重置——hard将删除工作目录更改。在运行此命令之前,请务必保存要保留的任何本地更改。

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

git checkout master

Git获取[这可能是必要的(取决于你的Git配置)来接收源/主的更新]

git pull

#将特性分支合并到主分支中。

git merge feature_branch

#重置主分支到原点的状态

git reset origin/master

#不小心从本地删除了一个文件,如何找回它回来? 做一个git状态来获得被删除资源的完整文件路径

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

or

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重置-hard origin/master[如果本地分支是master]

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

$ git revert ab12cd15

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

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

git reset——hard HEAD~1[用于删除本地分支的提交。1表示你所做的一次提交

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

#从本地和远程repo删除一些最近的提交,并保留到您想要的提交。(一种本地和远程的还原提交)

让我们假设你有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——decoration——graph //查看你所有的commit

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

Git reset——hard commit -1 //本地恢复到此提交

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

#删除本地git合并: 案例: 我在主分支和合并的主分支与一个新的工作分支阶段2

$ git status

在分支主机上

我们要相交 哥!

在分支主机上

你的分支比'origin/master'提前8次提交。

问:如何摆脱这个本地git合并?尝试git reset -hard和git clean -d -f都没有工作。 唯一有效的方法是以下任何一种:

$ git重置-硬源/主

or

$ git重置-硬头~8

or

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

#创建gitignore文件

点击.gitignore //在MAC或Unix用户中创建文件

样本。gitignore内容:

.project
*.py
.settings

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