我可以在未跟踪文件上使用git diff吗?

时间:2009-05-13 02:20:27

标签: git diff

是否有可能要求git diff在其diff输出中包含未跟踪的文件?或者我最好选择git添加我创建的新文件和我编辑的现有文件,并使用

git diff --cached

10 个答案:

答案 0 :(得分:224)

使用最近的git版本,您可以git add -N文件(或--intent-to-add),这会将零长度blob添加到该位置的索引。结果是你的“未跟踪”文件现在变成了一个修改,将所有内容添加到这个零长度文件中,并显示在“git diff”输出中。

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

可悲的是,正如所指出的那样,当你有git stash个文件挂起时,你不能--intent-to-add。虽然如果你需要藏匿,你只需添加新文件然后存储它们。或者您可以使用模拟解决方法:

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(在这里设置别名是你的朋友)。

答案 1 :(得分:80)

我相信你可以通过简单地提供两个文件的路径来区分索引和未跟踪文件中的文件。

git diff --no-index tracked_file untracked_file

答案 2 :(得分:33)

对于我的交互式日常gitting(我将工作树始终与HEAD区分开来,并且希望diff中包含未跟踪的文件),add -N/--intent-to-add无法使用,因为它{ {3}} git stash

所以这是我的git diff替换。它不是一个特别干净的解决方案,但由于我真的只是以交互方式使用它,所以我很好用黑客:

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

仅键入d将包括差异中未跟踪的文件(这是我在工作流程中关注的内容),而d args...的行为与常规git diff相同。

注意:

  • 我们在这里使用的事实是git diff实际上只是个别差异连接,所以不可能从“真正的差异”告诉d输出 - 除了所有未跟踪的文件最后排序。
  • 此功能的唯一问题是即使重定向,输出也会着色;但我不能为此添加逻辑而烦恼。
  • 我找不到任何方法来为git diff组装一个光滑的参数列表来获取未包含的文件。如果有人知道如何执行此操作,或者某个功能可能会在以后的某个时间点添加到git,请在此处留言!

答案 3 :(得分:21)

不是100%到了这一点,但如果由于某种原因你不想按照接受的答案的建议将你的文件添加到索引中,这是另一种选择:

如果文件未被跟踪,显然diff是整个文件,所以你只需要用less来查看它们:

less $(git ls-files --others --exclude-standard)

使用:n:pgit diffgit ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less 之间导航以进行下一个和之前的操作..

从评论中更新:如果您需要补丁格式,还可以将其与{{1}}结合使用:

{{1}}

在这种情况下,您还可以将输出重定向到文件或使用其他diff命令。

答案 4 :(得分:14)

使用此命令进行暂存和非暂存时更改工作。分阶段时新文件有效:

$ git diff HEAD

如果他们没有上演,您只会看到文件差异。

答案 5 :(得分:13)

git add -A
git diff HEAD

如果需要,生成补丁,然后:

git reset HEAD

答案 6 :(得分:8)

这对我有用:

git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt

最后一步是可选的,它会使文件处于先前状态(未跟踪)

如果您也要创建补丁也很有用:

  git diff --cached my_file.txt > my_file-patch.patch

答案 7 :(得分:4)

对于一个文件:

git diff --no-index /dev/null new_file

对于所有新文件:

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;

作为别名:

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"

对于所有修改后的文件和新文件合并为一个命令:

{ git --no-pager diff; gdnew }

答案 8 :(得分:2)

通常当我与远程位置团队合作时,对我来说,我事先知道其他团队在同一个文件中做了哪些更改,然后我按照git阶段进行跟踪 - > gt; staged - > commit 因为我写了一个bash脚本,帮助我避免不必要的解决方案与远程团队合并冲突或制作新的本地分支,并在主分支上进行比较和合并

public class DashBoardController : Controller
    {
        string baseUri = WebConfigurationManager.AppSettings["PowerBiDataset"];
        string AccessToken = string.Empty;
        // GET: DashBoard
        public ActionResult DashBoard()
        {

            if (Request.Params.Get("code") != null)
            {
                Session["AccessToken"] = GetAccessToken(
                    Request.Params.GetValues("code")[0],
                    WebConfigurationManager.AppSettings["ClientID"],
                    WebConfigurationManager.AppSettings["ClientSecret"],
                    WebConfigurationManager.AppSettings["RedirectUrl"]);


                Response.Redirect("~/DashBoard/DashBoard");
            }

            if (Session["AccessToken"] != null)
            {

                AccessToken = Session["AccessToken"].ToString();
                GetReport(0);
            }
            return View();
        }


        protected void GetReport(int index)
        {
            System.Net.WebRequest request = System.Net.WebRequest.Create(
                String.Format("{0}/Reports",
                baseUri)) as System.Net.HttpWebRequest;

            request.Method = "GET";
            request.ContentLength = 0;
            request.Headers.Add("Authorization", String.Format("Bearer {0}", AccessToken));

            using (var response = request.GetResponse() as System.Net.HttpWebResponse)
            {

                using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                {

                    PBIReports Reports = JsonConvert.DeserializeObject<PBIReports>(reader.ReadToEnd());

                    if (Reports.value.Length > 0)
                    {
                        var report = Reports.value[index];
                        ViewData["AccessToken"] = Session["AccessToken"].ToString();
                        ViewData["EmbedURL"] = report.embedUrl;
                        ViewData["ReportID"] = report.id;
                    }
                }
            }
        }

        public void GetAuthorizationCode()
        {

            var @params = new NameValueCollection
            {

                {"response_type", "code"},
                {"client_id", WebConfigurationManager.AppSettings["ClientID"]},
                {"resource", WebConfigurationManager.AppSettings["PowerBiAPI"]},
                { "redirect_uri", WebConfigurationManager.AppSettings["RedirectUrl"]}
            };

            var queryString = HttpUtility.ParseQueryString(string.Empty);
            queryString.Add(@params);

            Response.Redirect(String.Format(WebConfigurationManager.AppSettings["AADAuthorityUri"] + "?{0}", queryString));


        }

        public string GetAccessToken(string authorizationCode, string clientID, string clientSecret, string redirectUri)
        {
            TokenCache TC = new TokenCache();

            string authority = WebConfigurationManager.AppSettings["AADAuthorityUri"];
            AuthenticationContext AC = new AuthenticationContext(authority, TC);
            ClientCredential cc = new ClientCredential(clientID, clientSecret);

            return AC.AcquireTokenByAuthorizationCode(
                authorizationCode,
                new Uri(redirectUri), cc).AccessToken;
        }
    }
    public class PBIReports
    {
        public PBIReport[] value { get; set; }
    }
    public class PBIReport
    {
        public string id { get; set; }
        public string name { get; set; }
        public string webUrl { get; set; }
        public string embedUrl { get; set; }
    }

在上面的脚本中我将远程主分支(不需要它的主分支)提取到FETCH_HEAD它们只列出我修改过的文件并进行比较 将文件修改为git difftool

这里有很多由git支持的difftool,我配置'Meld Diff Viewer'进行良好的GUI比较。

答案 9 :(得分:0)

利用您可以暂存未跟踪/新文件并且可以比较暂存文件这一事实,您可以将这两者结合起来查看差异。我觉得使用起来很简单。

  1. 添加您想要查看差异的文件或添加包括新文件在内的所有文件。

    git add .

  2. 区分暂存文件

    git diff --staged

  3. 如果需要,您可以使用

    取消暂存文件

    git resetgit reset filePath 以重置特定文件。