Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解Git(通过VS 2017)_Git_Visual Studio_Tfs_Visual Studio 2017 - Fatal编程技术网

试图理解Git(通过VS 2017)

试图理解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,但是我仍然不知道如何正确地使用这些分支

例如,我有一个LocalMaster,它可以同步回网络上的最新版本

在我拉完所有我跑的东西后:

git checkout -b BugFix
这会创建一个错误修复分支,并将我设置到该分支中

现在我开始在这个分支中进行更改

  • 如果我不提交,为什么切换回LocalMaster时会看到这些更改

  • 假设我正在BugFix分支中进行更改,并且我只将它们提交给该分支。如何查看此分支中存在的更改

  • 假设我在步骤2中做了更改。现在出现了其他问题,我只想在LocalMaster分支中进行快速修复。我可以这样做,并把它推回到网络。如何将错误修复分支与相同的更改同步

  • 假设我在步骤2中做了一个不想合并到LocalMaster的更改。我怎样才能收回那笔钱呢


  • 许多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