git - 什么 Git 命令将显示仅存在于其提交已完全 merge 到 master 的分支中的内容?

标签 git merge git-diff

什么 Git命令将显示仅存在于其提交已完全 merge 到 master 的分支中的内容? master 中可能缺少某些内容因为,例如一些 merge 操作可能使用了 ours策略,忽略分支内容(即 git merge --strategy ours branch )。

我发现通常的 Git comparison operations不要产生我想要的结果。

例如,命令 git diff master..branchgit diff branch..master不起作用,因为这些显示了 master 中存在的内容差异. (如何修改此命令以忽略对 master 的更改?)

命令 git diff master...branch也不起作用,因为所有提交都在 branch 上随着时间的推移,之前已经在多个 merge 操作中被 merge 为 master。

例子:

  1. 创建文件 a.txt在分公司master .
  2. 将第 1 行添加到 a.txt在分公司master .
  3. 创建分支 branch .
  4. 将第 2 行添加到 a.txt在分公司branch .
  5. 切换到分支机构 master .
  6. 将第 2 行添加到 a.txt在分公司master .
  7. merge 分支 branchmaster使用策略 ours .这就像一个“虚拟” merge ,它 merge 了 branch 上的所有提交。至 master , 但丢弃其内容。
  8. 比较分支 masterbranch .

命令序列:

derek@derek-lubuntu:~/Projects$ git init test
Initialized empty Git repository in /home/derek/Projects/test/.git/
derek@derek-lubuntu:~/Projects$ cd test
derek@derek-lubuntu:~/Projects/test$ touch a.txt
derek@derek-lubuntu:~/Projects/test$ git add a.txt
derek@derek-lubuntu:~/Projects/test$ git commit --message "Added a.txt."
[master (root-commit) 6a36816] Added a.txt.
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
derek@derek-lubuntu:~/Projects/test$ echo "Line 1 from master." >> a.txt
derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 1."
[master c9ebf16] Added line 1.
 1 file changed, 1 insertion(+)
derek@derek-lubuntu:~/Projects/test$ git checkout -b branch
Switched to a new branch 'branch'
derek@derek-lubuntu:~/Projects/test$ echo "Line 2 from branch." >> a.txt
derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 2."
[branch 8a142dd] Added line 2.
 1 file changed, 1 insertion(+)
derek@derek-lubuntu:~/Projects/test$ cat a.txt
Line 1 from master.
Line 2 from branch.
derek@derek-lubuntu:~/Projects/test$ git checkout master
Switched to branch 'master'
derek@derek-lubuntu:~/Projects/test$ echo "Line 2 from master." >> a.txt
derek@derek-lubuntu:~/Projects/test$ git commit -a --message "Added line 2."
[master d496cc7] Added line 2.
 1 file changed, 1 insertion(+)
derek@derek-lubuntu:~/Projects/test$ git merge --strategy ours branch
Merge made by the 'ours' strategy.
derek@derek-lubuntu:~/Projects/test$ git merge branch
Already up-to-date.
derek@derek-lubuntu:~/Projects/test$ git diff master..branch
diff --git a/a.txt b/a.txt
index f773e76..5dae91a 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,2 @@
 Line 1 from master.
-Line 2 from master.
+Line 2 from branch.
derek@derek-lubuntu:~/Projects/test$ git diff branch..master
diff --git a/a.txt b/a.txt
index 5dae91a..f773e76 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,2 @@
 Line 1 from master.
-Line 2 from branch.
+Line 2 from master.
derek@derek-lubuntu:~/Projects/test$ git diff master...branch
derek@derek-lubuntu:~/Projects/test$ git diff branch...master
diff --git a/a.txt b/a.txt
index 5dae91a..f773e76 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,2 @@
 Line 1 from master.
-Line 2 from branch.
+Line 2 from master.

我可以使用什么 Git 操作来仅显示“+第 2 行来自分支”。同时忽略“+ Master 的第 2 行”。或“-来自主人的第 2 行。”?

最佳答案

图自How do I do a one way diff in Linux? :

您可以将 diff 的输出通过管道传输到 grep 以整理 master 中存在的更改。我知道这样做的最好方法是忽略任何以连字符开头的行。

git diff 主分支 | grep -v "^-"

对我来说,在执行您的步骤后显示了以下输出:

diff --git a/a.txt b/a.txt

index f908dc1..1b5b3bd 100644

+++ b/a.txt

@@ -1,2 +1,2 @@

this line in both files

+line2 on branch

git diff master branch 显示

diff --git a/a.txt b/a.txt

index f908dc1..1b5b3bd 100644

--- a/a.txt

+++ b/a.txt

@@ -1,2 +1,2 @@

this line in both files

-line2 in master

+line2 on branch

这具有从 diff 中剥离颜色并将其直接打印到标准输出而不是 less 的副作用。由于颜色有助于区分每个列出的更改所在的文件,因此没有必要在一个文件中删除更改。如果您需要在 less 中显示内容,只需在命令末尾添加一个指向 less 的管道即可。

编辑:正如@DerekMahar 在他的评论中指出的那样,这只会向您显示branch 上的additions,而不会反射(reflect)在master 中。我不确定如何修改它以包括来自 branch 的所有更改,因为我知道没有简单的方法来区分 master 的添加和 的减法查看差异时分支


下面是一个非常粗略的想法,正如此处所解释的那样,不会完全解决问题,但感觉已经足够了我想我应该记下它以防其他人知道如何解决它的问题:

我最好的初步想法(这需要比我现在有时间编写更多的脚本,并且还有它自己的问题集合,但我想我会把它放在这里以防其他人可以使用它)是获取 git diff master branch | 的输出grep "^-"(注意缺少 -v),然后在 branch(文件名将在第一行输出中可用)。然后我们就会知道在 branch 中找到的所有行都从 master删除,而所有没有找到的行都被添加大师。但是,可能重复的行(例如 { 本身)会很快导致此方法出现问题,我不确定如何解决该问题。

关于git - 什么 Git 命令将显示仅存在于其提交已完全 merge 到 master 的分支中的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32462986/

相关文章:

sql-server - SSIS 多列合并转换排序

git - 如何在 2 个不同的本地分支机构之间对同一文件调用 git diff?

git - 致命: This operation must be run in a work tree on pre-receive hook

GitHub: pull 请求: pull 请求后我是否必须分支?

git - 如何在 git 中安全地使用共享对象数据库?

git - 在 Git 别名的位置参数中传递字符串

git - 使用原始源代码更新 Git 中的功能分支

可能破坏/重写历史的 Git 命令

python - Keras 2.2.4 如何从 Keras 1.x.x 复制 merge()

git - 打印差异百分比