Git保持一些局部变化,但不要推动它们

时间:2017-08-01 09:39:44

标签: git git-merge git-stash

我正在计算机上的develop分支上工作。我做了很多我不想推动的改变,但我想保留它们。 我所做的是改变我的项目上的翻译行为,我想在推送它并将其部署到生产之前再测试一下。 但我想继续致力于开发或任何其他分支机构,并能够应用这些变化。

我想出了一些想法:

  1. 保留所有这些文件(不要git-add)并只提交我实际想要提交的文件。但这个解决方案使我的#git status"非常混乱(许多修改过的文件),我相信它会产生错误并导致提交错误的文件。

  2. Git stash save"翻译"并在我想使用它时应用它。但是我会有一个混乱的git状态同样的问题,我将不得不选择我想要提交的文件中的哪一个。

  3. 使用我的新功能创建一个新分支,但只要我将它合并到我的工作分支,我将同时提交合并

  4. 您是否知道任何其他工作流程以保留大量文件的更改列表并应用/删除这些更改?

6 个答案:

答案 0 :(得分:0)

git-flowgitlab-flow这样的东西很适合。

根据我的阅读,我可以得出结论,您的项目包含2个模块,您可以修改它们。

一个模块是稳定的,但无论如何你已经对它进行了修改,并希望更彻底地测试你的修改,另一个模块正在进行中。

我会使用您的第三个变体,但将您的工作分支合并到您的新功能分支。

或者,如果您想将修改分离为“稳定”模块,可以将它们保存在单独的分支中。

也就是说,你得到3个分支:

  • 您的“不稳定”模块,“稳定”模块的工作,没有您最新的 变化;
  • 您对“稳定”模块的修改;
  • 上面两个合并

使用git进行分支既便宜又简单,您可以创建任意数量的分支。

答案 1 :(得分:0)

您可以将主要的本地分支rebase放到跟踪远端分支的中间分支上。然后,您通过cherry-pick报告您从主要本地分支到跟踪的提交,然后将您的主本地重新绑定到更新的跟踪分支。

答案 2 :(得分:0)

将本地未完成的工作保留在单独的分支上并推送它。

  1. 它允许你正确地进行提交,而不是在最后做一个巨大的怪物提交。
  2. 它允许您在服务器上获得代码的副本,以便在发生磁盘崩溃或类似情况时,您不会丢失工作。
  3. 在部署到生产环境之前,它将允许其他人查看您的代码并进行审核。
  4. 部署通常发生在一个分支上。只要您不将更改合并到该分支中(尽管您需要在您的位置验证这一点),您就是安全的。

答案 3 :(得分:0)

我会建议另一个想法。

  1. 创建不同的提交

  2. 仅推送特定提交给主人

  3. 在需要时推送另一个提交,以便您的git状态不会变得混乱。(my $FROMduplicate=""; my $JOINduplicate=""; foreach my $Statement (@FileStatements) { if ($Statement!~m/create/i) { next; } if ($Statement=~m/create user |^GRANT |^spool /gim) { next; } my $name=""; my $type=""; my $content="";#FileStatements my @parents=(); my @children=(); my $duplicate=""; # print $Statement."\n"; #NAME-------------------------------------------- my $catch = (split(/ view | trigger | table | synonym | procedure | role /i, $Statement))[1]; $catch =~ s/^\s+//; $name = (split(/\s+/, $catch))[0]; if ($name=~m/undef/gi){next;} #DEBUG #print "$name\n"; #TYPE-------------------------------------------- if( $Statement=~m/^create or replace \w+ /i) { my $tmp = (split(/ replace /i, $Statement))[1]; $tmp =~ s/^\s+//; $type = (split(/\s+/, $tmp))[0]; } else{ my $tmp = (split(/^create /i, $Statement))[1]; $tmp =~ s/^\s+//; $type = (split(/\s+/, $tmp))[0]; } if ($type=~m/undef| undef |\s+undef\s+|\s+undef,/) { next; } #print "$type\n"; #CONTENT----------------------------------------- #PARENTS----------------------------------------- my @froms = split(/ from\s+/i, $Statement); my @joins = split(/ join /i, $Statement); foreach my $i (1..@froms-1) { #print Writer1 "$froms[$i]"."\n\n"; my $from = (split(/ where |select | left | left | right | as /i, $froms[$i])) [0]; $from=~s/^\s+//; $from=~s/\(+//; my @Spaces = split(/, | , /,$from); foreach my $x (0..@Spaces-1) { my $SpaceFrom = (split(/ /,$Spaces[$x])) [0]; $SpaceFrom=~s/;//; $SpaceFrom=~s/\)+//; # print Writer1 $SpaceFrom."\n\n"; if ($SpaceFrom eq $FROMduplicate) { next; } push(@parents,$SpaceFrom); $FROMduplicate=$SpaceFrom; } } foreach my $x (1..@joins-1){ #print "$joins[$i]"."\n\n"; my $join = (split(/ on /i,$joins[$x])) [0]; $join = (split(/ /i,$joins[$x])) [0]; #print Writer "\n\n".$join."\n\n"; if ($join eq $JOINduplicate) { next; } push(@parents,$join); $JOINduplicate=$join; } @parents = do { my %seen; grep { !$seen{$_}++ } @parents }; #check hash for existence if(exists$hashmap{$name}){ push(@{$hashmap[3]},@parents); push(@{$hashmap[0]},$name); push(@{$hashmap[1]},$type); push(@{$hashmap[2]},$Statement); } my @hashvalues=($name,$type,$Statement,\@parents,\@children); $hashmap{$name}=\@hashvalues; # push(@children,$hashmap{$name}) if( exists$hashmap{$name}) } }

  4. 此处已说明该程序:

    How can I push a specific commit to a remote, and not previous commits?

    how do you push only some of your local git commits?

答案 4 :(得分:0)

选择第3个选项,为您的功能创建一个新分支。

在您准备好之前,您不必将其合并到开发中 - 将 develop 合并到功能中,只要您想要测试更改。

  • 开发清洁开发代码:查看开发。
  • 要处理新的翻译代码:检查功能并合并来自develop的最新更改。
  • 功能完成后:最后一次合并开发成功能(如果它还没有更新),然后检查开发和合并功能。

答案 5 :(得分:0)

我使用的一个解决方案是拥有第二个远程存储库,其中包含我不想在第一个存储库中使用的分支和提交。

您必须小心确保将其推送到正确的存储库,但这听起来确实可以满足您的情况的需求。