我使用git checkout --<dir_name(or)file_name>
放弃特定目录或文件中的所有更改。每当我这样做时,GIT都会从存储库中检出目录(或)文件。
有没有办法告诉GIT?“不要覆盖这些变化,只要告诉我会发生什么。”
与git clean -n
(或)git clean --dry-run
类似。
更新
在执行git checkout --src/
之前,我想看看哪些文件会被覆盖。我知道我们可以使用git status src/
。但是,拥有git checkout -n --src/
不是很好吗?用户没有太多的命令更改。
答案 0 :(得分:6)
Git checkout
命令没有dry-run
(或类似)选项。但是,您可以使用Git ls-files
命令查看哪些工作目录文件与HEAD
不同:
git ls-files -dm -- src/
这将列出所有已删除或修改过的文件,这些文件通常会被checkout
覆盖。
另一种选择是使用Git diff
命令:
git diff --name-only HEAD -- src/
这列出了与HEAD不同的所有文件,并将替换为checkout
。
如果这是经常做的事情,您可能想要创建alias
:
git config --global alias.lco "diff --name-only HEAD"
然后你可以使用:
git lco -- src/
答案 1 :(得分:3)
你可以运行
$ git checkout --patch -- <files>
它会询问每个区别是否要“检查”这种差异。如果你对每个提示说“不”,那么它就不会受到影响。
答案 2 :(得分:2)
您想要任何命令的干运行选项,无论您认为&#34;您不需要干运行结账,因为您可以获得一个清单差异的其他方式&#34;。
你不想要一个干运行的选项来获得差异列表,你想要一个干运行来验证&#34;当我按下Enter键会发生什么?&#34;在你真实地做之前。它们是有区别的。如果您所做的只是阅读手册,那么您可能会在某些模糊不清的情况下测试程序的实际/确切行为。
我有一个奇怪的项目,其中回购基于&#39; /&#39;。所以,有一个&#39; / .git&#39;目录和&#39; / .gitignore&#39;和&#39; / .gitmodules&#39;文件。在repo中跟踪/.gitignore和/.gitmodules文件,这是一个问题,因为即使开发者用户有权编辑该文件,他们仍然没有git删除和重新获取的权限 - 创建文件,因为不能和不能在&#39; /&#39;上拥有写入权限。本身。如果git编辑过的文件没有问题,但是git会删除并替换,因为用户会收到git无法解除文件链接的错误。在开发我们的repo配置的更改过程中,以及开发人员的一些指示,以便将来删除此问题,沿途我想知道此命令将执行的操作:
git checkout master -- /.git*
以及其他可能的变体,例如
git checkout master -- '/.git*'
和其他人,改变shell globbing和/或看看git本身如何解释最终的filespec值。如果我逃脱了&#39; *&#39;从shell开始,git会扩展一个&#39; *&#39;还是会把它视为文字?如果它扩展它,它是否包括&#39; / .git /&#39; DIR?如果它扩展它,是否有一些我可以使用的正则表达式语法,这意味着任何单个非空字符&#39;喜欢&#39;。&#39;在正则表达式或&#39;?&#39;在shell globbing?等等
我不想知道哪些文件不同,我想测试git的确切行为,以找到一个不寻常的命令或一组命令的最佳/最简单版本。
为此,你真的想要一个干跑选项。我已经知道哪些文件不同了。在这种情况下,许多文件会有所不同,我不想要任何文件。我只想要/.gitignore和/.gitmodules而不是别的。
在这种情况下,我知道我可以通过在命令行中明确指定它们来做到这一点。
git checkout master -- /.gitignore /.gitmodules
但我想看看是否有一个更短的globbing语法可以自动获取它们,但理想情况下,不包括/.git目录。理想情况下,我想弄清楚我能逃脱的最简单的形式。我知道我可以使用shell进行一些奇特而且非常具体的扩展,但是如果有类似&#39; / git *&#39;工作,我宁愿使用它而不是&#39; / git {i,m} *&#39;
这项特殊任务很小,有几个简单的答案。请不要告诉我如何在没有&#34; git checkout --dry-run&#34;的情况下解决这个确切的问题,或告诉我在/中制作回购是多么愚蠢,我也知道。我已经知道几种方法来完成我的即时工作。这不是重点。它可能很容易涉及更多文件或更复杂的通配模式,因此仅仅明确地列出文件非常方便,或者,它可能是一些完全不同类型的问题。
一般来说,重点适用于任何地方的任何命令,包括git checkout,总是使用dry-run选项来测试程序本身的行为。阅读手册或--help并不能回答干运问题。
答案 3 :(得分:1)
不确定但是作为一种解决办法,你不能git stash -u
然后git apply
然后git checkout
?
如果你不开心,你总是可以恢复到藏匿处。
答案 4 :(得分:0)
如果您想避免互动(la“对每个提示说不”),请使用git diff
。如果您想要确切回答问题,请使用git diff -R
。如果您只想要文件名,请使用git diff --name-only
。
如果没有-R
标记,git diff
将以补丁格式报告您的工作树和索引之间的所有差异,即您在发布git show <commit>
时看到的格式。 -R
会反转输出,显示删除更改后会发生什么,就像删除本身就是一个补丁一样。考虑一个例子:
git init /tmp/test && cd /tmp/test
echo "old line">file
git add .
git commit -m "Initial commit"
echo "new line">file
现在发出git diff
没有任何标志。你应该得到:
$ git diff
diff --git a/file b/file
index 0906fba..86ba82a 100644
--- a/file
+++ b/file
@@ -1 +1 @@
-old line
+new line
坦率地说,我发现输出很容易解析我从不使用-R
标志。如果您经常发出git diff
命令(并且我发现它是我使用的最常见命令之一),则可能不需要反向输出。同样,为了这个答案的目的,尝试:
$ git diff -R
git diff -R
diff --git b/file a/file
index 86ba82a..0906fba 100644
--- b/file
+++ a/file
@@ -1 +1 @@
-new line
+old line
该输出完全描述了您所寻求的内容:“不要覆盖更改,只要告诉我会发生什么。”
默认情况下,该命令将使用索引区分整个工作目录。它会显示每个修改过的文件中的差异。假设您只想在一个文件上看到效果。这很简单。只需使用您已经使用的相同的双破折号命名法:
git diff -- <file>
你会发现git diff
是git中最有用,可扩展的命令之一,你可以用它来做各种有用的事情。您可以使用它来比较两个提交,两个分支或两个文件。我最近的“最喜欢的疯狂git操作”是git diff
到git apply
。前者产生可理解的补丁。后者适用它们。你在结合历史时重写历史的能力几乎是无限的 - 当然,在本地,永远不会重写共享历史。考虑另一个例子,此时关闭主题但是非常有趣(如果你是这样的话)事情)。从我们的测试库,上面:
git add .
git commit -m "Second commit"
echo "even newer line">file
git add .
git commit -m "Third commit"
你知道吗?我不喜欢第二次提交。它的实施是错误的。它打破了测试。我不想分享它。不过,我确实希望保留“第二次提交”提交消息,因为这很难输入。我可以用git rebase -i HEAD~2
来修改它,但这涉及打开编辑器,删除提交,编辑另一个和(呃)复制/粘贴。什么是开发者?怎么样:
git checkout ":/Initial" ;# get back to the first commit
git diff HEAD ":/Third" | git apply ;# apply the diff between the first and third commit
git add . ;# add the result
git commit -C ":/Second" ;# with second commit's message
git checkout -B master HEAD ;# and replace old 'master'
结果与git rebase
的结果相同。我只是设法避免交互式会话,我没有必要使用编辑器。这有点矫枉过正吗?可能,但肯定很有趣。此外,构建更复杂的用例很容易,尤其是当您合并git diff
,git apply
和git add -p
时。