如果任何增量冲突,git pull合并没有文件(需要手动合并)

时间:2013-12-03 18:32:22

标签: git git-merge gerrit

请考虑这种情况:

  1. 我更改了X个文件,推送到Gerrit
  2. Joe更改了Y个文件,其中Z与我的更改集相交
  3. Joe的代码审核获得批准并被合并到远程分支中,我的代码审核阶段将被保留
  4. 因为Joe和我同时更改了Z个文件并且他的更改在我之前得到了批准,所以我必须将我的更改合并到Joe更改的Z文件中
  5. 当我推入Gerrit时,我处于同一个git分支中,因为这是唯一具有我的更改ID的分支,这是git和Gerrit之间的唯一链接(修改我现有的Gerrit评论) ,修改必须在同一个提交内,否则我会建立一个全新的分支,让一切变得更容易,但我不能这样做,因为它没有我的更改ID)
  6. 当我在同一分支中执行git pull时,fetch部分(remote-> local)正常但merge部分(本地分支 - >工作目录)因为需要手动合并的Z文件而失败。 但是,(Y减Z)文件更改不会发生任何冲突。为什么没有把这些文件合并为没有冲突应该停止它?
  7. 我手动合并了Z文件,但现在分阶段的git更改集将它们与Y减去的Z变化混为一谈,我将其与git status中的修改/删除相关联。它们在遥控器上被修改/删除,而不是在本地。如果我进行提交,它们将包含在提交中,而我只想在提交中包含Z文件。所以我不能真正提交,因为如果我这样做,所有的Y文件都会显示并在代码审查时进入代码审查,这会使代码审查变得混乱。
  8. 就像我在上面说的那样,我会通过创建一个全新的分支来解决这个争论但是我不能这样做,因为我不会在那个分支中拥有我的变更ID,我需要挂钩到同一个现有的Gerrit门票

    主要的两个问题是:

    Q1。如何/可以让git在git pull的合并阶段合并未冲突的文件,同时让冲突的文件手动解析?这样,一旦完成手动合并,您就可以使用远程的最新版本进行构建,以确保在进行任何本地提交之前都可以构建。在我看来,这是git的一个根本缺陷(除非我做错了,例如我的git pull没有使用某些选项)

    Q2。有没有办法使用与最初用于创建审核的提交/更改ID不同的现有Gerrit审核(修改)?到目前为止,我能够在内部以及在互联网上获得这个问题的唯一答案是否定的,但对我来说这似乎是另一个主要的缺陷。因为如上所述,Gerrit约束限制了您使用git的最强功能,即使本地分支(您没有该更改ID)很容易。

2 个答案:

答案 0 :(得分:1)

要使用上游更改更新本地分支,请重新提交您的提交,不要合并。 git pull有一个--rebase选项供您使用(您可以更改.gitconfig以使其成为默认选项)。合并创建了一个无用的合并提交,必须进行审核,这没有任何意义 - 您在#7中注意到了这一点。

Q1。这是一种误解。 Git将合并它可以的所有文件,但请求您帮助解决冲突。我不知道是什么让你得出这些文件没有被触及的结论。

Q2。您似乎正在混淆提交ID和更改ID。如果修改提交(即使您实际上没有对文件内容或提交消息进行更改),则提交ID会更改,而更改ID是提交消息页脚中的Gerrit特定标识符。 Gerrit使用它来连接具有不同ID(SHA-1)的提交以及Gerrit中的更改。如果由于某种原因,当您想要为更改上传新的补丁集时无法修改原始提交,您只需将Change-Id页脚添加到您想要推送的任何提交中。

答案 1 :(得分:1)

一旦推送更改分支it can be fetched并进行修改而不需要原始的本地提交。 因此,在FETCH_HEAD分支上,您可以合并/重新绑定远程分支,修改它,并作为新的补丁集推送。这就对了。因此,所有提交在Gerrit上都有唯一的分支。我认为用新的changeId推动修改后的提交毫无意义。这意味着应放弃原来的。有了这种技术,代码可以与每个人共享并由每个人修改,而无需将代码提交给远程分支。