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

Git diff between staged or unstaged changes with a remote branch

有没有办法在 staged/unstaged 更改与远程分支 origin/branch1 之间进行 git 差异。 git difftool 是否有类似的选项?

有没有办法通过 git 远程分支来区分本地文件系统中的更改(忘记暂存或未暂存)?我只想在提交之前检查我的更改。一旦我完成了更改并解决了与远程分支的冲突,这就非常有用。

您可以使用 git write-tree 来完成此操作。从文档中它 "creates a tree object from the current index" -- 基本上是给你的暂存内容一个 "name"。

获取此示例存储库。上游包含一个文件 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"行的diff

还有一个未分级的差异,其中添加了行 "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

实现此目的的一种方法是

  • 假设您在一个文件夹中进行了阶段性更改 dir1
  • 在另一个文件夹中检出相同的 repo dir2,切换到远程 分支
  • 使用 unix diff 命令查看两者的递归差异
    目录

diff --brief -r dir1/ dir2/

Is there a way to do a git diff between staged changes and a remote branch say origin/branch1.

就运行:

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

Is there a similar option with git difftool?

这些相同的选项(--cached 或不,以及使用任何名称来标识任何提交)也可用于 git difftool


这里值得记住的是 Git 中实际上没有任何远程 b运行ches。您有一些提交,并且您有一些提交的名称。一种可能的名称形式是 远程跟踪名称,例如 origin/branch1。有些人喜欢称它为 "remote branch",但它只是你自己的(本地)Git 对 originbranch1 前一段时间指向的位置的记忆,当你运行 git fetch origin 让你的 Git 接他们的 Git 的 b运行ches.