如何询问git存储库是否处于冲突阶段?

如何询问git存储库是否处于冲突阶段?,git,state,status,Git,State,Status,作为一个人,有很多方法可以查看存储库是否存在需要解决的冲突 然而,我正在寻找一种在脚本中检查这一点的方法。也就是说,检查存储库是否处于良好状态以开始对其进行操作,或者是否处于用户必须修复冲突的阶段 我可以想出一种方法,如下所示: __git_ps1 "%s" | grep MERGING > /dev/null 2>&1 && echo "In merge state" $ git st # On branch master nothing to commi

作为一个人,有很多方法可以查看存储库是否存在需要解决的冲突

然而,我正在寻找一种在脚本中检查这一点的方法。也就是说,检查存储库是否处于良好状态以开始对其进行操作,或者是否处于用户必须修复冲突的阶段

我可以想出一种方法,如下所示:

__git_ps1 "%s" | grep MERGING > /dev/null 2>&1 && echo "In merge state"
$ git st
# On branch master
nothing to commit (working directory clean)

$ git conflicts && echo 'Conflicts exist' || echo 'No conflicts'
No conflicts

$ git merge other-branch
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

$ git conflicts && echo 'Conflicts exist' || echo 'No conflicts'
Conflicts exist

$ git list-conflicts
file
然而,我怀疑这不是一个推荐的方法。首先是因为
\uuuu git\u ps1
\uuuu
开头,作为一名C程序员,我倾向于认为它不适合我使用,其次,我猜有一种更合适的方式,比如:

git repo-status --is-merging
它会有返回值,或者类似的东西

那么,如何询问git(作为脚本)存储库是否处于合并状态呢?

关于GNU/我会做什么

$ if { git status --porcelain | sed -nr '/^U.|.U|AA|DD/q1'; }
> then # no merge conflicts
> else # merge conflicts
> fi

这对你有用吗

$ git merge origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 1 different commit each, respectively.
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      file
#
no changes added to commit (use "git add" and/or "git commit -a")

$ git status -s         
UU file
$git合并源/主
自动合并文件
冲突(内容):合并文件中的冲突
自动合并失败;修复冲突,然后提交结果。
$git状态
#论分行行长
#您的分支和“原始/主”已发生分歧,
#和分别有1个和1个不同的提交。
#
#未合并路径:
#(酌情使用“git add/rm…”标记分辨率)
#
#均已修改:文件
#
未向提交添加任何更改(使用“git add”和/或“git commit-a”)
$git状态-s
UU文件

您可以告诉您处于合并状态,因为它告诉您一个文件有两个修改,并且两个修改都未合并。实际上,如果您有
XY文件
,其中
X
Y
都是字母,则可能存在需要解决的冲突。

在大型存储库中使用
git status
或类似工具会很慢,因为它需要检查整个工作副本的状态以及索引。我们只对索引感兴趣,所以我们可以使用更快的命令来检查索引状态

具体来说,我们可以使用
gitls文件——未合并的
。如果没有处于冲突状态的文件,则该命令将不生成输出,如果存在,则类似于以下内容:

$ git ls-files --unmerged
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 1       filename
100644 4a58007052a65fbc2fc3f910f2855f45a4058e74 2       filename
100644 65b2df87f7df3aeedef04be96703e55ac19c2cfb 3       filename
因此,我们可以检查该文件是否生成任何输出:
[[-z$(git ls files——未合并)]]
。如果存储库是干净的,则该命令将给出一个返回代码零,如果存储库有冲突,则返回代码非零。将反向行为的
-z
替换为
-n

您可以将以下内容添加到
~/.gitconfig

[alias]
    conflicts = ![[ -n $(git ls-files --unmerged) ]]
    list-conflicts = "!cd ${GIT_PREFIX:-.}; git ls-files --unmerged | cut -f2 | sort -u"
这将产生如下行为:

__git_ps1 "%s" | grep MERGING > /dev/null 2>&1 && echo "In merge state"
$ git st
# On branch master
nothing to commit (working directory clean)

$ git conflicts && echo 'Conflicts exist' || echo 'No conflicts'
No conflicts

$ git merge other-branch
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

$ git conflicts && echo 'Conflicts exist' || echo 'No conflicts'
Conflicts exist

$ git list-conflicts
file

(第二个别名的
cd${GIT_PREFIX:-.}
部分意味着您只能获得当前目录中冲突文件的列表,而不是整个存储库的列表。)

这几乎可以正常工作,但您还需要期望添加和删除冲突。在我的测试报告中,冲突是
AA文件
。谢谢你的回答。我接受了另一个,主要是因为他名声不好。
DD
不应该有冲突。如果两个分支都删除了同一个文件,谁在乎呢!我不知道你最终会如何进入那种状态。我刚从手册页上取下它,对我来说也没有意义,但它已经列出了,所以我想为什么不选中它呢?那么,任何不同的
X
Y
都意味着冲突?或者至少其中一个应该是
U
?或者,你的意思是,任何通过
^[A-Z][A-Z]
的行都会显示冲突?我认为其中的一行大部分必须是
U
。一个例外是
AA
,这两个分支都添加了不同的文件。哈哈,是的,看起来你得到了:)很高兴知道。我确实使用了
git status
解决方案,因为我认为除了合并冲突之外,我还可以确保存储库是干净的,但这肯定更有效。