# git 基本操作和分支操作
# 一、基本操作
# 版本控制
首先理解一下版本控制,版本控制是一种记录若干个文件变化内容,以便将来查阅特定版本修订情况的系统。
# 创建版本库
可以将其理解为一个目录,这个目录里所有文件都可以被管理,所有文件的修改,删除,git
都可以跟踪,以便将来追踪历史,因而也可以还原。
mkdir folderName # 这样就创建了一个 folderName 文件夹
cd folderName # 这样就打开了文件夹
pwd # 显示当前目录
2
3
4
5
6
# 将当前目录变为 git 可管理的仓库
git init
# 在当前文件夹中创建文件
直接新建 txt
文件。
# 把文件添加到版本库
把文件放到 git
仓库需要两步
git add filename # 包括文件后缀,将文件添加到暂存区。
git commit -m "这里面的内容是说明" # 用命令 git commit 告诉 git,将文件添加到仓库,将暂存区添加到当前分支。
2
3
# 查看仓库当前状态
git status
# 查看具体修改的内容
git diff + filename
# 显示提交日志
git log
# 版本号
commit id
不是递增的数字,是根据 SHA1
计算出来的一个非常大的数字,用十六进制表示,每提交一个新版本,git
将其自动串成一条时间线。
HEAD
表示当前版本,HEAD^
表示当前版本的上一版本,HEAD^^
表示当前版本的上两版本,往上数 100
个版本呢,不可能写一百个 ^
,因此存在另一种方法为 HEAD~100
。
# 版本回退
git
内部有一个指向当前版本的 HEAD
指针,回退的时候,指针就指向需要回退的那个版本去了。
git reset --hard HEAD^ # 会退到上一版本
git reset --hard + 版本号 # 就会来到版本号的那个版本
2
# 记录每一次命令
git reflog
# 名词解释
Changes to be committed
已暂存状态 还没到分区
modified: readme.txt
,readme.txt
这个文件被修改过了
nothing to commit, working tree clean
没有需要提交的
Changes not staged for commit
还没到暂存区
Untracked files
未被添加的文件
Fast-forward
快进模式
工作区: 电脑上能看到的目录。
版本库: 工作区的隐藏目录 .git
,这个不是工作区,而是 git
的版本库
暂存区: stage
或者 叫做 index master
,git
为我们自动创建的第一个分支。
# 查看工作区与版本库最新版本的区别
git diff HEAD -- 文件名 # 注意-- 与文件名之间有空格
# 提交的理解
第一次修改然后 git add
即将文件添加到暂存区中
第二次修改了然后直接 git commit -m
将暂存区的文件提交到分区里,那么分区里是不会有第二次修改的内容。
为什么呢?因为 git commit -m
是把暂存区里的文件提交到分区里,而第二次修改的内容没有在暂存区里。
# 提交的顺序
- 先手动修改文件
- 查看当前状态
- 查看修改的与之前的版本有何差别
- 添加到暂存区
- 将暂存区的文件添加到分区
# 丢弃工作区的修改
git checkout -- file # -- 非常重要,不要漏掉
这边需要分两种情况
- 文件修改后未添加到暂存区中,撤销修改就回到未修改的情况。
- 文件修改后并且添加到暂存区后再次修改(第二次修改了),撤销修改就把第二次修改撤销了,回到添加到暂存区的状态。
# 丢弃暂存区的修改
git reset HEAD file 将暂存区的修改撤销掉重新放回工作区,但是工作区现在被修改了,所以我们需要再一次丢弃工作区的修改 git checkout -- file
# 删除文件
rm filename # 工作区的删除但是版本库里面还有
# 从版本库中删除
git rm test.txt
# 从版本库中恢复到工作区
git checkout -- test.txt
git checkout 就是用版本库的内容覆盖工作区的内容。
2
# 将本地的仓库与远程的关联
git remote add origin git@github.com:stevenling/learngit.git
# 第一次将本地库的内容推送到远程库上
git push -u origin master # master 是当前分支名
# 以后本地直接提交
git push origin master
# 克隆仓库
需知道仓库的地址,常用。
git clone git@github.com:torvalds/linux.git
# 二、分支
# 创建与合并分支
每次提交,git 把它们串成一条时间线,这条时间线就是分支。
目前只有一个主分支,即 master 分支。HEAD 不是指向提交,而是指向 master 分支,master 指向提交,HEAD 指向的就是当前分支。
当我们创建一个新的分支,例如 dev 时,git 新建了一个指针 dev 指向和 master 一样的提交,就是 dev 与 master 共同指向一个相同的提交,然后让 HEAD 指向 dev,就表示当前分支在 dev 上面了。
从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一下,dev 指针往前移动一步,master 原地不动。 合并就让 master 指向完成一切操作的 dev 的当前提交。
合并完,也可以删除 dev 分支。
# 创建并切换分支
git checkout -b dev # dev 是分支名
# 相当于以下两条命令
git branch dev # 创建分支
git checkout dev # 切换分支
2
3
4
5
# 查看当前分支
git branch # 会列出所有分支,当前分支前面有*号
# 合并指定分支到当前分支
git merge dev # dev 是指定分支名
# 删除分支
git branch -d dev # dev 是要被删除的分支名