是否可以在分支之间移动文件或文件更改?

时间:2016-10-19 06:16:55

标签: git

摘要:我忘了在开发时切换分支,并希望将文件/更改移动到相应的分支。

详细信息:我有两个文件AB,最初位于master。然后,我创建了一个分支branch1,以便在文件A中进行一些重大更改。

在开发这些更改时,我还修改了B并创建了一个文件C。问题是我现在意识到我在分支方面犯了一个错误

  • 文件B应该在自己的branch2中(不存在),
  • 档案C属于master

现在所有这些都已在branch1中提交。

提交被推送到远程存储库但是没那么重要,我可以让其他开发人员克隆repo(而不是fetch)。

在这种情况下恢复的一般方法是什么,即。在分支机构之间移动文件或更改?

4 个答案:

答案 0 :(得分:2)

一个简单的解决方案就是branch1

  • 创建branch2(git checkout -b branch2),然后移除C。添加,提交和推送
  • 回到主人(git checkout master)和copy C from branch1git show branch1:path/to/C >path/to/C)。添加,提交和推送。
  • 最后,回到branch1,删除额外的文件,添加,提交和推送。

这样,没有合并,没有历史重写,甚至没有恢复,只是一些额外的提交推送到远程清理当前的情况。

答案 1 :(得分:0)

我想您将要使用以下命令查看git日志:

sudo git log

然后,您将需要签出/恢复先前提交的哈希值,该提交已在您编辑文件但未编译其他文件的位置完成,这是您在branch2中所需的内容。要签出/恢复旧提交,请使用以下命令:

sudo git revert THELONGNUMERICHASHCODEGOESHERE

E,G。 sudo git revert 102b78f76dcf2302345570b4f738b28700266f87

在签出了您想要的提交后,您可以使用以下命令将分支分支到所需的新分支:

sudo git checkout -b branch2

转到文件C,这个可能很棘手但你可以尝试:

  1. 切换回主人:sudo git checkout master
  2. 签出一个新的安全分支,例如:sudo git checkout master-2
  3. branch1合并到master-2。在master-2运行时sudo git merge branch1
  4. 解决列出的任何文件中的冲突(如果有)。不要跳过任何一个。然后添加并提交该分支,而不是推送。
  5. 现在,master-2将对其进行所有更改。如果你想要你可以将它合并到master中,但你提到文件B需要是一个较旧的文件,所以我认为合并到master并不准备。
  6. 您需要结帐branch1:sudo git checkout branch1
  7. 使用B
  8. 使用正确的文件sudo git log查找上一次提交
  9. 使用git revert检查上面提到的旧提交。找到所需内容后,使用以下内容检查该分支:sudo git checkout branch-fileb
  10. 在新创建的分支上触摸(添加额外的行,因为触摸可能不会向git注册)文件B.添加并提交更改/触摸。
  11. 仍然在分支branch-fileb上,使用sudo git merge branch1
  12. 在branch1中合并
  13. 解决冲突,您应该拥有所需的正确A,B和C文件。
  14. 使用:branch-fileb
  15. 合并母版以便在分支sudo git merge master上进行准备
  16. 解决所有冲突。
  17. 切换回分支master,然后使用以下代码branch-fileb合并sudo git merge branch-fileb
  18. 分支应该都是你现在想要的。

    对于良好的内务删除和本地未使用的分支和任何未使用的远程分支。

答案 2 :(得分:0)

  • 你可以选择从一个分支到另一个分支的提交(我不知道你的提交的结构,如果C文件在一个提交中而在另一个分支中改变了B)。将提交的SHA1哈希码,checkout复制到需要进行更改的分支和
git cherry-pick <SHA1_hash>
  • 另一种选择是制作补丁
git diff <starting_commit_hash> <ending_commit_hash> > changes.patch
git checkout <branch>
git apply --check changes.patch
git apply -p1 < changes.patch
rm changes.patch
  • 如果您想要特定文件的差异,那么
git diff <starting_SHA1_hash> <ending_SHA1_hash> -- path/file > changes.patch
  • 如果您有一些图像或其他基本上是二进制文件的文件
git diff --full-index --binary <starting_SHA1_hash> <ending_SHA1_hash> > changes.patch
    1. 从master创建branch2并使用文件B的补丁来应用它
    1. 如果您的提交是脏的(从文件A,B,C更改),那么您需要从master创建新分支并将A文件的更改应用于它。
      • 如果您的提交是渐进的,那么您可以进行交互式rebase并省略不需要的提交(如果您将此分支推送到远程而不是它重写历史记录),或者甚至还原它们(但是然后记录并不是这样)。一些美女)
    1. 将文件C的修补程序应用于主文件
    1. 如果所有更改都应用于正确的分支,请在启动分支上执行硬重置,以提交表示所需状态或删除它
git reset --hard <SHA1_hash> or git branch -D <branch>

答案 3 :(得分:0)

当我遇到这种情况时,我通常会使用存储来移动分支周围的变化。假设你没有做任何事情:

  • 仅向其所属的分支机构添加并提交A
  • git stash,或git stash save 'useful message to remember what I was doing'保存更改
  • git checkout -b branch2
  • git stash apply将您的更改应用于B
  • 添加并提交B
  • git checkout master
  • 添加文件C,除非有另一个名为C的文件,否则在执行这些命令时该文件不应更改或移动。

既然你已经提交了所有内容,我只是建议你撤消它;除非你与别人分享你的工作,否则这不应该成为问题。

git reset HEAD^

应该执行此操作,将文件留给您,好像他们没有被提交到分支机构一样。您现在可以执行上述操作。

如果您已经与世界其他地方分享了您的工作,我不会改变历史记录,除非您可以协调所有人来检索您的更改。