我刚刚克隆了一个git存储库并检出了一个分支.我努力了,然后决定删除我所有的本地更改,因为我想要原始副本.
简而言之,我必须执行以下两个命令来删除我的本地更改
git checkout .
git clean -f
Run Code Online (Sandbox Code Playgroud)
我的问题是,
(1)这是摆脱当地变化的正确方法,或者请让我知道正确的方法.
(2)我们什么时候使用,git reset --hard因为即使没有这个命令也可以重置
谢谢
*解决方案:主要编辑:03/26:* 用git特定术语[tracked/untracked/staged/unstaged]替换了许多含糊不清的术语
当我们进行本地更改时,只有三类文件:
类型1.分阶段跟踪文件
键入2.未分级跟踪文件
键入3. Unstaged UnTracked文件,即UnTracked文件
每个命令的作用:
git checkout . - 仅删除未分级跟踪文件[类型2]
git clean -f - 仅删除未分级的UnTracked文件[类型3]
git reset --hard - 仅删除分阶段跟踪和未分阶段跟踪文件[类型1,类型2]
git stash -u - 删除所有更改[类型1,类型2,类型3]
结论:
很明显,我们可以使用其中之一
(1) combination of `git clean -f` and `git reset --hard`
Run Code Online (Sandbox Code Playgroud)
要么
(2) `git stash -u`
Run Code Online (Sandbox Code Playgroud)
达到预期的效果.
注意:存储,因为这个词的意思是"在指定的地方安全地,秘密地存储(某物)".这总是可以使用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]
注意:06/12/2015 这不是另一个被标记为重复的SO问题的副本.此问题解决了如何删除本地GIT更改[删除添加的文件,删除添加到现有文件等的更改以及各种方法; 其他SO线程中的位置仅解决了如何删除本地提交的问题.如果你添加了一个文件,而你想单独删除它,那么另一个SO线程就不会讨论它.因此,这不是另一个的重复]
编辑:2015年6月23日
如何还原已经推送到远程存储库的提交?
$ git revert ab12cd15
Run Code Online (Sandbox Code Playgroud)
编辑:09/01/2015
从本地分支和远程分支删除先前的提交
案例:您刚刚对当地分支机构进行了更改,并立即推送到远程分支机构,突然意识到,哦不!我不需要这个改变.现在做什么?
git reset --hard HEAD~1 [用于从本地分支删除该提交]
git push origin HEAD --force[两个命令都必须执行.从远程分支删除]
什么是分支?它是当前签出的分支.
编辑09/08/2015 - 删除本地git merge:
我在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.
Run Code Online (Sandbox Code Playgroud)
问:如何摆脱这种合并?试过git reset --hard ,git clean -d -f
两个都没用.
唯一有效的是以下任何一个:
$ git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
要么
$ git reset --hard HEAD~8
Run Code Online (Sandbox Code Playgroud)
要么
$ git reset --hard 9a88396f51e2a068bb7 [sha commit code - 这是在你的所有合并提交发生之前出现的代码]
Fre*_*ing 491
这一切都取决于你想要撤消/恢复的确切内容.首先阅读Ube链接中的帖子.但要尝试回答:
硬重置
git reset --hard [HEAD]
Run Code Online (Sandbox Code Playgroud)
完全删除所跟踪文件的所有暂存和非暂停更改.
我发现自己经常使用硬重置,当我喜欢"只是撤消一切,就像我从遥控器完成了一次完全重新克隆".在你的情况下,你只需要你的repo pristine,这将工作.
清洁
git clean [-f]
Run Code Online (Sandbox Code Playgroud)
删除未跟踪的文件.
用于删除临时文件,但保留已跟踪文件的暂存和非暂存更改.大多数情况下,我可能最终会制作一个忽略规则,而不是反复清理 - 例如,对于C#项目中的bin/obj文件夹,您通常希望从您的仓库中排除以节省空间,或类似的东西.
-f(强制)选项也将删除未被跟踪的文件,并且 git通过ignore-rule也会被忽略.在上面的例子中,使用ignore-rule永远不会跟踪bin/obj文件夹,即使git忽略了这些文件夹,使用force-option也会将它们从文件系统中删除.我偶尔会看到一个用途,例如在脚本部署时,你想在部署,压缩之前清理你的代码.
Git clean不会触及已被跟踪的文件.
结帐"点"
git checkout .
Run Code Online (Sandbox Code Playgroud)
在阅读你的帖子之前,我实际上从未见过这种表示法.我很难找到这方面的文档(也许有人可以提供帮助),但是从玩了一下,它看起来像是意味着:
"撤消我工作树中的所有更改".
即撤消跟踪文件中的未分级更改.它显然没有触及分阶段的变化,只留下未跟踪的文件.
积攒
一些答案提到了藏匿.正如措辞所暗示的那样,你可能会在你处于中间状态时使用存储(没有准备好提交),你必须暂时切换分支或以某种方式处理你的代码的另一个状态,以后再回到你的"凌乱"台".我不认为这适用于你的问题,但它绝对方便.
总结一下
一般来说,如果你确信你已经承诺并且可能被推到了一个遥远的重要变化,如果你只是在玩游戏等,使用git reset --hard HEAD后面git clean -f将明确地清理你的代码到状态,如果它刚被克隆,它将会在并从分支机构检查.强调重要的是,重置还将删除分阶段但未提交的更改.它将擦除所有未提交的内容(未跟踪文件除外,在这种情况下,请使用clean).
所有其他命令都是为了促进更复杂的场景,其中需要"撤消内容"的粒度:)
我觉得,你的问题#1已被涵盖,但最后,在#2结束:你从未发现需要使用的原因是你从未上git reset --hard过任何东西.如果你进行了改变,既git checkout .不会也git clean -f不会恢复.
希望这涵盖.
Chr*_*oph 20
与git中的所有内容一样,有多种方法可以实现.您使用的两个命令是一种方法.你可以做的另一件事就是用它们藏起来git stash -u.在-u确保新增加的文件(未经跟踪)也包括在内.
方便的git stash -u是这个
git stash pop(这就像删除gmail中的电子邮件一样,如果你之后改变主意,你可以撤消它)从你的另一个问题来看,git reset --hard不会删除未跟踪的文件,所以你仍然需要git clean -f.但一个git stash -u可能是最方便的.
spi*_*man 20
此时添加答案的原因:
到目前为止,我在最初的问题本身中添加了结论和"答案",使得问题非常冗长,因此转向单独的答案.
我还添加了更常用的git命令来帮助我使用git,以帮助其他人.
基本上清理所有本地提交
$ git reset --hard和
$ git clean -d -f
首先你做任何承诺之前的步骤是配置您的用户名和电子邮件,随着你的承诺出现.
#设置要附加到提交事务的名称
$ git config --global user.name "[name]"
Run Code Online (Sandbox Code Playgroud)
#将您想要的电子邮件发送到您的提交事务
$ git config --global user.email "[email address]"
Run Code Online (Sandbox Code Playgroud)
#List全局配置
$ git config --list
Run Code Online (Sandbox Code Playgroud)
#List远程URL
$ git remote show origin
Run Code Online (Sandbox Code Playgroud)
#检查状态
git status
Run Code Online (Sandbox Code Playgroud)
#List所有本地和远程分支
git branch -a
Run Code Online (Sandbox Code Playgroud)
#create一个新的本地分支并开始在这个分支上工作
git checkout -b "branchname"
Run Code Online (Sandbox Code Playgroud)
或者,它可以作为两步过程完成
create branch:git branch branchname
在这个分支上工作:git checkout branchname
#commit local changes [两步过程: - 将文件添加到索引,这意味着添加到临时区域.然后提交此暂存区域中存在的文件]
git add <path to file>
git commit -m "commit message"
Run Code Online (Sandbox Code Playgroud)
#checkout其他一些本地分支
git checkout "local branch name"
Run Code Online (Sandbox Code Playgroud)
#remove本地分支中的所有更改 [假设您在本地分支中进行了一些更改,如添加新文件或修改现有文件,或进行本地提交,但不再需要)
git clean -d -f和git reset --hard [清除对本地分支所做的所有本地更改,除非本地提交]
git stash -u 还会删除所有更改
注意:
很明显,我们可以使用(1)组合git clean –d –f和git reset --hard
OR(2)git stash -u
来实现所需的结果.
注1:存储,因为这个词的意思是"在指定的地方安全地,秘密地存储(某物)".这总是可以使用git stash pop进行检索.因此,在上述两个选项之间进行选择是开发人员的号召.
注2:git reset --hard将删除工作目录更改.在运行此命令之前,请务必隐藏要保留的任何本地更改.
#切换到主分支,确保您是最新的.
git checkout master
Run Code Online (Sandbox Code Playgroud)
git fetch [这可能是必要的(取决于你的git配置)来接收origin/master的更新]
git pull
Run Code Online (Sandbox Code Playgroud)
#将功能分支合并到主分支中.
git merge feature_branch
Run Code Online (Sandbox Code Playgroud)
#将master分支重置为origin的状态.
git reset origin/master
Run Code Online (Sandbox Code Playgroud)
#Accidentally从本地删除了一个文件,如何检索回来?
执行a git status以获取已删除资源的完整文件路径
git checkout branchname <file path name>
Run Code Online (Sandbox Code Playgroud)
而已!
#Merge master branch with someotherbranch
git checkout master
git merge someotherbranchname
Run Code Online (Sandbox Code Playgroud)
#rename local branch
git branch -m old-branch-name new-branch-name
Run Code Online (Sandbox Code Playgroud)
#delete local branch
git branch -D branch-name
Run Code Online (Sandbox Code Playgroud)
#delete远程分支
git push origin --delete branchname
Run Code Online (Sandbox Code Playgroud)
要么
git push origin :branch-name
Run Code Online (Sandbox Code Playgroud)
#revert已经推送到远程存储库的提交
git revert hgytyz4567
Run Code Online (Sandbox Code Playgroud)
#branch来自之前使用GIT的提交
git branch branchname <sha1-of-commit>
Run Code Online (Sandbox Code Playgroud)
#Change提交已经被推送到远程的最近提交的消息
git commit --amend -m "new commit message"
git push --force origin <branch-name>
Run Code Online (Sandbox Code Playgroud)
#放弃此分支上的所有本地提交 [删除本地提交]
为了丢弃此分支上的所有本地提交,要使本地分支与此分支的"上游"相同,只需运行
git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)
参考:http://sethrobertson.github.io/GitFixUm/fixup.html
或git reset --hard origin/master[如果本地分支是主人]
#还原已经推送到远程存储库的提交?
$ git revert ab12cd15
Run Code Online (Sandbox Code Playgroud)
#Delete从本地分支和远程分支的先前提交
用例:您刚刚对本地分支进行了更改,并立即推送到远程分支,突然意识到,哦不!我不需要这个改变.现在做什么?
git reset --hard HEAD~1[用于从本地分支删除该提交.1代表你做的ONE提交]
git push origin HEAD --force[两个命令都必须执行.从远程分支删除].当前签出的分支将被称为您进行此操作的分支.
#Delete来自本地和远程repo的一些最近的提交,并保留到你想要的提交.(一种来自本地和远程的恢复提交)
假设您已将3个提交推送到名为' develop'的远程分支
commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.
Run Code Online (Sandbox Code Playgroud)
要恢复旧提交(更改分支状态)
git log --oneline --decorate --graph //查看所有的提交
git clean -d -f //清理所有本地更改
git reset --hard commitid-1 //本地恢复到此commitid
git push -u origin +develop//将此状态推送到远程.+做推力
#删除本地git merge: Case:我在master分支上,并且与一个新工作的分支phase2合并了master分支
$ git status
Run Code Online (Sandbox Code Playgroud)
在分支大师
$ git merge phase2
$ git status
在分支大师
你的分支在8次提交之前领先于'origin/master' .
问:如何摆脱这种本地git合并?试过git reset --hard,git 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
Run Code Online (Sandbox Code Playgroud)
GIT备忘单的参考链接:https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
git reset --hard
Run Code Online (Sandbox Code Playgroud)
此命令将从本地存储库中完全删除所有本地更改.这是在pull命令期间避免冲突的最佳方法,只有在您根本不想保留本地更改时才这样做.
如果你想从远程拉出新的更改并想在此拉动期间忽略本地更改,
git stash
Run Code Online (Sandbox Code Playgroud)
它将隐藏所有本地更改,现在您可以拉远程更改,
git pull
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过以下方式恢复您的本地更改:
git stash pop
Run Code Online (Sandbox Code Playgroud)
我认为 git 有一件事没有明确记录。我认为它实际上被忽视了。
git checkout .
伙计,你救了我的一天。我总是想尝试使用修改后的代码。但事情有时最终会弄乱修改后的代码,添加新的未跟踪文件等。所以我想要做的是,展示我想要的东西,做一些凌乱的事情,然后快速清理并在我满意时提交。
有git clean -fd很好的未跟踪文件的工作。
然后git reset简单地删除staged,但git checkout有点太麻烦了。一一指定文件或使用目录并不总是理想的。有时,我想删除的已更改文件位于我想保留的目录中。我希望这个命令只删除未暂存的更改,您就在这里。谢谢。
但我认为他们应该git checkout没有任何选择,删除所有未上演的更改,而不是触及上演的。它有点模块化和直观。更像是什么git reset。git clean也应该这样做。
| 归档时间: |
|
| 查看次数: |
542480 次 |
| 最近记录: |