git:将当前代码的状态提交到新分支而不影响当前分支

时间:2017-09-12 09:13:43

标签: git

我正在寻找一些方法来在我运行某些实验时自动保存代码的当前状态。

但是我不想用一百万个自动提交来污染我的主分支的提交历史。我正在考虑创建一个my_experiments分支,我只需在实验运行时按下代码的当前状态。

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

在git中最好的方法是什么?

修改

我被要求澄清我想要的和为什么。

有时我会对代码进行更改以测试某些内容。这些变化通常是丑陋的黑客攻击。通常,过程如下:

  • 进行hacky change
  • 运行代码并保存结果
  • CTRL-Z
  • 查看已保存的结果

我正在保存运行的结果,我还想保存代码的状态。

现在我想要这些" hack"更改与我的正常开发周期分开 - 我真的只需要在进行黑客攻击时记录代码的状态。因此,而不是有一系列"制造黑客" "回复-劈"在我的主要分支的提交历史中,我希望拥有所有" hacky"改变只发生在一个"实验"科。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

在您的分支上进行大量提交没有任何问题,因为您可以随时将它们压缩,假设您尚未推送它们。例如,假设您在分支上进行了10次小型提交,但是您只想推送单个逻辑提交,则可以使用reset soft:

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也非常灵活。

答案 2 :(得分: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将临时副本粘贴到&#34;实验&#34;科。如果您已经运行此命令,则会产生冲突。
  • git diff --name-only --diff-filter=U | xargs git checkout --theirs解决所有有利于粘贴存储的冲突(它在X中调用git checkout --theirs X(冲突文件列表)
  • git commit -am 'autocommit'将这些更改提交给实验分支
  • git checkout -返回上一个分支。
  • git stash pop粘贴工作代码的临时副本,并从内存中释放已保存的副本。

感谢Rishabh Dugar使用藏匿的灵感,以及Charles Bailey的另一个答案:https://stackoverflow.com/a/10874862/851699

请注意,您当前的目录必须是git repo的根目录才能实现。

答案 3 :(得分: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.