撤消特定提交的最简单方法是:
因为如果它不是最新的提交,
git reset HEAD
Run Code Online (Sandbox Code Playgroud)
不起作用.而且因为它被推到了遥远的地方,
git rebase -i
Run Code Online (Sandbox Code Playgroud)
和
git rebase --onto
Run Code Online (Sandbox Code Playgroud)
将导致遥控器出现一些问题.
更重要的是,我不想真正修改历史.如果有错误的代码,它就在历史中可以看到.我只想在工作副本中使用它,我不介意反向合并提交.
换句话说,以下svn命令的Git等价物是什么:
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
Run Code Online (Sandbox Code Playgroud)
通过反向合并这些修订中的所有更改,将所有更改从295移除到302,作为新提交.
svn merge -c -302 ^/trunk
Run Code Online (Sandbox Code Playgroud)
当然,通过添加另一个反向合并来自相应提交的更改的提交来撤消302提交.
我认为它应该是一个相当简单的Git操作和一个相当常见的用例.原子提交还有什么意义?
我们已经举办藏起来,并要保证的提交是完全原子,你不应该能够很容易地撤销这些原子提交的一个或多个?
我的问题是我已经更改了一个文件,例如:README,为我的测试行添加了一行新的'并保存了该文件,然后我发出了以下命令
git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
#
no changes added to commit (use "git add" and/or "git commit -a")
git add README
git commit -a -m 'To add new line to readme'
Run Code Online (Sandbox Code Playgroud)
我没有将代码推送到github,现在我想取消这个提交.
为此我用过
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
但是我从README文件中丢失了新添加的" 这个用于我的测试行 ".这不应该发生.我需要内容.有没有办法保留内容并取消我的本地提交?
我一直在想,git reset并且git checkout同样地,在这个意义上,两者都将项目带回特定的提交.但是,我觉得它们不可能完全相同,因为这将是多余的.这两者之间的实际差异是什么?我有点困惑,因为svn只svn co需要恢复提交.
在下面的图解释了差别,尽管在一个或者可能过于简化的或不正确的方式进行.你怎么看?是错误还是过度简化?

VonC和Charles解释了两者之间的差异,git reset并且git checkout非常好.我目前的理解是git reset将所有更改还原为特定提交,而git checkout更多或更少的准备分支.我发现以下两个图对于理解这些图非常有用:

从http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html,checkout和reset可以模拟反叛.
git checkout bar
git reset --hard newbar
git branch -d newbar
Run Code Online (Sandbox Code Playgroud)
我有以下工作树状态
$ git status foo/bar.txt
# On branch master
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# deleted by us: foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
文件foo/bar.txt在那里,我想再次进入"未更改状态"(类似于'svn revert'):
$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M foo/bar.txt
Run Code Online (Sandbox Code Playgroud)
现在它变得令人困惑:
$ git status foo/bar.txt
# …Run Code Online (Sandbox Code Playgroud) 如何撤消上次提交后对目录所做的每次更改,包括删除添加的文件,重置已修改的文件以及添加已删除的文件?
我想了解如何重新恢复或回滚文件和项目到以前的状态,不明白之间的差别git revert,checkout和reset.为什么有3个不同的命令看似相同的目的,何时有人选择一个而不是另一个?
我一直在做一些事情,并决定完全搞砸了......在完成了一些事情之后.所以我尝试了以下顺序:
git reset --hard
git rebase origin
git fetch
git pull
git checkout
Run Code Online (Sandbox Code Playgroud)
在那时我得到了消息
Your branch is ahead of 'origin/master' by 2 commits.
Run Code Online (Sandbox Code Playgroud)
我想丢弃我的本地提交,而不必删除我的本地目录并重新下载所有内容.我怎么能做到这一点?
标题说明了一切.
之后git reset --hard,git status给我Changes not staged for commit:部分内的文件.
我也尝试了git reset .,git checkout -- .并且git checkout-index -f -a无济于事.
那么,我怎样才能摆脱那些未分阶段的变化呢?
这似乎只打击Visual Studio项目文件.奇怪的.请参阅此粘贴:http://pastebin.com/eFZwPn9Z.这些文件的特殊之处在于.gitattributes我有:
*.sln eol=crlf
*.vcproj eol=crlf
*.vcxproj* eol=crlf
Run Code Online (Sandbox Code Playgroud)
此外,autocrlf在我的全局中设置为false .gitconfig.这可能是某种相关的吗?
我通过此命令将本地主服务器重置为提交:
git reset --hard e3f1e37
Run Code Online (Sandbox Code Playgroud)
当我输入$ git status命令时,终端说:
# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
# (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)
由于我也要重置原点/标题,我结帐到origin/master:
$ git checkout origin/master
Note: checking out 'origin/master'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without …Run Code Online (Sandbox Code Playgroud) 错误地,我做了git add .并且git commit在develop分支机构.但幸运的是,我没有这样做git push.
所以我想把它恢复到原始状态.
我试过了git reset --soft,git reset HEAD --hard但看起来我搞砸了.
我该如何解决?我想回到原始状态并可能保持代码更改.