已暂存或未暂存更改与远程分支之间的Git差异

6
有没有一种方法可以在本地分支的暂存/未暂存更改和远程分支(例如origin/branch1)之间进行git diff?是否有类似的选项用于git difftool?
或者
有没有一种方法可以将我本地文件系统中的更改(不考虑暂存或未暂存)与git远程分支进行比较?我只是想在提交更改之前检查它们。这对于拉取更改并解决与远程分支的冲突后非常有用。

为什么不提交它,然后将提交版本与远程分支进行差异比较呢,这是可行的。 - Menglong Li
Try Sourcetree - Nandu Kalidindi
有没有一种方法可以将我本地文件系统(忘记暂存或未暂存)中的更改与git远程分支进行区分?我想要的只是在提交更改之前检查我的更改。这对于我完成将更改与远程分支合并非常有用。 - maverick112
@MenglongLi 她希望在提交之前看到更改。 - Diana Vazquez Romo
3个回答

16

是否有一种方法可以在暂存的更改和远程分支(例如 origin/branch1)之间进行 git diff?

只需运行:

git diff --cached origin/branch1

(如果您愿意,可以在此处使用--staged;我使用--cached,因为git rm具有--cached而不具有--staged)。这向您展示了一种将origin/branch1更改为与您已暂存内容相匹配的方法:

$ git show origin/branch1:README
initial version
$ cat README
initial version
second version
$ echo staged >> README && git add README
$ echo replace whole thing > README
$ cat README
replace whole thing
$ git diff --cached origin/branch1
diff --git a/README b/README
index 42549ca..d9074b8 100644
--- a/README
+++ b/README
@@ -1 +1,3 @@
 initial version
+second version
+staged

如果您想看到一个将您暂存的更改与origin/branch1匹配的方法,请添加-R(反转顺序):

$ git diff -R --cached origin/branch1
diff --git b/README a/README
index d9074b8..42549ca 100644
--- b/README
+++ a/README
@@ -1,3 +1 @@
 initial version
-second version
-staged

如您所见,这与没有使用--cached--staged 进行比较非常不同,但这也很容易:

$ git diff origin/branch1
diff --git a/README b/README
index 42549ca..acb8b7a 100644
--- a/README
+++ b/README
@@ -1 +1 @@
-initial version
+replace whole thing

git difftool 有类似的选项吗?

--cached 或非缓存选项,以及使用任何名称标识任何提交的选项也适用于 git difftool


这里值得记住的是,在 Git 中实际上并没有远程分支。你拥有一些提交记录,并对其中一些提交记录命名。其中一种可能的命名方式是 远程跟踪名,例如 origin/branch1。有些人喜欢称之为“远程分支”,但它只是你自己(本地)Git 记忆中的信息——当你运行 git fetch origin 时,从他们的 Git 拾取其分支时,Git 能够知道它们的位置。


1
太棒了!谢谢,torek。 - maverick112

1

实现这一点的方法之一是

  • 假设您在一个文件夹中有暂存更改 dir1
  • 在另一个文件夹 dir2 中检出相同的仓库,切换到远程分支
  • 使用unix diff命令查看两个目录的递归差异

diff --brief -r dir1/ dir2/


0
你可以使用git write-tree来完成这个任务。从文档中可以看到,它会“从当前索引创建一个树对象”,基本上给你的暂存内容起了一个“名字”。
以这个示例仓库为例。上游包含一个名为f的单个文件,其内容为hi
$ git diff --staged
diff --git a/f b/f
index 45b983b..f471c09 100644
--- a/f
+++ b/f
@@ -1 +1,2 @@
 hi
+hello
$ git diff
diff --git a/f b/f
index f471c09..723cb71 100644
--- a/f
+++ b/f
@@ -1,2 +1,3 @@
 hi
 hello
+unstaged

从这里可以看到,一个添加了"hello"的差异即将被暂存。

还有一个未暂存的差异,它添加了"unstaged"一行。

您可以按照以下方式将其与远程分支进行比较:

$ git diff origin/master $(git write-tree)
diff --git a/f b/f
index 45b983b..f471c09 100644
--- a/f
+++ b/f
@@ -1 +1,2 @@
 hi
+hello

在这种情况下,它恰好与git diff --staged相同,但如果我们将上游分支向前推进一点:
$ git fetch -q && git show origin/master  | tail -7
diff --git a/f b/f
index 45b983b..5f69508 100644
--- a/f
+++ b/f
@@ -1 +1,2 @@
 hi
+from upstream

现在我们看到了完整的更改:

$ git diff origin/master $(git write-tree)
diff --git a/f b/f
index 5f69508..f471c09 100644
--- a/f
+++ b/f
@@ -1,2 +1,2 @@
 hi
-from upstream
+hello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接