如何在Git中合并之前重新定义单个文件?

时间:2016-08-17 01:11:27

标签: git version-control git-merge

所以这是一个我们不时在一个拥有大量开发人员的公司中遇到的问题:有一个拉特请求要在开发分支中合并一个功能分支。在进行代码审查时,我们注意到某些文件不应该合并,因为这些文件的旧版本错误地进行了更改,现在不需要这些文件。还有其他不同的场景我们需要排除某些文件被合并以及我们想要使用develop分支中的文件丢弃或重新定义的更改。似乎没有简单的方法可以做到这一点,我试图从功能分支创建一个新的分支和樱桃选择,但即使这个功能分支太大也不容易。

有没有简单的方法可以使用开发中的文件重置单个文件并放弃这些更改?

1 个答案:

答案 0 :(得分:1)

基本上有两种方法可以解决这个问题。哪一个是最好的取决于您的工作流程,所以我将解释它们:

添加更多提交还原更改

您可以在分支顶部添加一个或多个提交,撤消所有不要合并的更改。在这种情况下,您可能希望开始将更改从开发分支合并到功能分支以使用最新版本。

当您特别要求排除完整文件时,可以使用以下命令将文件重置为开发版本:

git checkout develop -- path/to/file

这会将文件版本从develop放入索引中。使用git diff --cached查看更改内容,如果您希望进行这些更改,可以提交或根据需要对其进行调整。

这种删除更改的方式将保留功能分支中发生的事件的历史记录。如果您在以后的提交中记录了该决定,那么理解为什么您没有按照最初计划执行的操作会有所帮助。

重新定位功能分支

您还可以通过更改其历史记录来修复功能分支。注意:如果分支已与其他人共享,则更改分支的历史记录不是一个好主意。当旧版本和新版本的分支合并时,git不会识别它之前是相同的,并且您将获得两个版本的混合。如果这样做,您需要确保丢弃旧版本的分支。

第一种情况下合并开发的类比将是(当你的功能分支被检出时)

git rebase develop

这类似于创建新分支并cherry-pick来自功能分支的所有提交。如果发生冲突,系统将提示您解决冲突。

之后,您可能需要编辑一些提交以删除功能分支中不需要的更改。 一种方法是交互式变基。如果执行git rebase -i develop,您将获得功能分支中所有提交的列表,前缀为“选择”。这意味着此提交按原样使用。对于要更改的提交,您可以将“选择”更改为“编辑”。然后,Git将逐个应用一个提交,并在应用您想要编辑的提交之前停止。您现在可以调整此提交的更改,提交它们(将提供原始消息)并继续使用git rebase --continue进行变基。

如果你现在要改变什么,你也可以从git rebase -i develop开始,将两个步骤合二为一。

还有很多方法可以改变你的历史。例如。您可能希望查看--fixup的{​​{1}}选项和git commit的{​​{1}}选项,这样您就可以添加修复旧版提交的新提交并自动联合它们。