Git的基本操作

Git是一个分布式的版本控制工具,简单易用。
安装:sudo apt-get install git

1、Git配置操作

Git全局配置
配置使用git的用户名:git config --global user.name "GAOKAIKAI958" 配置使用git的邮箱:git config --global user.email "GAOKAIKAI958@pingan.com.cn" 配置颜色提示为打开状态:git config --global color.ui true 设置编辑器:git config --global core.editor gedit 查看当前所有的git配置:
git config -lgit config --listgit config --list --show-origin 查看帮助信息:  
详细手册帮助:git help <verb>,例如:git help add;
简要信息:git <verb> -h,例如:git add -h;

2、Git本地环境操作

创建并初始化工作区目录:

git init /path/filepackage 在工作区的根目录下,有一个.git目录(版本库或本地仓库),省略后面选项则在当前目录下创建。

添加到暂存区的内容

git add file_namegit add filepackage_name/ 使用该命令可以将工作区相关内容(文件或者文件夹)的改动添加到暂存区。

撤销暂存区添加的内容

git rm --cached file_namegit rm --cached filepackage_name/

将暂存区的内容提交到当前分支上

git commit -m “提交的说明信息” 注意:在工作区中修改内容不能直接commit提交,但可以使用git commit -a -m “提交信息”一个命令既添加到暂存区,紧接着提交到本地仓库分支上,但不建议使用。

重新提交

git add forgotten_filegit commit --amend

查看提交日志

git log 可以使用git log --pretty=oneline查看简短的提交日志

查看所有的操作日志

git reflog 一旦使用git reset的–hard参数,想回到重置之前的内容,则使用该命令查看操作id,再使用–hard,返回到想到的状态。

查看操作git状态

  1. git status git status 查看已被暂存的修改或未被暂存的修改;
  2. git diff 显示尚未暂存的改动;
  3. git diff --staged, git diff --cached;
    比对已暂存文件与最后一次提交的文件差异;

重置提交id

git reset 重置提交id(commit id)
常用参数:–soft 只是重置提交id,并不修改暂存区和工作区的内容
–herd 重置提交id,并将暂存区和工作区的内容强制恢复到当前重置HEAD后游标指向的commit id状态
eg:git reset --soft HEAD~1 将当前提交id重置到上一次提交状态
git reset --herd HEAD~1 将当前提交id重置到上一次提交,强制恢复暂存区和工作区内容恢复到重置后id的状态

3、GitHub

GitHub是一个代码托管网站。

GitHub代码管理权限操作

在本地操作系统linux上使用命令创建密钥

ssh-keygen -t rsa -C "GAOKAIKAI958@pingan.com.cn" 一般会在用户目录下生成.ssh文件夹:
.ssh/
├── id_rsa
├── id_rsa.pub
└── known_hosts

### 将本机公钥添加到github账户ssh密匙中
在用户设置(user settings)中有SSH keys管理项,可以添加可删除SSH key。
在Add an SSH key栏中存在Key选项、Title选项,在其中分别填入公钥和用户名(邮箱),然后点击Add key。
寻找id_rsa.pub文件里面存放的内容——“公钥”,将其(整个文件中的内容)复制到GitHub中的设置ssh密匙。

在GitHub上创建仓库

在github 新创建一个项目工程,选中Initialize this repository with a README选项,填写初始信息。
在github上的工程目录下可以看到.git地址。但在用本公司的gitlab时,发现需要对其进行简单修改:
原始赋值的地址:http://192.168.4.220/Experimental/NewTechResearch.git
需要修改成: http://192.168.4.220:8080/Experimental/NewTechResearch.git

建立本地仓库与远程仓库映射

在本地创建一个与远程仓库对应的仓库

下载远程仓库至本地,可重命名;
git clone <url> new_name;
git clone “远程仓库地址”  new_name;
默认下载master分支,也可以指定分支
git clone -b branch_name “远程仓库地址” 操作实例:
下载master分支
git clone http://192.168.4.220:8080/Experimental/NewTechResearch.git 下载project/ur_arm分支
git clone -b project/ur_arm http://192.168.4.220:8080/Experimental/NewTechResearch.git 下载完成后可git branch查看分支名称
注意:一般一个目录下只下载一个分支,否则会关系错乱。

添加远程仓库

git remote add <shortname> <url>

重命名远程仓库

git remote rename <old_name> <new_name>

移除远程仓库

git remote remove <name>

建立提交地址

cd “克隆下来的目录(本地仓库)”
注意:一定要切换到clone下来的目录;
建立连接:git remote add 远程主机名(习惯上origin)远程仓库的地址

在本地进行开发修改

在本地仓库中进行项目开发(git add、git commit)
注意:需要将需要同步的代码拷贝至此文件夹下
示例操作:
git add moveit_usrgit commit -m 'add ur ros package'

提交本地至远程

git push -u 远程主机名 远程分支 :将本地仓库的修改推送到远程
示例操作:
git push -u origin project/ur_arm

将远程同步到本地

git fetch <remote> 这个命令会访问远程仓库,从中拉取所有你还没有的数据。
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

git pull 如果你的当前分支设置了跟踪远程分支, 那么可以用 git pull 命令来自动抓取后合并该远程分支到当前分支。 这或许是个更加简单舒服的工作流程。

4、git分支管理

创建新分支

git branch新建分支名
例如创建一个名为project/ur_arm的分支,如下
git branch project/ur_arm 但是可能会报错:
fatal: Not a valid object name: ‘master’.
原因是本地还没有创建master,无法建立分支。
解决方法:
$git add .
$git commit -m “depends host”
然后查看分支(git branch),发现存在了master分支,这时可以创建其它分支:
git branch project/ur_arm

查看分支

git branch

切换分支

git checkout 分支名

删除分支

git branch -d 分支名

新建并切换分支

git checkout -b 新建分支名

合并分支到当前分支

git merge 合并分支名

将服务器的内容覆盖到本地仓库

git pull 【远程主机名 远程分支】

抓取服务器的内容

git fetch【远程主机名 远程分支】(与git merge合用)

忽略文件

创建一个名为 .gitignore的文件

*.[oa]    # 忽略所有以 .o 或 .a 结尾的文件;
# [abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);

*~  # 忽略所有名字以波浪符(~)结尾的文件
*.a  # 忽略所有的 .a 文件

# 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
!lib.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/

# 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
在最简单的情况下,一个仓库可能只根目录下有一个 .gitignore 文件,它递归地应用到整个仓库中。
子目录下也可以有额外的 .gitignore 文件。子目录中的 .gitignore文件中的规则只作用于它所在的目录中。

Git clone 网速慢的处理

error: RPC failed; curl 18 transfer closed with outstanding read data remaining

解决方法:命令行输入

git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

如果依旧clone失败,则首先浅层clone,然后更新远程库到本地

git clone --depth=1 -b project/ur_arm http://192.168.4.220:8080/Experimental/NewTechResearch.git
git fetch --unshallow

提示
fatal: --unshallow on a complete repository does not make sense

这个就是成功了

???

git push <remote> <branch> 你也可以运行 git push origin serverfix:serverfix, 它会做同样的事.
如果并不想让远程仓库上的分支叫做 serverfix,可以运行 git push origin serverfix:awesomebranch来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch分支。

git checkout -b serverfix origin/serverfix

这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix。

git branch -u origin/serverfix

设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支, 你可以在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置。