我试图在git中获取特定版本并将其作为当前版本提交。考虑这个示例场景:
tag : v2 (current version)
files : 1.txt,2.txt,3.txt
tag : v1
files : 55.xml,33.yml
我正在尝试切换到标记v1并将其作为我当前的版本(获取此特定版本)
通过搜索网络,我能够找到获取所有文件的方法
git checkout tag_name
# ex. git checkout v1
这实际上从特定版本获取文件并加载到我的工作目录中。
但我无法提交现有文件并将其推回服务器。
(当它尝试推送时,它显示没有待更改)
它没有显示未更改的更改,因为没有更改。如果你想让遥控器上的master
指向v1
,你可以在遥控器上做update-ref
或reset
。如果你想创建一个新的提交,它是v2
的孩子,与v1
具有相同的树,你可以做一个merge
。你究竟想做什么?遥控器是裸机还是工作目录?如果是前者,你应该什么都不做,任何想要在v1
看到文件的人都应该结帐v1
。如果是后者,你应该只是在远程登出v1
但不做新的提交。
从您的评论中,您可能想要对远程仓库进行新的提交,该远程仓库具有与标签v1
相同的文件内容。最好只是在远程仓库上使用update-ref
将其重置回v1
,但肯定可以进行新的提交。一种方法是:
git reset $( echo 'Resetting repo to v1' | git commit-tree $(
git show -s --format='%T' v1 ) -p v2 )
这将计算v1
的树,使用该参数调用commit-tree以创建一个新的提交对象,其父级为v2
(或使用HEAD,或者您希望成为新提交的父级),使用提交日志“重置repo到v1“然后重置repo,以便HEAD指向新的提交。完成此操作后,您应该能够推送回购。只做一个pull
并在旧树中合并可能更简单,但这可能需要相当多的人工干预来解决冲突。
由于您有标签,您应该将标签签出到分支中。
git checkout -b v2 branch_v2
这将在标记v2处将项目的状态检入到名为branch_v2的分支中(您可以随意调用它)。
这是我获得特定修订的方式:
$ git fetch origin cd379d1c02ae095ad945c8c8c833f4fa2aaf51a7
$ git reset --hard FETCH_HEAD
然后,如果我想做一些工作并从刚签出的标签添加提交,我会创建一个新的分支:
$ git checkout -b v1a
$ git push -u origin v1a