本地版本
创建本地仓库
创建仓库的过程其实就是将一个普通的文件夹升级为一个具备版本控制能力的文件夹
# 创建文件夹
mkdir hello-git
# 改变工作目录到hello-git
cd hello-git
# 初始化Git相当将文件夹升级为仓库
git init
复制代码
复制代码
实际上git命令会在文件夹下创建一个.git文件夹所有后面神奇的版本控制功能都是通过这个文件夹里面的这些神奇的文件实现的。
tree -a
复制代码
复制代码
将文件添加到版本库
首先我们创建一个文件
# 创建一个文件
echo 'Step01 Create File' >> README.md
复制代码
复制代码
然后我们查看一下版本库的状态
git status
复制代码
复制代码
我们会发现Git会提示我们这个文件属于未跟踪文件 如果在Vscode中
文件也会用绿色表示
将文件添加到版本库
git add README.md
复制代码
复制代码
添加完成后我么你发现这个时候文件状态变为要提交状态。 这是因为相对于旧的版本记录Git发现新添加了一个文件。我们试用git status就可以看到这样的提示。
从暂存中恢复文件
一旦文件被提交到版本库实际上Git就会将README文件的快照已经缓存了一份到暂存盘,如果有需要你还可以将这个镜像取出来。不信的话我们可以做一个小实验。
# 删除文件
rm -f README.md
# 从缓存区检出文件
git checkout README.md
# 查看文件
cat README.md
复制代码
复制代码
另外如果你想一次添加多个和放弃跟踪可以参考下面的方法
添加多个文件跟踪
# 添加本目录下文件具备递归文件夹功能
git add .
复制代码
复制代码
取消跟踪
# 取消添加
git rm --cached README.md
复制代码
复制代码
忽略文件.gitignore
如果你希望在使用 add .的时候忽略某一个文件可以在目录下创建一个 .gitignore文件
#.gitignore
# 忽略dist.js
dist.js
复制代码
复制代码
这个时候就可以让git文件放弃对此文件的关注。 当然如果你曾经将忽略的文件添加到git的跟踪列表中的话,即使你在ignore文件中声明了,git也不会主动放弃跟踪
提交代码commit
提交代码是指已经完成了某一阶段的代码开发比如你完成了某一个代码功能(features)或者修改了某一个代码缺陷(fix),你就可以创建一次代码提交。
git commit -m 'add README'
复制代码
复制代码
提交的本质是讲原有工作区的代码提交到本地仓库中,我们看一下提交前后的对比。
保存临时工作成果Stash
在你需要并行做好几件事的时候,比如你正在开发一个功能程序开发到一半,有一个紧急的bug需要处理又或者你突然对另外一个新特性来了思路,但是你现有的代码还在一个中间状态甚至编译都有问题。你需要可定需要一个功能保存现在的工作现场,然后去干另外一件事。这个时候stash功能就可以帮助你解决。
# 建立一个临时的工作成果
echo 'TEMP xxxx' >> README.md
# 保存工作现场到栈
git stash
# 从栈中弹出工作现场
git stash pop
复制代码
复制代码
放弃修改
git restore .
复制代码
复制代码
回退到上一个提交
首先我们修改一下文件,再做一次提交
echo 'STEP02 ADD FUN01' >> README.md
# 参数-a 是先添加到缓冲区再提交的意思
git commit -am 'README ADD STEP02'
复制代码
复制代码
这个时候我们会有两个提交记录 我们可以用git log检查一下
git log
git log –-oneline # 简短日志
git reflog # 操作记录 包括回退记录也会被显示
复制代码
复制代码
# 只是版本回退 不更新工作区
git reset HEAD^
# 不但版本回退 也会更新工作区(文件目录)的文件到上一个版本
git reset --hard HEAD^
复制代码
复制代码
工作区(Working Directory)、缓存区(Stage)、版本库(Repository)小结
- 工作区 — 就是文件目录因为你的开发工作就是对文件的修改所以叫做工作区
- 缓存区 — 没有提交前也就是没有完成完成工作结果代码保存的地方
- 版本库 — 每一个工作结果的时间带会被按照不同的提交记录保存起来
分支管理
创建分支开发
默认情况下我们会处于master分支,在开始开发前我们首先要做的就是切分一个新的分支。比如开发一个叫做FunA的功能点。
# 分支A
# 创建分支并切换分支到funA
git checkout -b 'funA'
# 完成功能
echo 'FunA XXXXXXX' >> README.md
# 提交功能
git commit -am 'funA add'
# 检出master分支
git checkout master
# 合并将开发分支合并到主分支
git merge funA
# 可以利用-d合并的同时删除分支
git merge -d funA
复制代码
复制代码
分支的查看、删除
# 查看
git branch
# 查看 - a 包括远程分支
git branch -a
# 删除
git branch -D <分支名称>
复制代码
复制代码
冲突解决
假设两个分支都针对同一行代码进行修改,就会造成冲突,需要人工确定那一个分支得到保留。 就好比两个人一个主张走A路线,另一个主张走B路线。最后需要再合并的时候决定到底走哪个路线。
首先我们先制造这样一个冲突,假设我们将开启连个分支 分别将README文件的第一行 做不同而修改
-
step01 : Step01 Create File AAA
-
step01 : Step01 Create File BBB
创建分支并切换分支到funA
git checkout master
git checkout -b ‘funA’
echo ‘STEP01 AAA’ > README.md
git commit -am ‘step01 AAA’创建分支并切换分支到
git checkout -b ‘funB’
echo ‘STEP01 BBB’ > README.md
git commit -am ‘step01 BBB’可以利用-d合并的同时删除分支
git checkout master
git merge -d funA
git merge -d funB复制代码
由于对同一行代码进行了修改这个时候Git就需要人工区合并代码 如果 想要撤销merge状态
git merge --abort
复制代码
复制代码
如果在VSCode编辑器中会更加清晰一些
下面要做的就是人工保留你需要的部分, 然后进行一次merge提交。其实取舍AAA还是BBB本身就是一次变更所以其实就是一次的代码commit。
git commit -am 'Merge branch funB'
复制代码
复制代码
最后我们可以通过log看一下这次合并过程
git log --graph --pretty=oneline --abbrev-commit
复制代码
复制代码
清洗提交历史 — squash方式合并
如果你的分支开发历经各种磨难,里面有很多细节的功能进展你不希望其他人了解,又或者你在开发的过程中肚子饿了,希望通过一次的commit来保留中间成果。但是最终提交的时候不希望你的这些中间细节被被人了解,可以采用这样的办法
# 创建分支并切换分支到funA
git checkout master
git checkout -b 'funA'
echo 'STEP02 BBB' >> README.md
git commit -am 'FunA commit 01'
echo 'STEP03 BBB' >> README.md
git commit -am 'FunA commit 02'
# 切换master分支
# 使用squash方式提交 只合并不commit
git merge --squash funA
复制代码
复制代码
这个时候我们可以用git status查看一下发现合并代码后并没有提交。只是将所有的提交都整合到了一起放在暂存区。
# 创建分支并切换分支到funA
git commit -am 'funA update'
复制代码
复制代码
这个时候我们可以使用commit方式进行提交留下光辉的而干净的一笔。
Rebase变基操作
去除版本合并痕迹 (待续)
其他命令总结
# 删除分支
git branch -D <branch_name>
复制代码
复制代码
标签管理
标签管理就是给自己的代码打上版本标记。其实就是给自己的版本设置里程碑。
# 将最新提交打标签
git tag v1.0
# 将指定commit打标签
git tag v0.9 4ab025
# 查看打标签
git tag
# 查看与某标签之间的差距
git show v0.9
复制代码
复制代码
远程仓库GitHub
如何获取远程仓库
- GitHub 世界上最大的开源社区
- Gitee 国内的速度快
- 自己搭建Gitlab
(后续会教大家如何一行配置搞定gitlab搭建)
git建立远程仓库
另外与远程资源库通讯通常采用ssh协议,所以需要将你的ssh公钥添加到github账户中
获取公钥的方法可以参考 公钥获取方法
添加远程分支
# 添加远程分支
git remote add origin git@github.com:su37josephxia/hello-git.git
复制代码
复制代码
查看
git remote -v
复制代码
复制代码
推送 push
git push
复制代码
复制代码
拉去 fetch
git fetch
# 如果有多个远程源时
git fetch <拉去源>
复制代码
复制代码
拉去 pull
相当与先fetch + merge
git pull
复制代码
复制代码
GitHub之Watch
表示关注、这个项目的所有动态包括PR ISSUE你的信息中心和邮箱都会收到。
GitHub之Star
表示点赞、表示对这个项目支持。 github.com/su37josephx… Star一下我这个项目。
欢迎大家来造轮子
GitHub之Fork
相当于复制了目前项目的文件,后续变化必须手动更新。 手动更新方法如下:
# 本地新加一个新的远程库upstream
git remote add upstream https://github.com/vuejs/vue-next
复制代码
# 从远程仓库拉去代码
git fetch upstream
# 切换分支
git chekout master
# 合并远程分支
git merge upstream/master
复制代码
复制代码