了解git的工作原理

了解git的工作原理,git,version-control,Git,Version Control,假设我有两个本地repository,repo1和repo2,都包含file1.txt,其中有行: line1 line2 line3 line4 这两个都是最新的分支。 Repo1进行了修改: line3 line4 提交和推送,repo2在不进行任何更改的情况下执行拉操作(它没有进行任何更改)。 当repo2进行拉取时,新获取的文件和本地存储中的文件之间不应该有任何比较吗? 我使用Sourcetree作为git GUI。 这就是我在使用它时观察到的情况。 有人能帮我澄清一下吗?除非您以

假设我有两个本地repository,repo1和repo2,都包含file1.txt,其中有行:

line1
line2
line3
line4
这两个都是最新的分支。 Repo1进行了修改:

line3
line4 
提交和推送,repo2在不进行任何更改的情况下执行拉操作(它没有进行任何更改)。 当repo2进行拉取时,新获取的文件和本地存储中的文件之间不应该有任何比较吗? 我使用Sourcetree作为git GUI。 这就是我在使用它时观察到的情况。
有人能帮我澄清一下吗?

除非您以不同的方式配置存储库,或者在发出
pull
merge
命令时告诉git显式创建合并提交,git通常会“快进”某些类型的合并,可以干净地应用

这可以防止您用“无用”的合并提交篡改历史记录


编辑:

如果希望始终进行合并提交,则可以在执行
git pull
时指定
--no ff
。在GUI首选项窗口中可能还有一个选项可以执行此操作

当repo2进行拉取时,新获取的文件和本地存储中的文件之间不应该有任何比较吗

拉取分为两个阶段:第一阶段只是从远程存储库获取更改。这是一项完全无损的行动。如果有的话,它会将唯一的对象添加到存储库中,从而扩展对象数据库。它还将更新远程分支,这些分支本质上是从中获取数据的远程分支

第二阶段是合并。Git将首先检查本地所做的更改。由于您没有提交任何其他内容,因此不存在分歧更改,也不需要合并。因此,Git只需更新本地分支的历史记录就可以与远程分支的历史记录相匹配。在这个阶段,Git还将尝试签出这些更改,以便您的工作目录与刚刚拉入的状态相匹配。对于干净的工作目录,这意味着没有跟踪文件的本地更改,没有问题:以前可能做过的所有更改都已提交,不会丢失。所以Git只需更新本地分支并签出新文件。如果有本地更改,您的工作目录为空。然后Git将检查哪些文件实际上需要更新。如果它可以很容易地做到这一点,它就会做到,并保持您的更改原样。毫无疑问,它将引发一个错误,即您的工作目录不干净,并中止所有操作


因此,无论发生什么情况,您都不会失去任何东西。

请澄清您的问题。你到底在问什么?嗯,当我拉取与我在示例中提到的不同的文件时(repo1中的文件1被修改并推送,repo2中的文件1与前一个分支中的文件相同)。当我从repo2中提取时,在我提取之后,两个文件之间不应该有比较和合并吗?在我的例子中,文件只是被覆盖了。我希望你明白我的意思to@patentul合并发生在有两组更改的情况下,但这里只有一组更改。因此,在我执行拉取操作之前,如何确保我的文件不会被意外更改或删除?这不会是“意外”。该文件在Repo1中被故意修改。如果您不信任该repo,请不要在不先进行差异处理的情况下从中提取。因此,在我的示例中,在我从repo2提取后,我会在file1.txt中包含哪些内容?是3号线和4号线吗?是否应该有一个合并选项,以便我可以选择哪个版本?如果可能的话,git默认情况下会跳过合并提交。这就是所谓的快进。这意味着如果我不小心,有人对我处理的旧文件做了一些新的修改,我可能会意外删除我的文件,对吗?你可以通过查看遥控器的日志来预览更改。如果你不喜欢发生的事情,你也可以将你的本地存储库恢复到之前的提交状态。重要的是,git知道你的存储库中的每个文件都有一个完美的更改历史。所以你在任何时候都可以安全地尝试一些东西,然后改变主意。