GIT分支-编辑文件

GIT分支-编辑文件,git,Git,这是我的问题。假设我有一个回购协议,主分支上有一个名为“app.js”的文件。然后,我创建一个新分支并签出该分支。有没有办法在新的分支中编辑并保存“app.js”上的更改,然后切换回主文件并在编辑器中重新打开原始文件?如果我在文本编辑器中打开该文件,它只会将其保存在我所在的文件夹中,而不管我在哪个分支上。抱歉,如果这是一个noob问题,谢谢您的支持 Git内部可以有任意数量的不同文件,所有文件都命名为app.js,并且可以通过提交哈希或其他提交说明符(例如HEAD或分支名称)来区分它们: git

这是我的问题。假设我有一个回购协议,主分支上有一个名为“app.js”的文件。然后,我创建一个新分支并签出该分支。有没有办法在新的分支中编辑并保存“app.js”上的更改,然后切换回主文件并在编辑器中重新打开原始文件?如果我在文本编辑器中打开该文件,它只会将其保存在我所在的文件夹中,而不管我在哪个分支上。抱歉,如果这是一个noob问题,谢谢您的支持

Git内部可以有任意数量的不同文件,所有文件都命名为
app.js
,并且可以通过提交哈希或其他提交说明符(例如
HEAD
或分支名称)来区分它们:

git show HEAD:app.js
git show a9fc302:app.js
git show master:app.js
等等。你的编辑是否能做到这一点,如果能做到,如何做到,这是一个关于你的编辑的问题

其余的都不是答案的直接部分,但理解起来很重要 请注意,编辑器使用的是存储在计算机普通文件存储系统中的普通文件,即工作树中的普通文件,Git允许您在工作树中执行工作。在使用Git时,您必须记住Git主要关注提交,提交是(大部分)永久的,(完全)只读的,文件提交时所处状态下的每个文件的快照。但是Git提交的文件不一定是来自工作树的文件

Git以一种特殊的压缩格式存储Git的文件。一旦提交了文件,它们将是只读的,并且只要提交本身存在就存在,但是由于它们是一种特殊的Git-only格式,只有Git可以直接访问它们。
git checkout
在签出某些提交(通过某个分支名称,例如,
git checkout分支
)时所做的是提取这些只读文件:

  • 首先,Git将它们复制到Git的索引中。索引也称为暂存区,有时也称为缓存。在索引中,这些文件仍然有一个特殊的Git-only形式,但现在它们可以被覆盖

  • 那么,实际上,在复制到索引的同时,因为它更高效,Git将每个文件的索引版本提取到您的工作树中,将只使用Git的特殊表单反压缩为计算机系统其他部分可以使用的表单

因此,您处理的文件的工作树副本实际上根本不是Git的文件。运行
git add file
时,您告诉git将
file
的工作树版本复制到git的索引中。此时,Git将文件压缩为仅限Git的特殊格式,并用新的替换文件覆盖该文件的当前索引版本

结果是,索引总是包含准备提交的文件,这些文件将进入下一次提交。它从当前提交中的所有文件开始,以特殊的Git-only形式,与工作树中的所有文件以编辑器理解的正常日常形式匹配。但在此之后,您可以随意更改、损坏工作树文件。这对索引中的版本没有影响,除非运行
git add
将工作树文件复制回索引,覆盖索引版本

这就是未为提交而暂存的更改与为提交而暂存的更改之间的区别:运行
git status
让git将当前提交与索引进行比较,而任何不同之处都会为提交而暂存,因为您将其复制到了索引中。然后,
git status
让git将索引与工作树进行比较:任何不同之处都不会进行提交,因为您尚未将其复制到索引中

编辑器不能直接处理索引文件。1它必须处理工作树文件。为了您自己的理智,以及易于使用大多数标准编辑器,在工作树区域内外以多个不同的名称保存某个文件的多个不同版本更有意义



1可能有一些可以,但如果是这样,他们可能会将索引文件提取到常规文件,然后使用
git add
将其放回索引中。索引的内部格式在每个新的Git版本中都会发生变化,因此过分依赖它是不明智的。

Git内部可以有任意数量的不同文件,所有文件都命名为
app.js
,并且可以通过提交哈希或其他提交说明符(例如
或分支名称)来区分它们:

git show HEAD:app.js
git show a9fc302:app.js
git show master:app.js
等等。你的编辑是否能做到这一点,如果能做到,如何做到,这是一个关于你的编辑的问题

其余的都不是答案的直接部分,但理解起来很重要 请注意,编辑器使用的是存储在计算机普通文件存储系统中的普通文件,即工作树中的普通文件,Git允许您在工作树中执行工作。在使用Git时,您必须记住Git主要关注提交,提交是(大部分)永久的,(完全)只读的,文件提交时所处状态下的每个文件的快照。但是Git提交的文件不一定是来自工作树的文件

Git以一种特殊的压缩格式存储Git的文件。一旦提交了文件,它们将是只读的,并且只要提交本身存在就存在,但是由于它们是一种特殊的Git-only格式,只有Git可以直接访问它们。
git checkout
在签出某些提交(通过某个分支名称,例如,
git checkout分支
)时所做的是提取这些只读文件:

  • 首先,Git将它们复制到Git的索引中。索引也称为暂存区,有时也称为缓存。在索引中,这些文件仍然有一个特殊的Git-only形式,但现在它们可以被覆盖

  • 那么,实际上,在复制到索引的同时,因为Git将每个文件的索引版本提取到您的工作树中更高效,所以反压缩
    git checkout branch
    # edit some stuff
    git add .
    # edit more stuff
    git stash
    # NOTE: at this point it will look like your changes have simply been
    # reverted; but they haven't.
    git checkout master
    # now you have the `master` versions of all files
    # ... do stuff ...
    git checkout branch
    git stash pop
    # branch version of file is back
    
    git worktree add /path/for/additional/worktree branch