试图理解Git(通过VS 2017)
我一直在阅读和玩Git,但是我仍然不知道如何正确地使用这些分支 例如,我有一个LocalMaster,它可以同步回网络上的最新版本 在我拉完所有我跑的东西后:试图理解Git(通过VS 2017),git,visual-studio,tfs,visual-studio-2017,Git,Visual Studio,Tfs,Visual Studio 2017,我一直在阅读和玩Git,但是我仍然不知道如何正确地使用这些分支 例如,我有一个LocalMaster,它可以同步回网络上的最新版本 在我拉完所有我跑的东西后: git checkout -b BugFix 这会创建一个错误修复分支,并将我设置到该分支中 现在我开始在这个分支中进行更改 如果我不提交,为什么切换回LocalMaster时会看到这些更改 假设我正在BugFix分支中进行更改,并且我只将它们提交给该分支。如何查看此分支中存在的更改 假设我在步骤2中做了更改。现在出现了其他问题,我只想
git checkout -b BugFix
这会创建一个错误修复分支,并将我设置到该分支中
现在我开始在这个分支中进行更改
许多GUI对您隐藏了许多细节,通常是为了让Git看起来更简单。我认为这是一个错误,因为基本的Git细节无论如何都会不断出现。一般来说,我不知道VS2017在多大程度上试图隐藏东西,除了特殊情况外,我只是避免使用GUI 无论如何,这里发生的事情是,您正在处理这样一个事实:在Git中,每个文件都有三个(!)副本。一种是只读的永久提交版本,它是当前提交的一部分。第二个是Git调用的索引、暂存区域或缓存,这取决于编写文档的人和时间 每个文件的这两个版本都以内部Git-ty压缩格式保存。(它的压缩非常好,实际上大多数时候只有一个副本。)如果你的GUI很好,它将允许你查看这两个副本,尽管它们的格式只有Git自己可以直接处理 文件的第三个副本是工作树中的副本。这是一个普通文件,在普通文件系统中,以普通程序可以用普通方式处理的方式存储。这是唯一一个真正占用很大空间的文件版本(除了一些Git压缩不好的二进制文件)。因此,这三份副本大多只是管理上的一个难题 显然,文件的工作树版本是可以更改的。毕竟,这只是一个普通的文件。您可以编辑、重写甚至删除它。您还可以创建新文件,这些文件尚未在索引中,也可能不在任何提交中 每个文件的索引版本也是可写的。您可以使用
git add
编写它:这会立即将工作树中的任何内容复制到索引中同名的文件中。如果索引中已经有一个,则将替换索引副本。如果索引中还没有一个,这会将一个放入索引中
除了使用git add
将内容复制到索引中之外,处理索引的最重要方式是运行git commit
时发生的情况。此时,Git会查看索引,而不是工作树,以进行新的提交。无论索引中有什么文件,这些文件都将进入新提交。如果从索引中删除文件(使用git rm
),则该文件不在新提交中。每个文件的内容都是复制到索引中的内容:不多也不少
一旦新提交安全地保存在存储库中,Git就会更改当前分支(如HEAD
中所记录的),以便该分支命名新提交。新提交的父级是当前提交之前的任何提交。由于Git刚刚使用索引进行了新的提交,因此提交和索引现在匹配了
这为您的四个问题设置了场景:
如果我不提交,为什么切换回LocalMaster时会看到这些更改
在工作树和/或索引中所做的更改仅在工作树和/或索引中
当您要求Git签出其他提交时,Git会将当前(头)提交与其他提交进行比较。如果某些文件不同,Git必须替换索引和工作树版本。如果没有,Git可以不去管它
让我们看一个简短的例子,在这个例子中,您要求Git(通过Git checkout
)从提交Badbefe…
移动到提交ac0ffee…
。每个文件中有三个文件:README
、a.txt
和b.txt
。两次提交中的README
版本相同。a.txt
和b.txt
的版本不适用
因此,为了进行此移动,Git必须交换索引树和工作树中现有的a.txt
和b.txt
。安全吗?好吧,如果你对a.txt
没有做任何更改,那部分是安全的。如果您对b.txt
进行了更改,则不会更改,并且会出现错误
但是README
在两个提交中是相同的。Git不必把它换掉。因此,您在索引和/或工作树中对自述文件所做的任何更改都可以保留。只要a.txt
和b.txt
未被触动,Git就可以取代它们;由于README
不需要替换,Git可以保持原样
这允许您在这两次提交中携带未提交的自述文件
更改,但不能携带任何未提交的a.txt
或b.txt
。除非它们在切换前与提交中的内容匹配,否则这两个对象不会被安全地保存
假设我正在BugFix分支中进行更改,并且我只将它们提交给该分支。如何查看此分支中存在的更改
当您进行提交时,这是一个完整的快照(索引中的任何内容)。提交本身会导致当前分支名称更改,以便名称解析为新的co
A <-B <-C <--master
A--B--C <-- master
A--B--C--D <-- master
A--B--C--D <-- master, newbranch (HEAD)
A--B--C--D <-- master
\
E <-- newbranch (HEAD)
A--B--C--D--F <-- master (HEAD)
\
E <-- newbranch
...--G--H--I <-- LocalMaster (HEAD)
\
J <-- BugFix
...--G--H--I--K <-- LocalMaster (HEAD)
\
J <-- BugFix
J' <-- tmp (HEAD)
/
...--G--H--I--K <-- LocalMaster
\
J <-- BugFix
J' <-- BugFix (HEAD), tmp
/
...--G--H--I--K <-- LocalMaster
\
J [abandoned]
...--G--H--I--K <-- LocalMaster (HEAD)
\
J <-- BugFix
...--G--H--I--K <-- LocalMaster
\ \
J--M <-- BugFix (HEAD)
...--G--H--I <-- LocalMaster
\
J <-- BugFix