不知何故,我弄乱了我们的主分支以及我曾经搞乱主分支的功能分支。现在我正试图解决它,但遇到了麻烦。对于它的价值,我已经确定了我需要在主分支和功能分支中“回滚”的提交,所以我相信原始问题已被删除。
问题:当我将功能分支合并到主服务器时,似乎自动合并是删除功能分支中的一些代码而不是将其合并到主服务器中。它没有给我机会将其解决为合并冲突......它只是不会将这些代码片段移到master中。
HACK:我发现,如果我进入功能分支中的一个受影响的脚本(account / views.py)并删除了一个空格或某些内容,那么它会迫使我将其解决为冲突,我可以然后告诉Git保留我需要保留的代码。当然,我想,对于所有受影响的脚本,我可以这样做,但如果有更优雅的方法使用Git处理它,我宁愿不做“黑客”。
我已经完成了git diff feature-branch
命令并将结果复制到文本文档中,因此我可以通过它来确定所有需要上述“黑客处理”的内容,但它很大。
我不确定是否有任何屏幕截图类型的信息可以提供帮助,因此不包括任何信息。请告诉我所需的任何有用信息,我将为其提供一个编辑。
非常感谢任何帮助。
在合并过程中显示终端命令: **坐在“主”分支上......这是在对apps / account / views.py进行“黑客攻击”后显示的内容
kedmiston:ahnew kedmiston$ git merge ftr_refer
Auto-merging apps/ajax/views.py
CONFLICT (content): Merge conflict in apps/ajax/views.py
Auto-merging apps/account/views.py
CONFLICT (content): Merge conflict in apps/account/views.py
CONFLICT (modify/delete): apps/account/templates/account/refer-success.html deleted in HEAD and modified in ftr_refer. Version ftr_refer of apps/account/templates/account/refer-success.html left in tree.
CONFLICT (modify/delete): apps/account/templates/account/refer-a-friend.html deleted in HEAD and modified in ftr_refer. Version ftr_refer of apps/account/templates/account/refer-a-friend.html left in tree.
Auto-merging ahnew/urls.py
CONFLICT (content): Merge conflict in ahnew/urls.py
Automatic merge failed; fix conflicts and then commit the result.
kedmiston:ahnew kedmiston$ git mergetool
最新的想法/怀疑......是从功能分支(ftr_refer)到master的合并中丢失的是来自ftr_refer历史记录中的提交,这些提交是在我提交的主提交日期之前做出的试图合并到。也就是说,我想知道我是否要在7月下旬将master转回日期,将ftr_refer合并到它中,是否允许ftr_refer更改正确或不正确掌握?然后,如果是这样的话,我怎么能重新应用提交/合并到主服务器,以使其恢复当前状态?
附上了来自ftr_refer(1)的git log
命令的一些屏幕截图:
和主人(4):
答案 0 :(得分:8)
这不是一个解释,而是一些解释,但它比评论允许的时间更长。
无论何时进行合并,您都希望加入历史的两个部分。合并,BASE,REMOTE,LOCAL时总是有3个魔术值。如果您要git checkout master
后跟git merge ftr_refer
,那么这三个魔术值将设置如下
BASE=$(git merge-base master ftr_refer)
LOCAL=master
REMOTE=ftr_refer
您要合并的更改集表示为
git log ^${BASE} master # changes on master only
git log ^${BASE} ftr_refer # changes on ftr_refer only
Git通过
提供了快捷方式git log ftr_refer..master # changes on master only
git log master..ftr_refer # changes on feature refer only
想象一下,您在BASE版本中有一个1000行长的views.py版本。在大师有人去,并删除前500行。在ftr_refer中,其他人去修改900-1000行。当你将它们合并在一起时,Git将结合这两个变化。所以你最终会得到一个缺少前500行的合并views.py,并修改了400-500行。 Git不会告诉你这是合并冲突或要求任何帮助来解决这个问题。现在,如果您修改了前500行中的一行 - 那么是的,您会发生冲突(如您所发现的那样)。
听起来好像有人在主人上删除了一些更改,你不希望这些更改在你的最终结果中。通常,我不建议在合并期间处理此问题。也许您希望还原这些更改。但是,如果仅需要将这些更改与ftr_refer的更改结合使用,那么您可以通过几种方法来处理它。
首先确定哪些提交正在触及该文件。你可以做
git log ftr_refer..master -- account/views.py
或者您可以查看所有提交并列出文件更改
git log --name-only ftr_refer..master
这应该显示哪些提交删除了这些行。也许请咨询该提交的作者。真的应该删除这些行。也许它们很糟糕,应该归还。如果我们假设这些行只是不需要存在ftr_refer更改那么你就有麻烦了。你可以解决的一种方法是:
将master合并为一次提交一个提交。而不是
git checkout ftr_refer
git merge master
你会做
git checkout ftr_refer
git rev-list --reverse ftr_refer..master # this will list out a bunch of shas
按顺序处理SHA。对于您想要保留更改的任何SHA,
git merge SHA
对于您不希望进行更改的任何SHA
git merge -s=ours SHA
这将为SHA创建合并历史记录而不包含更改。
这仅适用于基于每个SHA的全部或全部方法。如果只有一个SHA并且你想要改变foo而不是bar,那么这将不起作用。您必须手动完成这些操作。
至于你的具体想法“我要把大师回到9月下旬的日期” - 一般来说使用日期在这里不会有用。