使用HEAD从git diff输出中获取添加和删除的文件

时间:2019-04-01 10:28:37

标签: git git-diff

我正在使用git diff来获取特定文件的提交与其父级之间的差异。 我正在使用以下命令:


public class ConsumerDescAndEdit extends AppCompatActivity {

    Button updateButton;

    EditText nameEditTextVar;
    EditText phoneEditTextVar;
    EditText accountEditTextVar;

    //      Variables to store user inputted data.
    String nameEdit;
    String phoneEdit;
    String accountEdit;

    DatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_consumer_desc_and_edit);

        dbHelper = new DatabaseHelper(this);

        updateButton = findViewById(R.id.updateButton);

        nameEditTextVar = findViewById(R.id.nameEditScreen);
        phoneEditTextVar = findViewById(R.id.phoneNumberEditScreen);
        accountEditTextVar = findViewById(R.id.accountNumberEditScreen);

        String s_intent = getIntent().getStringExtra("EXTRA_SESSION_ID");
        nameEditTextVar.setText(s_intent);


        updateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                nameEdit = nameEditTextVar.getText().toString();
                phoneEdit = phoneEditTextVar.getText().toString();
                accountEdit = accountEditTextVar.getText().toString();

                if (nameEdit.isEmpty() || phoneEdit.isEmpty() || accountEdit.isEmpty()) {
                    Toast.makeText(ConsumerDescAndEdit.this, "Data Insufficient", Toast.LENGTH_SHORT).show();
                } else {
                    boolean b = dbHelper.updateData(nameEdit, phoneEdit, accountEdit);
                    if (b)
                        Toast.makeText(ConsumerDescAndEdit.this, "Data updated", Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(ConsumerDescAndEdit.this, "Could not update data", Toast.LENGTH_SHORT).show();

                }
            }
        });
    }
}

这是我的问题:使用此命令可以为特定的提交添加,删除和修改文件。但是,当我在当前提交中尝试使用它时,只能得到修改/删除的文件。我正在寻找一种方法来删除和添加当前提交的文件(与他的父母相比)。

例如,这是我未提交的更改: enter image description here

如果我运行create function

我明白了

git diff parent-sha child-sha  -- file/to/path

但是git diff HEAD -- yarn.lock

上没有任何内容

3 个答案:

答案 0 :(得分:1)

git diff HEAD -- path将向您显示您的本地修改。

文件src/app/models/DiffFileInformation.ts未跟踪且未暂存,因此不会出现在您的差异文件中。

要在差异中查看它,您需要先暂存(添加)。

答案 1 :(得分:1)

以下3个命令不同:

git diff
git diff HEAD
git diff HEAD^ HEAD

假设我们已经初始化了一个仓库,并进行了两次提交和一些其他未提交的更改。

git init foo
cd foo
touch a.txt b.txt
git add .
git commit -m 'first commit'

echo hello >> a.txt
echo hello >> b.txt
git commit -m 'hello'

echo world >> a.txt
echo world >> b.txt
# stage a.txt and leave b.txt alone
git add a.txt
  1. git diff返回什么?

git diff比较工作树和索引。工作树具有a.txtb.txt的修改版本,而索引仅具有a.txt的修改版本。因此,区别在于工作树的b.txt和索引的b.txt

hello
world

VS

hello

git diff返回:

diff --git a/b.txt b/b.txt
index ce01362..94954ab 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
 hello
+world
  1. git diff HEAD返回什么?

它将HEAD修订版中的文件与工作树中的文件进行比较。 a.txt中的HEAD

hello

a.txt在工作树中是

hello
world

b.txta.txt相同,因此git diff HEAD返回:

diff --git a/a.txt b/a.txt
index ce01362..94954ab 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,2 @@
 hello
+world
diff --git a/b.txt b/b.txt
index ce01362..94954ab 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
 hello
+world
  1. git diff HEAD^ HEAD返回什么?

它将前一个版本的文件与后者的文件进行比较。在HEAD^中,a.txtb.txt均为空。在HEAD中,两者都是:

hello

所以我们得到git diff HEAD^ HEAD的输出为:

diff --git a/a.txt b/a.txt
index e69de29..ce01362 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+hello
diff --git a/b.txt b/b.txt
index e69de29..ce01362 100644
--- a/b.txt
+++ b/b.txt
@@ -0,0 +1 @@
+hello

如果我们交换HEAD^HEAD,则git diff HEAD HEAD^返回:

diff --git a/a.txt b/a.txt
index ce01362..e69de29 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +0,0 @@
-hello
diff --git a/b.txt b/b.txt
index ce01362..e69de29 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +0,0 @@
-hello

HEADHEAD^可以是存储库中任何可到达的提交。除了交换修订版本,我们还可以使用选项-Rgit diff -R HEAD^ HEAD获得反向差异。

不确定您的确切目的是什么。也许您可以找到解决方案here。描述了git diff的更多语法。

答案 2 :(得分:1)

ElpieKay's answer是正确的(我对此表示赞同),但是如果您退后一步思考 commits 和Git的工作方式,它可能会帮助您考虑问题。 / p>

每个提交都包含几项内容,我们可以将其分为两大类,即 data metadata 。提交中的 data 是源代码快照,而 metadata 是有关数据的额外信息 ,例如谁创建了快照,何时创建快照。 ,依此类推(重要的是,此提交的父级的父哈希ID ,或者如果是合并提交,则是其所有父级哈希ID,但我认为您可以很好地控制这一部分现在)。请注意,提交内容始终被冻结。您不能更改数据元数据的任何部分。

实际上,所有Git内部对象都是 all 。 Git对象的哈希ID是该对象内容的加密校验和。这对于存档非常有用-每次提交,一旦 都不能更改,但是对于完成任何新工作来说完全没有用。要进行新工作,Git 必须提供一些可以修改的文件。

每个版本控制系统都存在此问题,并且通常,它们都以相同的方式解决该问题:您处理文件的位置是您的工作树。工作树中的文件具有延展性。提交中的文件不是。这意味着工作树与提交之间在本质上是有所不同的。该工作树可能是一个提议的提交,但它仍然具有延展性,因此它不是一个 actual 提交。 (它也没有任何元数据。)

因此,在Git中,工作树没有哈希ID 。但是出于某种原因,Git进一步将其扩展了。 Git不仅将工作树作为提议的下一个提交,还添加了第三个实体,它位于 HEAD(当前提交)和工作树之间。第三个实体称为 index staging区域,有时甚至称为 cache 。 (您将在Git文档中看到所有三个名称。它们都指向同一事物。)此索引是Git存储建议的下一个提交的位置。然后,Git提供诸如git add之类的命令,它们从工作树中复制 (您可以在其中存储文件并可以对其进行处理)索引(以更新索引建议的下一次提交。

这意味着git diff必须能够:

  • 比较提交与提交
  • 比较提交与索引
  • 比较提交与工作树
  • 比较索引与工作树

它提供了四种不同的方法来执行此操作,具体取决于您将传递给 --cached的参数和git diff标志:

  • git diff hash1 hash2比较提交与提交
  • git diff --cached hash比较提交与索引
  • git diff hash比较提交与工作树
  • git diff比较索引与工作树

选择所需的那一个,添加-- <path>以限制差异输出,一切就绪。