本文参考鱼香ros的ROS2机器人开发:从入门到实践
目录
一、下载Git代码到本地
使用 git clone+网址 实现,比如下面这个代码:
$ git clone https://github.com/ros2/rclcpp.git
这就实现了将github上的rclcpp库下载到本地 。
二、新建代码仓库
新建仓库之前需要先配置好自己的用户名和邮箱
$ git config --global user.name "hcd" #引号内是你的用户名
$ git config --global user.email "xxxxxxxxxx@qq.com" #引号内是你的邮箱
然后通过以下代码将默认的分支名称修改为master,
$ git config --global init.defaultBranch master
可以通过以下代码来查看配置是否成功 :
$ git config -l
然后创建一个代码仓库,在工作空间根目录下,比如dev_ws/这种目录下在终端输入git init
这样就初始化了一个空的仓库,我们可以通过 ls -a 这个命令查看隐藏的.git 文件夹,但是这个仓库里目前是没有代码的,所以我们得往里面提交代码。
三、提交代码
提交代码分两步:第一步通过git add命令将代码放到暂存区中;第二步通过git commit命令将暂存区代码放到本地Git仓库中。以下是一些git add的命令:
git add +文件路径 | 添加文件到暂存区 |
git add +文件夹 | 添加文件夹到暂存区 |
git add . | 添加当前目录所有文件到暂存区 |
git reset | 将暂存区所有文件剔除 |
添加到暂存区后我们就要提交代码:
$ git commit -m "1111111111" #引号里是对于这个代码的功能描述
$ git log #查看历史提交记录
四、Git忽略文件
我们往往不想将工作空间编译后产生的build/、install/、log/文件夹也加入Git仓库,所以要采用Git忽略文件的方法:
~/dev_ws$ touch .gitignore #在工作空间根目录创建.gitignore
然后在创建的文件里添加代码:
在这里面也可以添加 * 来忽略某一类文件,比如添加*.txt就可以忽略所有的.txt文件
然后再提交:
~/dev_ws$ git add .gitignore
~/dev_ws$ git commit -m "*******"
五、Git修改内容
5.1 查看修改位置
在写代码的时候我们难免会进行一些修改以更好地完成任务,但是由于代码很多,我们经常会忘记修改了哪里,这时候就可以用git status命令查看修改内容。拿我之前写的识别车道线例子来讲,我首先cd 到lane_detection功能包,把git仓库初始化并提交,运行以下代码:
~/lane_detect_ws/src/lane_detection$ git init
~/lane_detect_ws/src/lane_detection$ git add .
~/lane_detect_ws/src/lane_detection$ git commit -m "detect lanes"
运行完后如下图:
我可以更改一下lane_detection功能包中的描述,找到package.xml文件修改红框部分内容:
把红框部分的描述替换为:
<description>detect lanes as a server</description>
替换完后运行:
~/lane_detect_ws/src/lane_detection$ git status
结果如下:
可以看到通过git status命令可以查看我们修改了什么文件,但是不会显示修改了什么内容,这时候可以运行:
~/lane_detect_ws/src/lane_detection$ git diff
结果如下:
可以看到git diff命令既可以查看在哪个文件修改,也可以查看具体的修改内容,在信息的左侧有加号和减号,“+”表示新增,“-”表示删除。我们也可以只查看一个文件的修改内容:
~/lane_detect_ws/src/lane_detection$ git diff package.xml
因为我只修改了这个文件,所以输出结果跟上面是一样的 。
5.2 撤销代码
情况一:代码既没添加到暂存区,也没有提交
就像我刚刚修改的package.xml文件,这个文件我没有添加到暂存区,可以使用下面代码进行撤销:
~/lane_detect_ws/src/lane_detection$ git checkout package.xml
结果显示:从索引区更新了 1 个路径。再回到原来的代码发现之前修改的地方已经还原:
在写这行代码的时候就发现它只有checkout哪个文件,同时提示也只有更新了几个路径,所以这个方法的问题就在于他会完全撤销掉这个文件之前修改的所有代码,所以使用这个命令的时候要谨慎。
情况二 代码添加到了缓冲区,但是没有提交
这次我们再修改回去功能包描述,然后把代码添加到暂存区:
用status命令查看到已经修改了,这时候再想撤销就要使用下面代码:
~/lane_detect_ws/src/lane_detection$ git reset package.xml
~/lane_detect_ws/src/lane_detection$ git checkout package.xml
~/lane_detect_ws/src/lane_detection$ git status
不难发现逻辑就是先用reset把这个文件从暂存区撤回去,然后就变成第一种情况,再用checkout重置修改。运行结果如下 :
这样就成功撤销修改了。
情况三 代码已经提交
还是修改刚刚那行代码,但是这次直接提交:
提交完之后运行git log 命令可以看到两次之前提交代码的记录,我们这次使用“reset+提交id”的方法撤回,所谓的“提交id”其实就是图片中那个黄色的字符串,运行以下代码:
~/lane_detect_ws/src/lane_detection$ git reset 361ad8eb72651d23d587edd8a2df544d41146172
~/lane_detect_ws/src/lane_detection$ git checkout package.xml
这个代码的逻辑是先用 “reset+提交id” 退回到把代码添加到暂存区之前的状态,然后直接checkout撤回就可以了,运行结果如下:
这个方法撤回后,撤回版本之后的提交记录都会消失,所以要注意回退的id是否正确:
六、Git分支
Git分支可以帮助我们同时开发多个版本的项目,当在开发现有版本项目的过程中前一个版本出现了bug,无需退回前一个版本,只需要切换到前一个版本的分支中进行修改即可。它允许我们在修改多个不同版本的项目时互不干扰,提高了效率。
我们可以先查看一下目前仓库的分支都有什么:
~/lane_detect_ws/src/lane_detection$ git branch
可以看到目前只有master分支,这就是默认的分支,我们可以通过下面命令创建一个新的分支:
~/lane_detect_ws/src/lane_detection$ git branch new_branch
这里我创建了一个叫做new_branch的新分支,用git branch命令可以查看:
master前面的“ * ” 号表示当前是master分支,如果要切换分支,需要运行下面命令:
~/lane_detect_ws/src/lane_detection$ git checkout new_branch
可以看到现在已经切换到new_branch分支上了。
这个时候我们提交代码或是修改是不会影响master分支的,这里我在new_branch分支上还是尝试修改了package.xml文件,然后提交代码,提交完之后再把分支切换到master分支,发现package.xml文件之前修改过的地方都变回了master分支的状态。
当然我们还可以删除没用的分支,通过下面代码:
~/lane_detect_ws/src/lane_detection$ git branch -D new_branch