更新:从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 add dir"错误地添加了文件.我还没有运行"git commit".有没有办法从提交中删除此目录及其中包含的所有内容?
我试过了git reset dir,但没用.显然git reset file是撤消它的方法.但是我有这么多文件,所以时间很少.
git rm将从暂存区域中删除条目.这与git reset HEAD"unstages"文件有点不同.通过"unstage"我的意思是它将暂存区域恢复到我们开始修改之前的状态.git rm另一方面,只需将文件完全从舞台上踢出,这样它就不会包含在下一个提交快照中,从而有效地删除它.默认情况下,a
git rm file将完全从暂存区域中删除文件,也将从磁盘>(工作目录)中删除.要将文件保留在工作目录中,您可以使用git rm --cached.
但究竟是什么区别git rm --cached asd和git reset head -- asd?
在git中,我试图squash commit通过合并另一个分支然后HEAD通过以下方式重置到上一个位置:
git reset origin/master
Run Code Online (Sandbox Code Playgroud)
但我需要走出这一步.如何将HEAD移回上一个位置?
我有23b6772提交的SHA1 frag(),我需要将其移动到.
我怎样才能回到这个提交?
$ git reset -- <file_path> 可以通过路径重置.
但是,$ git reset (--hard|--soft) <file_path>会报告如下错误:
Cannot do hard|soft reset with paths.
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 …
我正在努力恢复我的工作.我愚蠢地做了git reset --hard,但在那之前我只做过get add .而且没做过git commit.请帮忙!这是我的日志:
MacBookPro:api user$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# modified: .gitignore
...
MacBookPro:api user$ git reset --hard
HEAD is now at ff546fa added new strucuture for api
Run Code Online (Sandbox Code Playgroud)
git reset --hard在这种情况下可以撤消吗?
作为Git用户,我经常遇到这种情况,我需要以一种不适合--amend或不适合rebase -ifixup提交的方式重做一个或多个提交.通常我会做类似的事情
git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?
Run Code Online (Sandbox Code Playgroud)
我认为合理的撰写提交消息非常严重.它们通常包含较大的文本,其中包含对更改的引用和理由.到目前为止,我对通过未排序git reflog,git log复制和粘贴过程恢复旧提交消息的漫长过程感到非常恼火.
有没有更好的解决这个问题?如果我包含多个提交,它会怎么样?
编辑:经过一番思考之后,我认为我正在寻找的是一些git stash- like功能,用于提交消息,其中fixup/revision提交不合适.
例如,在下面的主分支中,我需要删除提交af5c7bf16e6f04321f966b4231371b21475bc4da,这是由于之前的rebase导致的第二个:
commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Tue Apr 12 23:50:15 2011 +0200
add generic config/initializers/omniauth.example.rb
commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Fri Apr 22 00:15:50 2011 +0200
show github user info if logged
commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Fri Apr 22 17:20:48 2011 +0200
add multiple .container at blueprint layout
commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date: Thu Apr 21 19:55:57 2011 +0200
add %h1 Fantastic Logo + .right for 'Sign …Run Code Online (Sandbox Code Playgroud) 我们都听过一个人应该重订,从未发表的作品,它的危险,等等.但是,我还没有看到张贴如何处理的情况下衍合情况的任何食谱被出版.
现在,请注意,只有存储库仅由已知(并且最好是很小)的人群克隆,这才真正可行,这样无论谁推送rebase或重置,都可以通知其他人他们下次需要注意的时候取(!).
如果你没有本地提交foo并且它被重新定位,我看到的一个明显的解决方案将起作用:
git fetch
git checkout foo
git reset --hard origin/foo
Run Code Online (Sandbox Code Playgroud)
foo根据远程存储库,这将简单地抛弃本地状态以支持其历史记录.
但是,如果一个人在该分支机构进行了大量的本地更改,那么如何处理这种情况呢?
git ×10
git-reset ×10
git-rebase ×3
git-revert ×2
commit ×1
git-add ×1
git-checkout ×1
git-commit ×1
git-index ×1
git-reflog ×1
git-rm ×1
github ×1
rebase ×1
reset ×1
restore ×1
undo ×1
unstage ×1