说我在干净的master
分支上有我的工作副本。我想要的是将整个代码带到某个提交时的状态,但实际上没有切换到提交/分离HEAD。
我可以使用以下步骤实现这一目标:
.git
目录,并从原始工作副本(仍处于干净master
)中删除该目录:这是一个示例,说明我最终想要的内容:
mkdir code
cd code/
git init .
echo 'content 1' > file.txt
git add --all && git commit -m 'version 1' && git tag v1
echo 'content 2' > file.txt
git add --all && git commit -m 'version 2' && git tag v2
cd ..
cp -pr code code1
cd code1/
git checkout v1
rm -rf .git
mv ../code/.git ./
git diff
diff --git a/file.txt b/file.txt
index 4d4bc1c..a0054e4 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1 @@
-content 2
+content 1
git status
On branch master
Changes not staged for commit:
modified: file.txt
问题是:如何仅使用git命令实现这一点,而不是处理.git
文件夹?像git bring-to-the-state-of hash/branch/tag
?
答案 0 :(得分:3)
上一个答案似乎可以通过--patch
为您提供所需的内容。但要回答问题的标题,您可以使用结帐的变量来获得此结果,该变量带有path
参数。
例如,如果您已经检出master
分支并且想要更新工作目录,那么所有文件看起来都像2.3.4版本中那样
git checkout v2.3.4 -- .
这将暂存所有已更改的文件。发出git status
将显示所有已更改的文件。
答案 1 :(得分:2)
看起来你正在寻找git checkout --patch:
git checkout [-p | --patch] [] [ - ] ... 当给出或者--patch时,git checkout会不切换分支。它从索引文件或命名(最常见的提交)更新工作树中的命名路径。在这种情况下,-b和--track选项毫无意义,并且给出其中任何一个都会导致错误。该参数可用于指定特定的树(即提交,标记或树),以在更新工作树之前更新给定路径的索引。