git checkout正在将文件从功能分支移动到开发分支

时间:2019-02-13 13:44:17

标签: git git-checkout

我已经阅读了官方的git checkout文档和一些问题,但没有找到我所看到的行为的答案。

在本地,我有一个dev分支。在dev分支中,我创建了一个新的功能分支

git checkout -b myBranch

然后,我添加一个新文件

echo foo > myFile.txt

如果我立即回到dev分支

git checkout dev

myFile.txt已经存在,即使

1)我没有暂存文件 2)我没有合并分支机构

我希望我在功能分支中对文件所做的任何更改都不会在其他分支上传播。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

E.Omar's answer是正确的(并且赞成),但值得强调的是,您的工作树(您看到并使用文件的地方)不是分支。这不是提交,也不会保留!这只是您工作的地方。

永久保存或保存只要提交本身就保存的 就是您创建新的完整快照 提交。但是此快照根本不是您的工作树的副本!相反,它是您放入Git的 index 中的快照。

索引-也称为暂存区或有时称为缓存-是一件很复杂的事情,但我认为最好想到的是:< em>当您创建Git时,Git将放入您所做的 next 提交中的所有文件。它首先是保存在提交中的所有文件的副本当您运行@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if((requestCode == RESULT_LOAD_IMAGE) && (resultCode == RESULT_OK) && (null !=data)){ Uri selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); ImageView imageView = (ImageView) findViewById(R.id.memeImage); imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); } } 时结帐。

如果在工作树中创建新文件,或者在修改现有文件后,索引没有任何变化。它仍然是 commit 中内容的副本。运行git checkout name告诉Git将文件从工作树复制到索引中,使其准备好进入 next 提交。在此之前,它只是工作树中的一个文件:如果索引中没有副本,则为未跟踪的文件。

另请参阅the answer that phd linked-to中的a comment关于问题Modified files in a git branch are spilling over into another branch的问题(我们将其复制为该问题的近似答案)。请注意,导致新文件被跟踪(通过git add-进入新文件)是不够的:您还必须运行git add来进行包含该文件永久冻结副本的新提交。 (当然还有其他所有文件)。在此之前,它只是一个未跟踪或已跟踪的文件,而没有任何提交。

答案 1 :(得分:1)

之所以发生这种情况,是因为您是在新分支上创建了新文件,但还没有跟踪。因此,新文件不仅存在于新分支上,还属于工作目录,而不属于任何特定分支。