5

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

我在 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包含 v1.0.5 的确切内容以及更改的标签的方式推送存储库。必须将标签推送到远程。

然后,结帐master,再次更改文件并再次将其推送给master。

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

4

3 回答 3

11

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

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
于 2013-05-01T19:57:16.303 回答
5

当您签出标签时,您会自动进入“分离 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
于 2013-05-01T18:48:49.630 回答
2

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

git checkout -b newbranch v1.0.5

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

git tag 1.0.5
于 2013-05-01T18:42:57.777 回答