git使用手册
版本 | 日期 | 修改人 | 备注 |
---|---|---|---|
V1.0 | 2023/10/18 | 郭小龙 | 创建文件 |
[TOC]
一、新建仓库
仓库初始化
# 初始化仓库 git init
使用该命令初始化时会在当前目录生成
.git
目录,该文件目录可以认为就是git仓库。将当前目录的程序提交到仓库后,当目录下的文件发生变化可使用git进行恢复。裸仓初始化
git的裸仓即以当前目录为仓库目录,不能在当前目录存储代码文件等,当前目录完全由git命令管理。常用于服务器仓库
# 创建裸仓,若跟仓库名则在当前名录下创建指定名称的目录,并在目录下创建裸仓 # 若不指定则直接在当前目录下创建裸仓 git init --bare <仓库名>
仓库克隆
仓库克隆可以直接将远端仓库克隆到本地,仓库克隆之后,后续的同步可以用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) 文件状态
未跟踪文件(Untracked files)
未跟踪的文件一般是从未提交到仓库的新文件,例如初始化仓库后新建的文件
Untracked files: (use "git add <file>..." to include in what will be committed) main.c
未提交的更改(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
未缓存的修改(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管理的重要概念,可以创建多个分支在多个分支上开发不同的功能,也可以创建开发分支,在开发分支上开发新的功能,当新功能稳定后合并到主分支。
分支创建、删除与切换
# 创建新的分支,创建的新分支同步当前分支的状态 git branch <分支名> # 删除指定分支 git branch -d <分支名> # 检出到指定版本(分支名是指向指定分支的最新版本) # 切换到新分支 git checkout <分支名>
合并
分支合并是将其它分支新的更改更新到当前分支,当两个分支同时修改一个文件时可能会产生冲突,需要手动解决冲突
# 将dev中的修改合并到master,合并后dev分支不变,master分支中包含dev分支中的修改 git checkout master git merge dev
变基
# 变基可以在子分支同步主分支的更新 # 例如在子分支开发一段时间,主分支也同步推进,需要更新主分支的修改时可以进行变基(一般只在子分支同步主分支的修改,不应在主分支进行变基) git rebase master
五、远程管理
1) 远程服务器设置
若是从远程服务器拉取的代码,仓库中应该带有远程服务器的设置。也可以进行手动配置
# 添加远程服务器
git remote add <服务器名> <远程仓库URL>
# 例如
git remote add origin https://github.com/rockchip-linux/kernel.git
查看当前的远程服务器
git remote -v
2) 推送与拉取
推送
推送是将本地的修改推送到服务器中,在推送的过程中也存在合并,若在上次拉取之后有其他人在该分支进行推送,并修改了同一文件,则可能存在合并冲突。
# 推送master到origin服务器上 git push origin master
拉取
拉取用于将服务器上某个分支的变动拉取到本地
git pull origin master
在远程创建分支
在远程创建分支只需要在本地创建分支并将分支push到服务器即可
git branch dev git push origin dev
删除远程分支
# 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>