首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何解决git合并冲突,从命令行,使用给定的策略,只有一个文件?

如何解决git合并冲突,从命令行,使用给定的策略,只有一个文件?
EN

Stack Overflow用户
提问于 2016-08-24 14:45:45
回答 1查看 11K关注 0票数 22

假设我合并了一个git,并且在某个文件(比如package.jsonpom.xml )中有一个冲突,也许还有其他一些文件。

我想

  1. 从命令行自动解决某些文件的合并冲突,而
  2. 让我手动解决所有其他冲突,如果有的话,和
  3. 确保我不会失去来自任何分支的有价值的改变。

因为2),我不能使用git merge -Xours ,因为这将解决所有冲突。我只想解决一个特定文件中的冲突。

由于3),我不能使用git checkout --ours package.json ,因为这可能会丢失输入分支中的一些更改。

例如,用例:自动合并脚本,它将以一种预先定义的方式解决琐碎的众所周知的冲突,如果其他文件中存在其他冲突,则会失败。

我经常遇到的典型情况是,version字段在package.json中有两个分支,分叉如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
$ git diff
diff --cc package.json
index 75c469b,f709434..0000000
--- a/package.json
+++ b/package.json
@@@ -1,6 -1,6 +1,12 @@@
  {
    "name": "test",
++<<<<<<< HEAD
 +  "version": "2.0.1",
++||||||| merged common ancestors
++  "version": "1.0.0",
++=======
+   "version": "1.0.2",
++>>>>>>> master

是否可以使用给定的策略仅解决一个文件的冲突?类似于:

代码语言:javascript
代码运行次数:0
运行
复制
git-resolve-conflict --ours package.json
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 14:45:45

这可以使用git-merge-file实现,尽管它的API相当低。

为了有一个易于使用的命令,您可以使用以下bash脚本(要导入到.bashrc,也可以用npm install -g git-resolve-conflict安装它):

代码语言:javascript
代码运行次数:0
运行
复制
git-resolve-conflict() {
  STRATEGY="$1"
  FILE_PATH="$2"

  if [ -z "$FILE_PATH" ] || [ -z "$STRATEGY" ]; then
    echo "Usage:   git-resolve-conflict <strategy> <file>"
    echo ""
    echo "Example: git-resolve-conflict --ours package.json"
    echo "Example: git-resolve-conflict --union package.json"
    echo "Example: git-resolve-conflict --theirs package.json"
    return
  fi

  git show :1:"$FILE_PATH" > ./tmp.common
  git show :2:"$FILE_PATH" > ./tmp.ours
  git show :3:"$FILE_PATH" > ./tmp.theirs

  git merge-file "$STRATEGY" -p ./tmp.ours ./tmp.common ./tmp.theirs > "$FILE_PATH"
  git add "$FILE_PATH"

  rm ./tmp.common
  rm ./tmp.ours
  rm ./tmp.theirs
}

(注意:我一直在更新我的https://github.com/jakub-g/git-resolve-conflict/blob/base/lib/git-resolve-conflict.sh)回购中的脚本,查看回购以获得最新的改进: GitHub )

在问题中所述的具体例子中,用法如下:

代码语言:javascript
代码运行次数:0
运行
复制
git-resolve-conflict --ours package.json

关于一步一步的研究,见:

https://github.com/jakub-g/git-resolve-conflict

奖金:

如果子文件夹中有多个package.json文件,并且要解析合并for all of them which are in conflicted state

代码语言:javascript
代码运行次数:0
运行
复制
for ITEM in $(git diff --name-only --diff-filter=U | grep package.json$); do git-resolve-conflict --ours $ITEM; done
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39126509

复制
相关文章

相似问题

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