理解git和checkout

理解git和checkout,git,ubuntu,makefile,installation,cmake,Git,Ubuntu,Makefile,Installation,Cmake,我试图了解git在安装库时是如何工作的。假设我有一个名为foo的库,它有两个版本:foo-1.0和foo-2.0。因此,我运行了git clonegit://github.com/dartsim/dart.git,下载所有源文件。然后,我决定安装版本foo-1.0。因此,我运行了git checkout 1.0版。然后,我用mkdir build创建一个构建目录,用cd build输入它,然后用cmake../src和make install构建并安装库 好的,在build文件夹中,有一个名为l

我试图了解git在安装库时是如何工作的。假设我有一个名为foo的库,它有两个版本:
foo-1.0
foo-2.0
。因此,我运行了git clonegit://github.com/dartsim/dart.git,下载所有源文件。然后,我决定安装版本
foo-1.0
。因此,我运行了git checkout 1.0版。然后,我用
mkdir build
创建一个构建目录,用
cd build
输入它,然后用
cmake../src
make install
构建并安装库

好的,在
build
文件夹中,有一个名为
libfoo.so.1
的库。在检查了我的
/usr/local/lib
目录后,安装后还有一份
libfoo.so.1
。我还看到头文件
foo.h
已复制到
/usr/local/include

现在,假设我还想在同一系统上安装
foo-2.0
,而不卸载
foo-1.0
。例如,我可能使用git进行了更新,这需要我重新编译并重新安装最新版本

安装的库和头文件会发生什么情况?我猜在
build
目录中会创建一个
foo-2.0
,它也会被复制到
/usr/local/lib
。但是,头文件呢?版本1和版本2之间有所不同,但源文件中只有一个副本。运行
checkout release-2.0
cmake../src
make install
是否会用版本2的头文件覆盖
usr/local/include
处的头文件?在这种情况下,如何在同一系统上使用库的两个版本


我只是有点不清楚
结帐
是如何工作的,以及它在安装方面的实际意义……任何帮助都会很好,谢谢

git checkout为您提供了一个特定的分支。您可以在两个分支上有两个不同的版本。您的生成系统需要克隆一个特定的分支,您可以使用此命令执行此操作

git clone -b <branch name> <remote_repo>
git克隆-b
你永远不会在同一个地方有相同代码的两个版本,这基本上没有意义

当您运行checkout命令时,它将切换到该特定分支中的代码版本

这里有一个注释。“签出”命令不会删除您签出的最后一个分支中不存在的文件夹,这样您就可以得到额外的文件夹


通常,您不需要在构建过程中运行git签出。只要克隆你想要的任何分支。

听起来你可能已经习惯了不同的版本控制系统,比如SVN或ClearCase

签出在Git中的含义完全不同,不应该与安装或复制的文件有任何关系。从技术上讲,分支是指向提交的指针,该提交成为新提交行的父级。这些文件不会重复,除非它们当前正在处理和更改,然后它们作为新提交的一部分、父“分支”提交的子对象存在


签出到分支不会更改任何依赖项或标头的访问权限或版本,除非您在签出到该分支时专门更改了它们

这与
git
cmake
无关,它们只是执行您让它们执行的操作的工具。您所追求的是共享库soname和版本控制(主要版本更新和次要版本更新)之间的区别。优秀的软件打包实践者将以一种方式打包代码,通过给
cmake
提供不同的构建参数,您将能够从主分支构建
foo-1.0
foo-2.0
<代码>签出
应用于获取以前的次要版本,而不会获取以前的主要版本。谢谢,但我不明白它如何处理头文件。我知道如果我签出并安装这两个版本,将会安装两个库。但是,源目录中只有一个头文件。是否会为每个版本创建并安装此头文件的修改版本?