什么';It’这是最好的方式;“临时”;用git提交?

什么';It’这是最好的方式;“临时”;用git提交?,git,temporary,Git,Temporary,假设我有一个有两个分支master和dev的项目。我在dev上有一系列提交,用于一个特殊事件,这些事件一旦被测试,就会合并到master中。然后在事件结束后,我想删除特定于事件的代码。但是,由于在添加事件代码后进行了其他提交,git重置将无法完成 目前,我使用git checkout签出事件合并之前的文件,然后使用git diff重新添加自事件提交以来所做的更改。对我来说,这似乎是一个非常混乱的方法 在项目中使用临时代码有更好的解决方案吗 编辑: 要清除更改,需要提交、推送、取消提交、推送。我相

假设我有一个有两个分支master和dev的项目。我在dev上有一系列提交,用于一个特殊事件,这些事件一旦被测试,就会合并到master中。然后在事件结束后,我想删除特定于事件的代码。但是,由于在添加事件代码后进行了其他提交,git重置将无法完成

目前,我使用git checkout签出事件合并之前的文件,然后使用git diff重新添加自事件提交以来所做的更改。对我来说,这似乎是一个非常混乱的方法

在项目中使用临时代码有更好的解决方案吗

编辑:
要清除更改,需要提交、推送、取消提交、推送。

我相信您会做您想做的。

获取master并创建一个分支:
git checkout-b特殊事件
,进行/应用您的更改。事件结束后,只需切换回master并放弃/删除分支

为了继续进行更改,请在master上进行更改,并在执行时将其合并到特殊分支中<代码>git签出主机。。。做出改变<代码>git签出特殊事件;git合并主机


或者,在一次提交中进行所有与事件相关的特殊更改,然后在要将其推出并仅指定该提交时使用
git revert

git checkout-b event

…进行特定事件更改

git提交-am“特定事件更改”

…进行另一个特定事件更改

git commit-am“另一个特定事件更改”

此时,分支仍然完好无损,特定于事件的更改位于事件分支上。如果对主分支进行了事件中也需要的更改分支,请使用rebase

git重新基址主机

另一个答案建议将master合并到event中,但重基通常是更好的方法。重基剥离主题分支上的提交,向前拉更新的主文件,然后在顶部重新应用主题分支更改…就好像主题分支更改是对最新版本的主文件所做的一样

在您的场景中,当事件结束时,只需删除事件分支。

git revert


它将删除您需要撤消的任何提交或提交范围。推动公开回购也是安全的。

按照我的非专利方法汇总您的承诺:

# work on a new branch
git checkout -b event-36
git commit -a -m "all broken dammit"
git commit -a -m "fixed that damn code"
git commit -a -m "almost ready, going to eat lunch"
git commit -a -m "It's done!"

# other people might be working on master in the meantime, so
git checkout master
git checkout -b erasemeImmediately
git merge event-36
git reset --soft master # THE KEY TO THE WHOLE THING: SOFT RESET!
git commit -a -m "Event 36, all code in one commit"

git checkout master
git merge erasemeImmediately
您可以使用
reflog
来实现这一点,但是您需要一个最新的CS学位(即,很难理解)

现在您的提交是一个单一的。现在,您可以使用revert或do-cherry选择不使用它的分支。

“临时代码”?在git中,我们使用分支来实现这一点。在git中,提交是非常轻量级的,分支只是提交的名称(或引用),附加了一点点逻辑,与其他系统相比是超轻量级的

一点逻辑就是引用自动更新到最后一次提交。这几乎就是分支的全部含义。这意味着在git中创建和销毁分支是快速、简单甚至安全的,因为实际上没有创建或删除任何分支。删除之后,您仍然可以通过提交id引用分支头(是的,在垃圾回收之前它仍然存在,即使只有在没有其他引用的情况下才会发生)

git中几乎每个命令都将对提交的引用作为参数。git merge也是如此。您不是在合并分支,而是在合并提交。是的,您可以键入“git merge”,但分支只是提交的名称。仅此而已。由于您只需要将事件的提交分组在一起,只需给它们一个名称即可

因此,正确的做法是为事件创建一个分支。或者可能有两个:“事件主机”和“事件开发”。现在,您可以在“event dev”中为事件开发代码。如果您遇到需要在主代码中修复的bug,请隐藏并切换到正常的“dev”分支,编写修复代码并提交。切换回'event dev',从'dev'合并,并弹出隐藏。继续开发,一旦完成,提交和测试。如果可以,将“事件开发”合并到“事件主机”中。这也将包含修复。请注意,修复程序尚未处于“主”状态

如果需要将修复程序合并到“master”中,只需按照通常的方式进行,因为修复程序位于“dev”中

基本上,在此设置中,您可以:

  • 像往常一样开发主代码:您提交“dev”,测试,并合并到“master”中

  • 以类似的方式开发特定于事件的代码:您提交到“事件开发”,测试,并合并到“事件主机”中;这只是相同的工作流程

  • 混合这两种工作流程;提交并切换分支,或使用git stash

  • (几乎)自由地合并分支;您可以将“master”合并到“event dev”中,前提是master以某种方式更新,并且您需要对事件进行更改;如果您迫切需要对事件进行更改,并且不能等待通常的测试周期将其推送到“主”中,则可以将“dev”合并到“event dev”中。只要合并是干净的,git就会这样做,也就是说,除非您在两个开发分支中以两种不同的方式更改同一段代码(这当然是需要处理的特殊情况)

如果您需要额外的灵活性,请创建更多分支。为了获得超级灵活性,您可以将单个提交挑选到分支中,但通常我建议不要这样做(只有在您真正知道自己在做什么的情况下才这样做)

最后,我应该指出,这个工作流在git中非常自然。实际上,一般来说,在“dev”中开发并在“master”中进行更改甚至不是最好的。通常为每个特性或modu创建一个开发分支