什么 Git命令将显示仅存在于其提交已完全 merge 到 master
的分支中的内容? master
中可能缺少某些内容因为,例如一些 merge 操作可能使用了 ours
策略,忽略分支内容(即 git merge --strategy ours branch
)。
我发现通常的 Git comparison operations不要产生我想要的结果。
例如,命令 git diff master..branch
和 git diff branch..master
不起作用,因为这些显示了 master
中存在的内容差异. (如何修改此命令以忽略对 master
的更改?)
命令 git diff master...branch
也不起作用,因为所有提交都在 branch
上随着时间的推移,之前已经在多个 merge 操作中被 merge 为 master。
例子:
- 创建文件
a.txt
在分公司master
. - 将第 1 行添加到
a.txt
在分公司master
. - 创建分支
branch
. - 将第 2 行添加到
a.txt
在分公司branch
. - 切换到分支机构
master
. - 将第 2 行添加到
a.txt
在分公司master
. - merge 分支
branch
至master
使用策略ours
.这就像一个“虚拟” merge ,它 merge 了branch
上的所有提交。至master
, 但丢弃其内容。 - 比较分支
master
和branch
.
命令序列:
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/