更新:从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 status"现在说:
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# Classes/FileA.h
# Classes/FileA.m
# Classes/FileB.h
# Classes/FileB.m
nothing added to commit but untracked files present (use "git add" to track)
Run Code Online (Sandbox Code Playgroud)
然后,我决定放弃这些文件并恢复到项目中的原始状态.在继续之前我是否必须删除每个文件?!!
我试过了:
git checkout master
Run Code Online (Sandbox Code Playgroud)
它给出了"已经'掌握''和'
git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)
但是我添加的文件仍然适用于这两种方法.
我已经阅读了整个Git教程(http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html)以及各种手册页.
为什么这么难做?!!
我在本地机器上做了一些更改,我不想保留它们。
当我执行拉取以从服务器获取最近的更改时,我收到一条消息,说我有未暂存的更改,我必须提交或存储它们。
但我不想这样做。我想取消它们。这该怎么做?
使用 Git 丢弃未提交更改的最佳方法是什么。
我读了这个,但想完全了解每一步在做什么。
git reset
Run Code Online (Sandbox Code Playgroud)
这是否意味着删除任何添加的文件?
git checkout .
Run Code Online (Sandbox Code Playgroud)
什么被认为是根?如果我在分支 A 并且我想忽略分支 A 上所有未提交的更改,分支 A 是否被视为根?
git clean -fdx
Run Code Online (Sandbox Code Playgroud)
这是在删除我的文件吗?包括被忽略的文件?如果忽略的文件没有改变怎么办?