获取特定git commit命令要提交的文件列表

时间:2017-04-25 05:18:17

标签: git

输入:git repo目录和提交命令:如git commit -m "commit staged"git commit -a -m "comit all file"或任何其他git commit ...

输出:此命令将在提交中添加的文件列表。

可能的解决方案:

  • 通过以下方式获取暂存文件:git diff --cached --name-status

  • 检查git commit命令是否包含--all标志

  • 如果--allgit diff --name-only不获取暂存文件并获取此列表+暂存更改列表

  • 如果没有--all:只获取暂存更改列表

这个算法是否涵盖了git commit命令和repo状态的所有情况?

2 个答案:

答案 0 :(得分:3)

您可以使用git status --porcelain一次性获取工作目录和暂存区的完整状态。

$ git status --porcelain
A  that
MM this
?? blah

第一列是暂存区的状态,第二列是工作目录的状态。上面说that已添加到暂存区域,this包含暂存和非暂停修改,blah未跟踪。

这是同样的事情。

$ git status
On branch feature
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   that
    modified:   this

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   this

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    blah

但我怀疑你真正想要的是能够在你提交之前审查会发生什么变化。在这种情况下,我建议你不要这样做。代替...

  1. 请勿使用-m
  2. 使用-v
  3. 使用git commit --amend修复任何错误。
  4. git commit -m是一个坏习惯。这意味着您的提交消息将是一行并且缺少详细信息。一个好的提交消息是这样的:

      

    简要总结。

         

    详情,详情,详情。

    git commit -m不鼓励这些,而且这些细节在未来很重要, ,你永远无法让他们回来 。值得花几秒钟。

    更重要的是,一个定期的git commit拉出一个编辑器已经向你展示了将会发生什么。

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # On branch feature
    # Changes to be committed:
    #       new file:   that
    #       modified:   this
    #
    # Changes not staged for commit:
    #       modified:   this
    #
    # Untracked files:
    #       blah
    #
    

    更好的是,如果您使用git commit -v,您将获得完整的差异进行审核。我经常使用它,我将其别名为git ci(签入)。

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # On branch feature
    # Changes to be committed:
    #       new file:   that
    #       modified:   this
    #
    # Changes not staged for commit:
    #       modified:   this
    #
    # Untracked files:
    #       blah
    #
    # ------------------------ >8 ------------------------
    # Do not touch the line above.
    # Everything below will be removed.
    diff --git a/that b/that
    new file mode 100644
    index 0000000..e69de29
    diff --git a/this b/this
    index 73e4f83..f129e32 100644
    --- a/this
    +++ b/this
    @@ -4,3 +4,5 @@ fix
     1
     2
     3
    +4
    +
    

    最后,与其他版本控制系统不同,Git中的提交不会立即共享。在您git push之前,一切都是本地的。这意味着如果你在提交中犯了错误,你可以快速修复它。只需进行修复,git commit --amend即可更新最后一次提交。

    因此,不要添加一堆图层来防止自己蠢蠢欲动,而只需修复傻瓜。这就是版本控制之美!

答案 1 :(得分:0)

如果您使用上面建议的git commit -v来查看修改过的文件列表,请注意该列表之前的行将随Git 2.14.x / 2.15(2017年第4季度)而变化。

提交日志编辑器中对剪切线的解释是 稍微调整一下。

commit 8c4b1a3Kaartic Sivaraam (sivaraam)(2017年9月13日) 帮助:Jeff King (peff)
Junio C Hamano -- gitster --合并于commit 77f4539,2017年9月25日)

  

commit-template:将消息更改为更直观

     

使用短语&#39; do not touch&#39;这样做并不好传达不应修改或删除切割线的信息,因为它可能会被一个不知道“触摸”字样的人误解。具有&#39;篡改&#39;的含义   此外,它可能使翻译有点困难,因为它在翻译时可能没有几种语言的预期含义。

     

所以,在句子中使用更直观的术语。

所以而不是

Do not touch the line above.
Everything below will be removed.

你将拥有:

Do not modify or remove the line above.
Everything below it will be ignored.