1. Git基础和入门

1.1 Git简介

Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工 作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年, 整个项目组开始启用一个专有的分布式版本控制系统BitKeeper 来管理和维护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关 系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开 源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用BitKeeper 时的经验教训, 开发出自己的版本系统。 他们对新的系统制订了若干目标:

1.2 三种状态

Git 有三种状态,你的文件可能处于其中之一:

  • 已提交(committed

已提交表示数据已经安全的保存在本地数据库中

  • 已修改(modified)

已修改表示修改了文件,但还没保存到数据库中

  • 已暂存(staged)。

已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区

文件的状态变化周期
Figure: 文件的状态变化周期

1.3 Git使用的配置

  • 配置git的使用者的名字和邮箱 配置仓库的使用人的名字和邮箱 用于提交时作记录,记录谁提交了,怎么联系到提交的人
    git config --global user.name "liuchuanjia"
    git config --global user.email ”1725523726@qq.com”
    
  • 配置ssh key
    ssh-keygen -t rsa -C "1725523726@qq.com"
    
    生成的key在~/.ssh/id_rsa.pub,与本地和git服务器握手的秘钥

1.4 .gitignore文档

项目中并不是所有的文件都需要提交代码仓库中,比如编译出来的中间文件和一些静态库的文件。

这时候就需要过滤这些文件,.gitignore文件就担任这这个角色。比如下面一个.gitignore文档

alps/ # 忽略提交 alps/目录
gree/build/
gree/bin/
gree/lib/
!gree/third_party/* # 不忽略 gree/third_party/目录下的所有文件
gree/third_party/cJSON/build/ # 忽略gree/third_party/cJSON/build/
gree/third_party/mbedtls-2.16.6/build/  # 忽略gree/third_party/mbedtls-2.16.6/build/
gree/googletest/build/
gree/sqlite-amalgamation-3310100/build
.repo/
.vscode/
wt # 忽略wt文件

1.5 入门

mkdir project && cd project # 新建一个项目目录,并进入项目目录
git init # 初始化一个git仓库
git add . # 把当前目录下的所有文件添加到暂存区,stage
git commit -m "this is a comment" # 提交代码,添加一些备注
git remote add origin git@gitee.com:twsa/gitbook-test.git # 添加远程仓库源
git push origin -u master # 将本地的提交历史推送到远程master分支, -u 表示的是默认,

1.6 git常用命令

  • git init 仓库初始化

使用这个命令会初始化一个git仓库,它作的工作就是创建一个.git/隐藏目录,这个目录下 有该仓库的一些描述文件。

  • git add 添加文件到暂存区
    git add –A # 添加当前目录下的所有文件
    git add filename/dir # 添加文件或者目录
    
  • git commit 提交代码
    git commit –m "一些备注"
    
  • git remote 远程仓库源的添加,删除
    git remote add <origin name> <url> # 添加远程源
    git remote remove <origin name> # 删除远程源
    git remote -v # 查看本地添加的远程源列表
    
  • git push 推送到远程仓库
    git push <远程源> <本地分支名>:<远程分支名> # 将本地分支推送到远程分支
    git push origin –-delete <分支名> # 删除远程分支 
    git push origin :<分支名> # 删除远程分支
    
  • git branch 分支的创建,删除,查看
    git branch <分支名> # 创建一个分支
    git branch -d <分支名> # 删除一个分支
    git branch # 查看本地分支
    git branch –a # 查看本地分支和已经拉取的远程分支
    
  • git checkout 切换分支
    git checkout <分支名> # 切换到某个分支
    git checkout –b <分支名> # 创建并切换到某个分支
    
  • git fetch 拉取远程仓库的某个分支,但不与本地分支合并
    git fetch origin <分支名> # 拉取某个远程分支的内容
    
  • git pull 拉取远程仓库的某个分支,与本地分支合并
    git pull origin <远程分支名>:<本地分支名>
    
  • git merge 合并分支
    git merge develop # 将develop分支合并到当前分支
    git merge --no-ff # 将develop分支合并到当前分支
    
  • git tag 给软件版本添加标签
    git tag 查看标签
    git tag –a v1.4 –m "my version 1.4" #创建附注标签
    git tag v1.4 # 创建轻量级标签
    git show v1.4 # 查看额外的标签信息
    git checkout v1.4 / git checkout –b master v1.4 # 检出标签
    
  • git log 查看提交日志
  • git reset 版本回退
    git reset –hard # 重置stage区和工作目录
    git reset –soft # 保留工作目录,并重置HEAD所带的新的差异放进暂存区
    git reset不加参数(默认--mixed) # 保存工作目录,并清空暂存区
    
  • git diff 版本内容比较

(1) git diff:

当工作区有改动,暂存区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文
件”;

当工作区有改动,暂存区不为空,diff对比的是“工作区与暂存区的共同文件”。

(2) git diff --cached 或 git diff --staged:

显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改(git
diff --cached和git diff –staged相同作用)

(3) git diff HEAD # 显示工作目录(已track但未add文件)和暂存区(已add但未commit文件)与最后一次commit之间的的所有不相同文件的增删改。

git diff HEAD~X或git diff HEAD^^^ # ...(后面有X个^符号,X为正整数):可以查看最近一次提交的版本与往过去时间线前数X个的版本之间的所有同(3)中定义文件之间的增删改。

(4) git diff <分支名1> <分支名2> #比较两个分支上最后 commit 的内容的差别

git diff branch1 branch2 --stat 显示出所有有差异的文件(不详细,没有对比内容)
git diff branch1 branch2 显示出所有有差异的文件的详细差异(更详细)
git diff branch1 branch2 具体文件路径 显示指定文件的详细差异(对比内容)

results matching ""

    No results matching ""