我觉得我应该知道这一点,但我感到困惑。
我在github上分叉了一个存储库。我需要的是签出一个标签(称为“v1.0.5”),修改文件上的语句,用一个名为“1.0.5”的新标签(没有“v”)重新标记该状态,然后执行对主人的改变也是如此。
让我更清楚。我正在将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的完全内容,加上变化。必须将标签推到远程。
然后,结帐主人,再次更改文件并再次将其推送到主人。
结账时v1.0.5我很失落,而且我处于分离的HEAD状态。提交后,我在哪里推动修改?我如何标记它们并将标签推送到远程?
答案 0 :(得分:8)
首先,使用原始标签结帐:
git checkout v1.0.5
这将使您处于分离的HEAD状态 - 您的提交将不会特别转到任何分支。这听起来像你想要的!
现在,进行更改,暂存和提交。
git commit -a -m "Commit message"
你仍然处于分离的HEAD状态,但是你正处于一个新的提交 - 同时具有你想要的变化和历史记录。标记它!
git tag 1.0.5
要回到遥控器(假设你的仍然是命名原点):
git push origin 1.0.5
这将推送标签本身(1.0.5)以及它指向的所有必要的提交历史记录。
请注意,您的更改不会包含在其他之外的任何位置。根据您的问题,我认为这是您想要的,但如果您做需要合并回主人,您可以按照以下步骤操作:
git checkout master
git merge 1.0.5
答案 1 :(得分:4)
签出代码时,您会自动进入“分离的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
答案 2 :(得分:2)
因为您正在尝试创建备用历史记录。 Git创造了历史 基于整个存储库的状态,而不仅仅是一个文件。如果你想 更改先前的提交正常方法是创建分支
git checkout -b newbranch v1.0.5
在分支上进行更改,然后标记
git tag 1.0.5