说我在Git存储库中.我删除了一个文件并提交了更改.我继续工作,并做了一些更多的提交.然后,我发现我需要恢复该文件.
我知道我可以使用签出文件git checkout HEAD^ foo.bar,但我真的不知道该文件何时被删除.
我希望我不必手动浏览我的日志,检查整个项目的给定SHA,然后手动将该文件复制到我原来的项目结帐中.
我正在使用git并在master分支上工作.这个分支有一个名为的文件app.js.
我有一个experiment分支,我做了一堆变更和大量的提交.现在我希望把做只对所有变化app.js从experiment到master分支.
我怎么做?
再一次,我不想合并.我只是想把所有的变化app.js从experiment分支带到master分支.
我有一个Git存储库,我想看看几个月前一些文件的样子.我在那个日期找到了修改版,而且它是27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8.我需要查看一个文件的外观,并将其保存到文件中.
我设法看到文件使用gitk,但它没有保存选项.我尝试使用命令行工具,我得到的最接近的是:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Run Code Online (Sandbox Code Playgroud)
但是,此命令显示diff而不是文件内容.我知道我以后可以使用类似的东西PAGER=cat并将输出重定向到文件,但我不知道如何获得实际的文件内容.
基本上,我正在寻找类似svn cat的东西.
我一直在想,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 add,git commit并且git push拜托,这对git来说有点可能吗?我无法找到任何有用的东西,也无法找到它.有了SVN我就做了svn up file,瞧.
我会很高兴得到任何帮助,谢谢!
在我的分支上,我在.gitignore中有一些文件
在不同的分支上,这些文件不是.
我想将不同的分支合并到我的,我不在乎这些文件是否不再被忽略.
不幸的是我明白了:
合并将覆盖以下未跟踪的工作树文件
如何修改我的pull命令来覆盖这些文件,而不必自己查找,移动或删除这些文件?
更新:从Git 1.8.3开始,这将更直观地工作,请参阅我自己的答案.
想象一下以下用例:我想摆脱我的Git工作树的特定子目录中的所有更改,保留所有其他子目录.
我可以git checkout .,但git checkout.添加稀疏结帐排除的目录
有git reset --hard,但它不会让我为子目录这样做:
> git reset --hard .
fatal: Cannot do hard reset with paths.
Run Code Online (Sandbox Code Playgroud)
再说一遍:为什么git不能通过路径进行硬/软复位?
我可以使用反向修补当前状态git diff subdir | patch -p1 -R,但这是一种相当奇怪的方法.
什么是适合此操作的Git命令?
下面的脚本说明了这个问题.在How to make files注释下面插入适当的命令- 当前命令将恢复a/c/ac应该由稀疏检出排除的文件.请注意,我不希望明确恢复a/a和a/b,我只"知道" a,并希望下面恢复一切.编辑:我也不"知道" b,或者与其他目录位于同一级别a.
#!/bin/sh
rm -rf repo; git init repo; cd repo
for f in a b; do …Run Code Online (Sandbox Code Playgroud) 当我想取消暂存文件时,我所有的 Git 教程都显示如下内容:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
Run Code Online (Sandbox Code Playgroud)
此提示告诉我们git reset用于取消暂存文件。
但是,在我的终端中,我看到:
git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: cat.js -> catcat.js
renamed: tolendo.gogo -> tolendo.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme (copy).md
tolendo (copy).txt
zing (copy).html
Run Code Online (Sandbox Code Playgroud)
我的终端告诉我使用,git …
我无法弹出我的藏匿处,因为我合并了一个显然与我的藏品冲突的分支,现在我的藏匿处似乎无法弹出.
app.coffee: needs merge
unable to refresh index
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
固定!
事实证明,实际问题是来自合并的未解决的合并冲突,而不是存储会导致合并冲突.
解决方案:提交冲突的文件.