我正在使用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();
}
}
});
}
}
这是我的问题:使用此命令可以为特定的提交添加,删除和修改文件。但是,当我在当前提交中尝试使用它时,只能得到修改/删除的文件。我正在寻找一种方法来删除和添加当前提交的文件(与他的父母相比)。
如果我运行create function
我明白了
git diff parent-sha child-sha -- file/to/path
但是git diff HEAD -- yarn.lock
答案 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
git diff
返回什么? git diff
比较工作树和索引。工作树具有a.txt
和b.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
git diff HEAD
返回什么?它将HEAD
修订版中的文件与工作树中的文件进行比较。 a.txt
中的HEAD
是
hello
a.txt
在工作树中是
hello
world
b.txt
与a.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
git diff HEAD^ HEAD
返回什么?它将前一个版本的文件与后者的文件进行比较。在HEAD^
中,a.txt
和b.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
HEAD
和HEAD^
可以是存储库中任何可到达的提交。除了交换修订版本,我们还可以使用选项-R
,git 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>
以限制差异输出,一切就绪。