跳过正文
  1. Posts/

常用 git 命令

·476 字·3 分钟
Haoran Zhou | 周浩然
作者
Haoran Zhou | 周浩然
海阔凭鱼跃
目录

配置 github 的 ssh 公钥
#

在新的主机上使用 github 时为了避免输入用户名和密码,可以在 github 账号下配置 ssh 的公钥。 具体步骤如下:

  1. 第一步:检查本地主机是否已经存在ssh key
cd ~/.ssh
ls
//看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key

如果存在,直接跳到第三步 2. 第二步:生成ssh key 如果不存在ssh key,使用如下命令生成

ssh-keygen -t rsa -C "xxx@xxx.com"
//执行后一直回车即可
  1. 第三步:获取ssh key公钥内容(id_rsa.pub)
cd ~/.ssh
cat id_rsa.pub
  1. 第四步:Github账号上添加公钥 GITHUB -> SETTINGS -> SSH AND GPG KEYS -> NEW SSH KEY 将公钥内容复制粘贴进去即可。
  2. 第五步:验证是否设置成功
ssh -T git@github.com

git push代码到远程新分支
#

获取远程代码修改后,想要push到远端与原来不同的新分支,可以使用下面的命令实现:

git push origin 本地分支:远端希望创建的分支

例如git下来的分支为master

git branch
>>> *master
git push origin master:my_remote_new_branch
#远端即可创建新的分支my_remote_new_branch,提交本地修改

关于配置
#

使更改的.gitignore文件生效
#

运行以下命令,清除 Git 缓存中的所有文件,以确保 Git 会重新读取 .gitignore 文件

git rm -r --cached .

这个命令会将 Git 缓存中的所有文件标记为需要删除。

运行以下命令,将未被 Git 跟踪的文件添加回到 Git 仓库中:

git add .

运行以下命令,提交更改

git commit -m "Update .gitignore"

这个命令将提交你的更改并将它们添加到 Git 历史记录中。

submodule
#

常见场景:当项目依赖并跟踪一个开源的第三方库时,将第三方库设置为submodule

参考文章 Git中submodule的使用

创建 submodule
#

获取 submodule
#

如果希望子模块代码也获取到,一种方式是在克隆主项目的时候带上参数 --recurse-submodules,这样会递归地将项目中所有子模块的代码拉取。

对于已经部署的项目, 可以在当前主项目中执行:

git submodule init
git submodule update

则会根据主项目的配置信息,拉取更新子模块中的代码。

Commit
#

撤销最近的一次 commit
#

仅撤回commit操作,写的代码仍然保留。

git reset --soft HEAD^

参数:

  • –mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset –mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

  • –soft
    不删除工作空间改动代码,撤销commit,不撤销git add .

  • –hard 删除工作空间改动代码,撤销commit,撤销git add .

HEAD^的意思是上一个版本,也可以写成HEAD1 如果你进行了2次commit,想都撤回,可以使用HEAD2

Stash
#

git stash
#

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 可以使用 git stashgit stash push 将新的贮藏推送到栈上。

git add .
git stash
Saved working directory and index state WIP on dev-m92u-mj3: 5a62067 添加兼容UDP协议. 如需打开UDP,在CMakeLists.txt中设置USE_SHM=OFF

此时,可以切换分支并在其他地方工作;你的修改被存储在栈上。 要查看贮藏的东西,可以使用 git stash list

git stash list
stash@{0}: WIP on dev-m92u-mj3: 5a62067 添加兼容UDP协议. 如需打开UDP,在CMakeLists.txt中设置USE_SHM=OFF

可以通过原来 stash 命令的帮助提示中的命令将你刚刚贮藏的工作重新应用:git stash apply。 如果想要应用其中一个更旧的贮藏,可以通过名字指定它,像这样:git stash apply stash@{2}。 如果不指定一个贮藏,Git 认为指定的是最近的贮藏

Remote
#

一个项目push到多个远程Git仓库
#

  1. 如下命令查看远程仓库的情况,可以看到只有一个叫 github 的远程仓库。
git remote
origin

git remote -v
origin  git@github.com:NoneJou072/IsaacLab.git (fetch)
origin  git@github.com:NoneJou072/IsaacLab.git (push)
  1. 使用如下命令再添加一个远程仓库
git remote add gitlab git@git.n.xiaomi.com:zhouhaoran1/bimanual-hand-gym.git
  1. 再次查看远程仓库的情况,可以看到已经有两个远程仓库了。然后再使用相应的命令 push 到对应的仓库就行了。这种方法的缺点是每次要 push 两次。
git remote
github
oschina

git remote -v
github  https://github.com/zxbetter/test.git (fetch)
github  https://github.com/zxbetter/test.git (push)
oschina https://git.oschina.net/zxbetter/test.git (fetch)
oschina https://git.oschina.net/zxbetter/test.git (push)

Branch
#

新建本地分支
#

  • 新建并切换到新建的分支 git checkout -b iss53 它是下面两条命令的简写:
  • 新建分支 git branch iss53
  • 切换到新建的分支 git checkout iss53

实战:将A仓库的分支合并到B仓库的分支上
#

  1. 下载需要进行合并的仓库 B
git clone <B>
  1. 添加需要被合并的远程仓库 A
git remote add gitlab <A>

将 gitlab 作为远程仓库,添加到 本地仓库(origin)中,设置别名为 gitlab(自定义,为了方便与本地仓库origin作区分)

此时使用 git remote 查看所有远程仓库将看到两个 一个本地默认仓库origin 另外一个我们新增的 gitlab

mi@mi-LEGION-REN9000K-34IRZ: ~/work/hemera_mujoco$ git remote 
gitlab
origin
···
3. 把 gitlab 远程仓库(A)中数据抓取到本仓库(B)
```bash
git fetch gitlab <分支名称>

第2步 git remote add xxx 我们仅仅是新增了远程仓库的引用,这一步真正将远程仓库的数据抓取到本地,准备后续的更新。

mi@mi-LEGION-REN9000K-34IRZ: ~/work/hemera_mujoco$ git fetch gitlab dev_carlogo_lab_zhr
remote: Enumerating objects: 116, done.
remote: Counting objects: 100% (116/116), done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 116 (delta 33), reused 101 (delta 22), pack-reused 0
Receiving objects: 100% (116/116), 23.66 MiB | 48.74 MiB/s, done.
Resolving deltas: 100% (33/33), completed with 2 local objects.
From git.n.xiaomi.com:mi_manipulator/hemera_manipulator/hemera_mujoco
 * branch            dev_carlogo_lab_zhr -> FETCH_HEAD
 * [new branch]      dev_carlogo_lab_zhr -> gitlab/dev_carlogo_lab_zhr
  • branch dev_carlogo_lab_zhr -> FETCH_HEAD: 将远程分支 dev_carlogo_lab_zhr 更新到本地的 FETCH_HEAD。

  • [new branch] dev_carlogo_lab_zhr -> gitlab/dev_carlogo_lab_zhr: 新分支 dev_carlogo_lab_zhr 被创建并关联到本地的 gitlab/dev_carlogo_lab_zhr 分支。

  1. 基于 gitlab 仓库的 dev_carlogo_lab_zhr 分支,新建一个分支,并切换到该分支,命名为 “gitlab_”
git checkout -b gitlab_ gitlab/dev_carlogo_lab_zhr

此时我们的仓库B就有了一个基于仓库A内容的分支 “githubB”,后续我们将 “githubB” 分支代码合并到master就可以了。

使用 git branch 查看所有分支

mi@mi-LEGION-REN9000K-34IRZ: ~/work/hemera_mujoco$ git branch
* gitlab_
  master
  mobile_arm
  1. 我们切换到需要合并的分支 master
git checkout mobile_arm

第 4 步我们创建了即将被合并分支 “githubB” ,默认是在当前分支上的,所以我们需要切换回我们的目标分支。

  1. 合并
git merge gitlab_ --allow-unrelated-histories

然后可以在 vscode 中进行代码合并 合并完后 commit