搞砸了项目目录;我们会变质吗?

时间:2016-09-19 20:14:56

标签: git

我和我的伙伴正在开展一个团队项目。 我们的项目目录应该如下所示:

   PERSON
  __|____________________
  |                     |
  INSERT_PERSON     DELETE_PERSON

Where" Person"是一个相关功能的文件夹和" Insert_Person"和" Delete_Person"是代码的文件夹。我重新推动并推动了#34; Insert_Person"稳定,然后我的伙伴重新定位" Delete_Person"但尚未推出它。 我们意识到忘记了父文件夹," Person"。

  |                     |
  INSERT_PERSON     DELETE_PERSON

我们如何在此处放置Parent文件夹?在他推动之前他可以把它放进去吗?我需要撤消我的rebase吗?

这个问题复杂化,因为我们都不知道如何可视化rebase。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您有两种选择:简单解决方案和重写历史解决方案。

简单解决方案

最简单的解决方案就是按照您的意愿继续,并在事后解决问题。在您的合作伙伴合并"删除人员"分支,你可以这样做:

git checkout master # or whatever your stable branch is
git pull
mkdir PERSON
git mv INSERT_PERSON PERSON/
git mv DELETE_PERSON PERSON/
git commit -m "Fix folder structure"
git push

这将创建一个新的提交,将两个文件夹移动到公共文件夹中。这不应该导致任何问题,因为即使跨文件重命名,Git通常也非常适合跟踪更改。

重写历史

您可能更愿意不创建额外提交,并且您可能希望您的历史记录看起来像您从未犯过错误。有了Git,你也可以这样做。

首先,做:

git log --all --oneline --graph --decorate

这会给你一些看起来像这样的输出:

* eba40bf (delete-person) Improve error checking
* 18d630d Implement main delete person functionality
*   ffdf79f (HEAD, master) Merge branch 'insert-person'
|\  
| * d0b6dbb Add more features for person inserting
| * 95312ee Implement main insert person functionality
|/  
* a65c0f4 ...

如果您已经删除了插入分支,则需要撤消该分支。为此,请查找插入分支的最后一次提交,在本例中为d0b6dbb。然后做:

git branch insert-person d0b6dbb

接下来,重置master,并启动insert-person的交互式rebase:

git checkout master
git reset --hard HEAD^
git checkout insert-person
git rebase -i master

将第一次提交从pick更改为edit,因此您的rebase-todo文件看起来像这样:

edit 95312ee Implement main insert person functionality
pick d0b6dbb Add more features for person inserting

然后修复文件夹结构并继续使用rebase:

mkdir PERSON
git mv INSERT_PERSON PERSON/
git commit --amend
git rebase --continue

此时,Git非常聪明,它应该应用所有其他提交而不会出现问题,并且任何其他更改都应该应用于正确文件夹中的新位置。

然后你可以合并:

git checkout master
git merge --no-ff insert-person

如果delete-person分支还没有被重新定位,那么你可以为它做同样的事情。但是,由于它已被重新定位,因此您必须这样做:

git rebase -i --onto master ffdf79f delete-person

然后继续使用之前的rebase。

这将为您提供一个漂亮的干净历史记录,它看起来好像文件夹结构从一开始就是正确的。

*   0aa9452 (HEAD, master) Merge branch 'delete-person'
|\  
| * ebcbf01 (delete-person) Improve error checking
| * 1a6ae32 Implement main delete person functionality
|/  
*   8591d39 Merge branch 'insert-person'
|\  
| * ca85ff3 (insert-person) Add more features for person inserting
| * 790f60f Implement main insert person functionality
|/  
* a65c0f4 ...

对于Git来说,很难弄得太糟糕,以至于你丢失了数据,特别是在你自己拥有多个repo副本的情况下。因此,只要您远离--force / -f等论点,那么可以尝试使用不同的解决方案来查看您更喜欢的内容。