【问题标题】:git: check out a tag, modify something, then tag it againgit:签出一个标签,修改一些东西,然后再次标记它
【发布时间】:2013-05-01 18:33:10
【问题描述】:

我觉得我应该知道这一点,但我很困惑。

我在 github 上创建了一个仓库。我需要签出一个标签(称为'v1.0.5'),修改文件上的一条语句,用一个名为'1.0.5'的新标签(没有'v')重新标记该状态,然后执行对 master 的更改相同。

让我更清楚。我正在将 EightMedia 的 Hammer.js 从命名的 AMD 模块更改为匿名模块。

我必须更改的唯一文件是src/outro.js。文件不改变从标签 v1.0.5 到 HEAD。

我想改变

// requireJS module definition
if(typeof window.define === 'function' && window.define.amd) {
    window.define('hammer', [], function() {
        return Hammer;
    });
}

// requireJS module definition
if(typeof window.define === 'function' && window.define.amd) {
    window.define(function() {
        return Hammer;
    });
}

我想要的是:签出 v1.0.5,更改该文件,并以我有一个标签 1.0.5 的方式推送 repo,其中包含 v1.0.5 的 exact 内容,加上变化。必须将标签推送到远程。

然后,checkout master,再次修改文件,再次push到master。

结帐 v1.0.5 时我很迷茫,我进入了分离的 HEAD 状态。提交后,我在哪里推送修改?以及如何标记它们并将标签推送到远程?

【问题讨论】:

    标签: git github tags


    【解决方案1】:

    首先,使用原始标签结帐:

    git checkout v1.0.5
    

    这将使您处于分离的 HEAD 状态 - 您的提交不会特别转到任何分支。这听起来像你想要的!

    现在,进行更改、暂存并提交。

    git commit -a -m "Commit message"
    

    您仍处于分离的 HEAD 状态,但您处于新的提交状态 - 具有您想要的更改和历史记录的提交。所以标记它!

    git tag 1.0.5
    

    推回远程(假设你的仍然命名为 origin):

    git push origin 1.0.5
    

    这将推送标签本身 (1.0.5) 以及它指向的所有必要的提交历史记录。

    请注意,您的更改不会包含在除此标记之外的任何位置其他。根据您的问题,我认为这就是您想要的,但如果您确实需要合并回master,您可以遵循:

    git checkout master
    git merge 1.0.5
    

    【讨论】:

      【解决方案2】:

      当您签出标签时,您会自动进入“分离 HEAD”状态,因为标签是不可变的,不应移动。当您进行更改然后提交它们时,它们不会进入任何分支或标记 - 您对提交的唯一引用是当前的 HEAD 指针。

      为了让工作更轻松,您可以创建一个临时分支来处理。

      git checkout -b tmp v1.0.5
      

      您可以使用git tag 1.0.5 创建一个指向当前提交的新标签(这将标记新提交及其历史记录)。

      然后,无需在 master 上重新进行更改,只需将新创建的 commit/tag 合并到 master 分支中

      git checkout master
      git merge 1.0.5
      

      【讨论】:

      • master 和 1.0.5 明显不同(v1.0.5 更老)。不会合并尝试合并master上的旧东西吗?或者可能是因为旧的东西比较旧,它不会被合并,只有新的东西会?
      • “旧的东西”应该已经包含在主文件中。还是 master 和 tag 的历史完全脱节?
      • 从我看到的 gitk 来看,v1.0.5 是 master 的祖先。在创建 v.1.0.5 之后,一些拉取请求已被合并
      • 如果它是一个祖先,没有什么能阻止你将它之上的新提交合并到 master 中。
      【解决方案3】:

      因为您正在尝试创建替代历史记录。 Git 创建历史 基于整个存储库的状态,而不仅仅是一个文件。如果你想 对以前的提交进行更改,通常的方法是创建一个分支

      git checkout -b newbranch v1.0.5
      

      在分支上进行更改,然后标记

      git tag 1.0.5
      

      【讨论】:

        猜你喜欢
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 2015-03-25
        • 2021-12-04
        • 1970-01-01
        • 2018-02-02
        相关资源
        最近更新 更多