2

我正在尝试在 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

这实际上从特定版本中获取文件并加载到我的工作目录中。

但我无法提交现有文件并将其推回服务器。

(当它尝试推送时,它显示没有待处理的更改)

4

3 回答 3

0

由于您有标签,因此您应该将标签签出到分支中。

git checkout -b v2 branch_v2

这会将标签 v2 处的项目状态检出到名为 branch_v2 的分支中(您可以随意调用它)。

于 2012-06-18T13:10:30.940 回答
0

它显示没有待处理的更改,因为没有更改。如果您想master在遥控器上指向v1,您可以在遥控器上执行 anupdate-ref或 a reset。如果你想创建一个新的提交,它是它的子v2节点,它与 具有相同的树v1,你可以做一个merge. 你到底想做什么?远程是一个裸仓库,还是一个工作目录?如果是前者,你应该什么都不做,任何想查看文件的人都v1应该 checkout v1。如果是后者,您应该简单地v1在遥控器上签出,但不要进行新的提交。

从您的评论中,听起来您想对具有与 tag 相同文件内容的远程仓库进行新的提交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 指向新的提交。完成此操作后,您应该能够推送到 repo。在旧树中进行合并可能更简单pull,但这可能需要相当多的手动干预来解决冲突。

于 2012-06-18T13:12:13.027 回答
0

这就是我获得特定修订的方式:

$ git fetch origin cd379d1c02ae095ad945c8c8c833f4fa2aaf51a7
$ git reset --hard FETCH_HEAD

然后,如果我想做一些工作并从您刚刚签出的标签中添加提交,我将创建一个新分支:

$ git checkout -b v1a
$ git push -u origin v1a
于 2018-11-13T20:21:52.077 回答