Git 基本使用

私人 Git 仓库搭建[1]

GitHub 在面向开源开放协同场景具有显著优势,但同时也不适用于托管具有私密性的个人项目,比如磕(DA)盐(GONG)人用 LaTEX 撰写的论文。借助服务器搭建私人 Git 仓库用于论文撰写和修改全流程版本管理是不二选择。通过 Git 托管论文可以进行有效的内容对比和校验等,比如使用版本对比工具可以清晰明了地定位导师修改的内容。

搭建步骤

  • 安装 Git
1
2
3
4
5
6
# macOS
brew install  git
# centos
yum install -y git
# ubuntu  
sudo apt-get install git
  • 创建一个 Git 用户用来运行 Git 服务;提示没有权限时加上sudo
1
2
useradd git
passwd git # 创建Git用户密码,客户机非免密登录时需要
  • 创建仓库
1
2
3
4
5
su - git # 切换到Git用户
cd /home/git # 进入Git用户的根目录
mkdir test.git # 创建test仓库
cd test.git
git --bare init # 仓库初始化,初始化仓库时一定要使用裸库否则不能 push

配置客户机免密登录

收集需要免密登录的客户机公钥,一般位于~/.ssh或者C:\Users\saul\.ssh 中的 id_rsa.pub文件中;将公钥写入服务器的/home/git/.ssh/authorized_keys文件中(若没有则创建)。

  • 首先客户机生成并获取公钥:
1
2
ssh-keygen -t rsa -C "youremail@email.com" # 有配置GitHub公钥可直接使用
cat ~/.ssh/id_rsa.pub # 复制打印出的公钥
  • 服务器配置
1
2
3
4
5
6
cd /home/git
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
vi .ssh/authorized_keys # 粘贴公钥
chmod 600 .ssh/authorized_keys  

客户机克隆仓库

  • 正常未修改 SSH 端口:
1
git clone git@104.153.102.92:/home/git/test.git
  • 修改 SSH 端口配置方式:
1
git clone ssh://git@104.153.102.92:10982/home/git/test.git

Git 放弃本地修改

尚未使用 git add 缓存代码

可以使用 git checkout -- filepathname (比如:git checkout -- readme.md,不要忘记中间的 -- ,不写就成了检出分支了!!)。放弃所有的文件修改可以使用 git checkout . 命令。

此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件,因为刚新建的文件还没已有加入到 git 的管理系统中,所以对于 git 是未知的,自己手动删除就好了。

已经使用 git add 缓存代码

可以使用 git reset HEAD filepathname (比如:git reset HEAD readme.md)来放弃指定文件的缓存,放弃所以的缓存可以使用 git reset HEAD . 命令。

此命令用来清除git对于文件修改的缓存,相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(未使用git add缓存代码)所示的状态。继续用处理(未使用git add缓存代码)中的操作,就可以放弃本地的修改。

已经使用 git commit 提交代码

可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态。此命令可以用来回退到任意版本:git reset --hard commitid 你可以使用 git log 命令来查看git的提交历史。

  • 本地新增了一堆文件(并没有git add到暂存区),想放弃修改。

    • 单个文件或文件夹:rm filename, rm -rf dir
    • 所有文件/文件夹:git clean -xdf
  • 本地新增了一堆文件(已经git add到暂存区),想放弃修改。

    • 单个文件/文件夹:git reset HEAD filename
    • 所有文件/文件夹:git reset HEAD .

Git 版本回滚

首先查询历史对应不同版本的ID, 用于回退定位:

1
git log --pretty=oneline

恢复到历史版本:

1
git reset --hard fae6966548e3ae76cfa7f38a461c438cf75ba965

把修改推到远程服务器:

1
git push -f -u origin master

重新更新就可以了:

1
git pull

仓库子模块的使用 [2]

项目中经常使用别人维护的模块,在 git 中使用子模块的功能能够大大提高开发效率。使用子模块后,不必负责子模块的维护,只需要在必要的时候同步更新子模块即可。

  • 添加子模块
1
git submodule add url # url 既可以是https也可以是ssh
  • 克隆带子模块的仓库

克隆的仓库中,子模块中没有代码,需要初始化及更新;

1
2
git submodule init # 初始化子模块
git submodule update # 更新
  • 子模块拉取远程更新代码

如果想要在子模块中查看新工作,可以进入到子模块的目录中运行 git fetchgit merge,合并上游分支来更新本地代码。

1
2
git fetch
git merge origin/master

如果不想在子目录中手动抓取与合并, 在主仓库的根目录运行 git submodule update --remote,Git 将会进入子模块然后抓取并更新。


  1. 服务器上的 Git 

  2. Git 工具 - 子模块 

updatedupdated2021-10-292021-10-29