2017-09-12 103 views
1

我正在寻找一些方法来在我运行某个实验时自动保存我的代码的当前状态。git:在不影响当前分支的情况下将当前代码的状态提交到新分支

但我不想污染我的主分支的提交历史,有一百万个自动提交的提交。我正在考虑制作一个my_experiments分支,我只是在实验运行时推送代码的当前状态。

所以我想我想要的是将我的当前代码提交到experiments分支,而无需将其提交到我当前的分支。我仍然想保留我当前分支上的未提交代码。

什么是最好的方式来做到这一点在混帐?

编辑

我被要求澄清什么,我想,为什么。

有时我会对代码进行更改以测试某些内容。这些变化通常是丑陋的黑客。通常情况下,处理进入:

  • 让哈克变化
  • 运行代码并保存结果
  • CTRL-Z
  • 查看保存的结果

我节省了运行的结果,并我也想保存代码的状态。

现在我想让这些“黑客”更改与我的正常开发周期分开 - 我真的只需要记录下我在做黑客时的代码状态。因此,我不希望在主分支的提交历史记录中出现一系列“使用hack”“revert-hack”对,我只想将所有“hacky”更改提交给一个“实验”分支。

回答

0

只需签出一个临时分支,尽可能多的提交,并且当你有一个可行的代码压缩所有的提交到一个。

git checkout -b my_experiments 
# Do your "experiments" 
git rebase -i branch # <branch> should be the parent branch i.e. develop/master 

Rewriting git history

# For instance 
>>> git rebase -i master 
pick 8705209 first 
edit 7979797 second # Use edit wherever you want to view and edit commit 
squash 9793757 third # Use squash to squash commits into the previous one. 
+0

谢谢,但我永远不想将我的实验提交树合并到我的主树中。我希望“实验”分支纯粹作为实验运行时代码状态的记录而存在。 – Peter

+1

@Peter您对当前分支的提交已经记录了代码的状态。真的,你应该编辑你的问题,并告诉我们为什么你需要这样一个工作流程。 –

+0

嗨,谢谢 - 已完成。我已经更新了这个问题。 – Peter

1

这没有什么错使在你的分支大量提交的是,因为你总是可以壁球下来,在以后,假设你还没有把他们推倒。例如,假设您对您的分支10个的小提交,但你想真的只是把一个单一的逻辑提交,你可以使用重置软:

git reset --soft HEAD~10 
git commit -m 'single commit with all my changes' 
git push origin master 

如果你只是想利用你的分支的快照它的当前状态,你总是可以从HEAD创建一个新的分支,例如

git branch backup_experiment_1 

虽然通常你不需要这个,因为Git即使只有一个分支也是非常灵活的。

+0

谢谢,不知道。虽然不太符合我的要求,因为(1)我想有一个记录所有实验的单独分支 - 不是只在我正在处理的分支上提交提交。 (2)我不想担心每次做“大”提交时必须重置多少次“小”提交。 – Peter

+0

@Peter检查我的更新。 –

+0

'git branch backup_experiment_1'似乎从当前分支的最后一次提交中创建一个分支,这不是我所需要的。我需要将代码的当前状态(包括未提交的更改)提交到“实验”分支,并返回到当前分支,同时将未提交的更改保留为未提交的更改。 – Peter

2

我给出了一个答案,考虑到您已经对当前分支做出了一些更改,并且您希望在另一个分支中提交它们,以保持当前分支与之前的分支相同。

git stash 
git checkout -b <new_branch> 
git stash pop 
git add . 
git commit -m '<Your Commit Message Here>' 
+0

不错,但是当我通过返回到我原来的分支'git checkout -'来追踪我想要的(未添加)更改在那里,而是我已经恢复到最后一次提交 – Peter

+0

我使用了修改后的版本您的答案来解决我的问题,谢谢。 – Peter

+0

很高兴它帮助了我,我正要申请的东西:P。 (y) –

1

我找到了解决办法,我需要(编辑:这是不完全正确,但 - 见注释)是:

git stash 
git checkout -B experiments 
git stash apply 
git diff --name-only --diff-filter=U | xargs git checkout --theirs 
git commit -am 'autocommit' 
git checkout - 
git stash pop 

这里做的事情:

  • git stash复制的临时副本工作代码
  • git checkout -B experiments签出分支实验,如果它不存在,创建它。
  • git stash apply将临时副本粘贴到“实验”分支中。如果您已经运行了这个命令,这将会产生冲突。
  • git diff --name-only --diff-filter=U | xargs git checkout --theirs解决所有冲突赞成粘贴藏匿的(它在有冲突的文件(列表)调用git checkout --theirs X为X
  • git commit -am 'autocommit'这些改动提交实验分支
  • git checkout -恢复到以前的分支。
  • git stash pop

由于粘贴工作代码的临时副本,并从内存中释放保存的副本。到RISHABH Dugar为灵感使用藏匿,并另一种答案通过Charles Bailey:https://stackoverflow.com/a/10874862/851699

请注意,您的当前目录需要成为git仓库的根目录才能生效。

+0

这里有几个注意事项:(1)'git checkout -B experiments'将强制重置任何现有的'experiments'分支以指向当前的提交,即使这意味着忘记了之前的提交(尽管它们仍然会在其中引用日志)。 (2)如果没有东西要隐藏,'git stash'是一个没有操作的东西。然后中间和最后的隐藏操作会失败(隐藏中没有任何内容),或者更糟糕的是,使用*上一个*隐藏。检查是否有东西需要保存可能是明智之举。(3)如果索引中存储了一些更改,而某些更改只存在于工作树中,则可能会变得杂乱无章。 – torek

+0

你说得对。好的,所以这仍然需要一些工作。 – Peter

相关问题