git使用手册

版本 日期 修改人 备注
V1.0 2023/10/18 郭小龙 创建文件

[TOC]

一、新建仓库

  1. 仓库初始化

    # 初始化仓库
    git init

    使用该命令初始化时会在当前目录生成.git目录,该文件目录可以认为就是git仓库。将当前目录的程序提交到仓库后,当目录下的文件发生变化可使用git进行恢复。

  2. 裸仓初始化

    git的裸仓即以当前目录为仓库目录,不能在当前目录存储代码文件等,当前目录完全由git命令管理。常用于服务器仓库

    # 创建裸仓,若跟仓库名则在当前名录下创建指定名称的目录,并在目录下创建裸仓
    # 若不指定则直接在当前目录下创建裸仓
    git init --bare <仓库名>
  3. 仓库克隆

    仓库克隆可以直接将远端仓库克隆到本地,仓库克隆之后,后续的同步可以用pull拉取远端的代码。

    # git clone <用户名>@<IP>:<仓库路径>
    # 例如
    git clone git@192.168.8.229:~/hi/ss928.git
    
    # 多个分支时默认克隆master分支
    # 使用-b参数指定要克隆的分支
    git clone -b dev git@192.168.8.229:~/hi/ss928.git

二、仓库的基本配置

仓库最基本的配置是用户名和邮箱,若不配置会导致代码无法提交,因为该信息是提交程序的必要信息。

# git中的所有配置均通过git config命令进行配置

# 在当前仓库配置用户名
git config user.name "ebaina"
# 在当前仓库配置邮箱
git config user.email "<邮箱>"

# 若是当前登录的用户下所有仓库都需要的配置,可以使用--global关键字,例如
git config --global user.name "ebaina"

配置在当前仓库.git/config文件

全局配置在~/.gitconfig

三、文件状态、缓冲区与提交

1) 文件状态

  1. 未跟踪文件(Untracked files)

    未跟踪的文件一般是从未提交到仓库的新文件,例如初始化仓库后新建的文件

    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            main.c
  2. 未提交的更改(Changes to be committed)

    未提交的修改是已经加入到缓冲区,但是未提交的文件,在文件前会标注操作的类型【新建、删除、修改等】

    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
            new file:   main.c
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   main.c
  3. 未缓存的修改(Changes not staged for commit)

    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   main.c

2) 缓冲区

缓冲区是在提交版本之前临时存储修改的位置。

# 查看当前仓库状态
git status

# 添加文件到缓冲区
git add <file path>
# 添加所有修改到缓冲区
git add -A

# 将指定文件移出缓冲区
git reset <file path>
# 将所有文件移出缓冲区
git reset

3) 提交

提交是git仓库推进的节点,每次提交将当前仓库缓冲区中的文件提交到仓库中作为一个版本。每个提交包含提交人、邮箱、附带的文本信息,提交后git仓库会为每个提交创建hash值作为版本号。hash值可用于后续操作中对该版本的引用,hash值可以在不冲突的情况下简写,至少4位。

# 创建一次提交
# -m 指定提交附带的文本信息
git commit -m "init"

# 查看提交日志
git log

4) 文件恢复

# 撤销所有修改恢复到指定版本号的状态
# 若不指定版本号则默认为最近一次提交
# 恢复后会和指定的版本号刚提交时一个状态,该版本号后续的提交也会消失
git reset --hard <版本号>

四、分支管理

分支是git管理的重要概念,可以创建多个分支在多个分支上开发不同的功能,也可以创建开发分支,在开发分支上开发新的功能,当新功能稳定后合并到主分支。

  1. 分支创建、删除与切换

    # 创建新的分支,创建的新分支同步当前分支的状态
    git branch <分支名>
    
    # 删除指定分支
    git branch -d <分支名>
    
    # 检出到指定版本(分支名是指向指定分支的最新版本)
    # 切换到新分支
    git checkout <分支名>
  2. 合并

    分支合并是将其它分支新的更改更新到当前分支,当两个分支同时修改一个文件时可能会产生冲突,需要手动解决冲突

    # 将dev中的修改合并到master,合并后dev分支不变,master分支中包含dev分支中的修改
    git checkout master
    git merge dev
  3. 变基

    # 变基可以在子分支同步主分支的更新
    # 例如在子分支开发一段时间,主分支也同步推进,需要更新主分支的修改时可以进行变基(一般只在子分支同步主分支的修改,不应在主分支进行变基)
    git rebase master

五、远程管理

1) 远程服务器设置

若是从远程服务器拉取的代码,仓库中应该带有远程服务器的设置。也可以进行手动配置

# 添加远程服务器
git remote add <服务器名> <远程仓库URL>

# 例如
git remote add origin https://github.com/rockchip-linux/kernel.git

查看当前的远程服务器

git remote -v

2) 推送与拉取

  1. 推送

    推送是将本地的修改推送到服务器中,在推送的过程中也存在合并,若在上次拉取之后有其他人在该分支进行推送,并修改了同一文件,则可能存在合并冲突。

    # 推送master到origin服务器上
    git push origin master
  2. 拉取

    拉取用于将服务器上某个分支的变动拉取到本地

    git pull origin master
  3. 在远程创建分支

    在远程创建分支只需要在本地创建分支并将分支push到服务器即可

    git branch dev
    git push origin dev
  4. 删除远程分支

    # git push <服务器名> --delete <分支名>
    git push origin --delete dev

六、制作patch

通过git diff命令可以创建不同commit版本之间的patch。通过patch可以快速的在其它项目中添加已调试过的功能。

# 查看当前到最后一次提交之后的修改
git diff

# 查看当前到指定commit之间的修改
git diff <commit>

# 查看两个commit之间的修改
git diff <old commit> <new commit>

参考文档

  1. git rebase后不能push问题
0%