有没有一种使用checkout --ours
和--theirs
解决所有文件冲突的方法?我知道你可以为单个文件这样做,但找不到一种处理所有文件的方法。
有没有一种使用checkout --ours
和--theirs
解决所有文件冲突的方法?我知道你可以为单个文件这样做,但找不到一种处理所有文件的方法。
只需在工作目录中使用grep命令,并通过xargs命令发送输出:
grep -lr '<<<<<<<' . | xargs git checkout --ours
或者
grep -lr '<<<<<<<' . | xargs git checkout --theirs
grep
将递归地(使用 -r
标志)搜索当前目录(.
)和子目录中的每个文件,查找冲突标记(字符串“<<<<<<<”)。
-l
或 --files-with-matches
标志使 grep 仅输出找到字符串的文件名。扫描在第一次匹配后停止,因此每个匹配的文件仅输出一次。git checkout --ours
或 --theirs
的单个参数。既然每次在命令行中输入这个命令都很不方便,如果你发现自己经常使用它,为你选择的shell创建一个别名可能是个不错的主意:Bash通常是常用的。
这种方法应该适用于至少Git版本2.4.x。
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]'
比使用grep更快。该命令用于Git中,可以根据需要选择使用"theirs"或"ours"选项,并检出文件。 - joshbodilyCONFLICT(rename/rename):在分支“HEAD”中将“a.txt”->“c.txt”重命名为“a.txt”->“b.txt”在“master”中。
- Borek Bernardgit status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
。 - Zitraxgit merge
时选择-Xours
或-Xtheirs
来进行合并。因此:
git reset --hard HEAD
)git merge -Xours
或git merge -Xtheirs
)免责声明:当然,您可以只选择一个选项,要么是-Xours
,要么是-Xtheirs
,如需使用不同的策略,请逐个文件进行选择。
我不知道是否有一种方法可以在checkout
命令中选择,但我认为这不是非常有用的:如果您想要针对不同的文件选择不同的解决方案,则使用checkout命令选择策略很有用,否则请采用合并策略方法。
--theirs
或 --ours
选项。一种解决方法是使用 git merge -s recursive -Xtheirs BRANCH
命令。 - fbmdrebase
,尽管 ours
和 theirs
的身份被交换了(Xours
表示保留正在被 rebase 的分支的更改 到)。 - ijosephgit checkout --[ours/theirs] .
会做你想要的事情,只要你在所有冲突的根目录中。ours/theirs只影响未合并的文件,因此您不必特别查找冲突。
git restore [--ours] [--theirs] [--staged] <pathspec>
命令,其中 --ours
表示使用当前分支的版本替换指定文件,--theirs
表示使用其他分支的版本替换指定文件,而 --staged
则表示使用暂存区域的版本替换指定文件。 - Dylan Kendal$ git checkout --ours
的意思是“使用我们的版本”,但在切换分支时却无法使用“--ours/--theirs”选项。该错误提示为:fatal: '--ours/--theirs' cannot be used with switching branches。这段代码运行在git版本2.31.1和hub版本2.14.2上。 - Vladimir Vukanacgit diff --name-only --diff-filter=U | xargs git checkout --theirs
看起来能够完成任务。请注意,您必须切换到 git repo 的根目录才能实现此操作。
alias git-co-ours="git diff --name-only --diff-filter=U | xargs git checkout --ours"
alias git-co-theirs="git diff --name-only --diff-filter=U | xargs git checkout --theirs"
- ericsocogit diff
命令后面加上--relative
参数,使得路径变为相对路径,这样就可以在任何子目录下使用了。 - undefined情景1
如果有其他人想要简单地用另一个分支的内容(例如master
)覆盖掉一个分支中的所有内容,有一种更简单的方法:
git merge origin/master --strategy=ours
--strategy
选项也适用于git pull
。)git checkout branchA
git merge -X theirs branchB
--strategy=ours
的反向操作,你可能仍然会遇到合并冲突(在某些情况下,可能会保留你实际上想要删除的另一个分支的代码)。所以,如果你想要一个真正与git merge other-branch --strategy=ours
相反的解决方案,最好的方法是分两步来进行(两次合并)。假设你的目标是用branch-b
的内容替换branch-a
,那么第一步应该是这样做:git checkout branch-b
git fetch branch-a
git merge branch-a --strategy=ours
git checkout branch-a
git merge branch-b
# Cleanup - delete branch-b (if desired)
git branch -d branch-b
git push origin --delete branch-b
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
我在.zshrc文件中添加了此功能。
使用方式如下:
gitcheckoutall theirs
或 gitcheckoutall ours
git checkout --ours .
git checkout --theirs .
git checkout --ours -- .
这个命令有效吗?其中的“.”表示当前目录,如果在工作目录根目录应用,则表示整个工作目录。不确定是否可以与--ours
标志一起使用,也不知道它如何处理已删除或重命名文件的冲突。 - user456814