首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在git重基期间解决冲突时从一个分支中选择文件?

如何在git重基期间解决冲突时从一个分支中选择文件?
EN

Stack Overflow用户
提问于 2014-01-31 21:43:10
回答 3查看 4.4K关注 0票数 16

masterfeature两个分支的git回购。当使用rebase master将特性分支重新定位在主服务器上时,让我们假设文件a.txt包含需要解决的冲突,然后才能继续重基。

我知道我可以分三步解决冲突:

  1. 在编辑器中打开a.txt手动解决冲突
  2. 打电话给git add a.txt告诉git我已经手动解决了冲突
  3. 调用git rebase --continue将重基向前移动

是否有一种方法可以避免步骤1:告诉git我希望从主分支获得文件的版本,或者不需要执行上面的步骤1和步骤2就可以从特性分支获得文件的版本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-31 22:09:49

是。事实上,有不止一种方法可以做到这一点。

重基和合并(和樱桃-挑选)命令都使用相同的strategy-X标志传递给底层的git机器。对于recursive策略,-Xours-Xtheirs在两个分支中修改的文件被合并的情况下,选择文件的一个或另一个“边”。

或者--这是完全不同的--在合并因冲突而停止的情况下,您可以使用git checkout--ours--theirs标志,从一边或另一边选择版本。(您可以使用其他命令来完成此操作;在这里,我将继续使用--ours--theirs,因为它们将参数与使用合并机制的命令相匹配。)

当然,这是不同的,因为您可以切换选项:

代码语言:javascript
复制
$ git checkout main
Switched to branch 'main'
$ git merge branch
... conflicts in files A and B ...
$ git checkout --ours -- A    # takes main:A
$ git checkout --theirs -- B  # takes branch:B

请注意,这与“我们的策略”非常不同(上面显示的是“带有recursive策略的ours选项”)。有了“我们的战略”,就发生了完全不同的事情。让我们开始不使用它,再次执行相同的合并:

代码语言:javascript
复制
$ git checkout main && git merge branch
... conflicts ...
$ git checkout --ours -- A B  # take main:A and main:B

假设有第三个文件,C,git可以自己合并。当您完成上述操作时,git合并C,然后使用main:Amain:B。但是,如果要使用git merge --strategy=ours branch,则git将使用main:Amain:Bmain:C。它将放弃branch:C更改,而不是自动合并它们。

我在上面使用了git merge,因为它使“我们的”和“他们的”东西“正常工作”。不过,我不喜欢git给它们命名的方式,因为当您重新定位时,我们/他们的版本会被替换,因为重基的工作方式是切换到“其他”分支,并进行一系列的樱桃挑选。这就是:

代码语言:javascript
复制
$ git checkout mine; git rebase theirs

通过(非常)粗略的相当于:

代码语言:javascript
复制
$ git checkout theirs; git cherry-pick theirs..mine

然后,重新调整分支标签,这样分支theirs就不会实际移动。(内部几乎没有那么糟糕:-)但它确实让--ours的意思是“他们的”,而--theirs的意思是“我们的”,这在外部是相当糟糕的。

票数 14
EN

Stack Overflow用户

发布于 2014-01-31 22:04:43

您可以使用:

代码语言:javascript
复制
git checkout --ours -- path/to/file

或者:

代码语言:javascript
复制
git checkout --theirs -- path/to/file

...during是用于选择冲突文件的特定版本的合并或重基;因为重基是有点奇怪,在本例中--theirs将是feature的版本,--ours将是master的版本。

票数 9
EN

Stack Overflow用户

发布于 2014-01-31 22:04:10

我相信你所要寻找的,将摆脱这三个步骤,是

git rebase master -X theirs

将自动解决有利于feature (当前签出的分支)的冲突,或

git rebase master -X ours

ourstheirs的意义是违反直觉的,因为它是要重新建立基础的参数,正如http://git-scm.com/docs/git-rebase对选项的描述所指出的那样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21490592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档