5

有没有办法在远程分支的分阶段/非分阶段更改之间进行 git diff,比如 origin/branch1。git difftool 有类似的选项吗?

或者

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

4

3 回答 3

9

有没有办法在分阶段更改和远程分支之间进行 git diff,比如 origin/branch1。

赶紧跑:

git diff --cached origin/branch1

--staged如果您愿意,可以在此处使用;我使用--cachedbecause git rmhas--cached但 not --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

如您所见,这些与没有--cachedaka的比较非常不同--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 对前一段时间指向的位置的记忆,当您运行origin并让您的 Git 拾取他们的 Git 分支时。branch1git fetch origin

于 2017-12-01T03:29:10.267 回答
1

实现这一目标的一种方法是

  • 假设您在一个文件夹中进行了更改dir1
  • 在另一个文件夹中签出相同的仓库dir2,切换到远程分支
  • 使用 unixdiff命令查看两个
    目录的递归差异

diff --brief -r dir1/ dir2/

于 2017-12-01T03:06:27.933 回答
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”行的 diff 即将上演。

还有一个未暂存的差异,它添加了“未暂存”行

您可以将其与远程分支进行比较,如下所示:

$ 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
于 2017-12-01T03:04:48.020 回答