如何在同一个分支上更新git工作副本到特定的提交?

时间:2016-05-09 09:29:49

标签: git

说我在干净的master分支上有我的工作副本。我想要的是将整个代码带到某个提交时的状态,但实际上没有切换到提交/分离HEAD。

我可以使用以下步骤实现这一目标:

  1. 创建整个工作副本目录的副本;
  2. 将新副本签出到我希望我的代码处于状态的提交中;
  3. 删除.git目录,并从原始工作副本(仍处于干净master)中删除该目录:
  4. 这是一个示例,说明我最终想要的内容:

    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

    这样的东西

2 个答案:

答案 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选项毫无意义,并且给出其中任何一个都会导致错误。该参数可用于指定特定的树(即提交,标记或树),以在更新工作树之前更新给定路径的索引。