Git使用
一、git的诞生
- Linux代码量过于庞大,Linus手动合代码合不过来
- BitMover免费提供BitKeeper,遭到破解,中止合作
- Linus历时两周时间用C写出了Git
- 2008年Github上线
二、集中式vs分布式
集中式 | 分布式 | |
---|---|---|
相关系统 | CVS、SVN | Git |
是否有中央服务器 | 是 | 否 |
是否必须联网 | 是 | 否 |
三、安装Git
- Linux
1 |
|
- MacOS
通过Homebrew安装
1 |
|
- Windows
直接从官网下载安装器
四、Git初始配置
设置用户名和邮箱
1 |
|
五、创建版本库(repository)
- 如何创建
创建一个目标文件夹,并进去文件夹
在命令行中输入”git init”
观察到文件夹中生成了一个名为“.git”的隐藏目录,即表示创建成功
该目录用于跟踪管理版本,不要随意修改
- 把文件添加进Repo
事前注意
版本控制系统只能跟踪文本类的变化
文本建议统一使用UTF-8编码
Windows系统默认的记事本会在UTF-8编码文件的开头添加BOM字符,导致各种莫名奇妙的问题,使用Notepad++代替记事本,Notepad++默认把编码设置为“UTF-8 without BOM”,即可解决
- 编写一个readme.txt文件
使用“git add”将文件添加到Repo中
1 |
|
- 使用“git commit”将文件提到到Repo中
1 |
|
其中-m 用于输入本次提交的说明
提交成功后会告诉你两件事情:
1 |
|
六、观察修改
修改readme.txt文件
使用git status观察结果
结果展示readme.txt被修改过使用git diff查看修改内容
可以看到绿色的就是修改后的结果使用git add添加文件,然后用git status再次查看
add后,下面这段变成绿的了使用git commit提交文件,再用git status查看
七、版本回退
- 使用git log查看历史提交记录
1 |
|
- 使用git reset来回退版本
HEAD表示当前版本,HEAD^表示上一个版本,HEAD~100表示往上100个版本
^在cmd控制台中被认为是个换行符,所以系统一直提示你More?
解决办法:- 加引号: git reset –hard “HEAD^”
- 加一个^: git reset –hard HEAD^^
- 换成~: git reset –hard HEAD~ 或者 HEAD~1
恢复到未来的版本,只需要找到那个版本的哈希数前四位即可
- 使用git reflog查询你做出的每一次命令
八、工作区和暂存区
工作区
即本地工作目录版本库(Repository)
- .git就是版本库
- stage是版本库中的一个暂存区
- git add 这个操作是将修改文件从工作区添加到暂存区
- 版本库中有一个主分支叫master
- git commit 就是将暂存区的文件添加到master分支
- HEAD指针指向当前版本
九、撤销修改
- 在工作区未add到暂存区
1 |
|
- 已经add到暂存区
1 |
|
- 已经commit上去
参考版本回退
十、删除文件
1 |
|
十一、远程仓库
- 配置Github
- 创建SSH Key
1 |
|
生成的id_ras为私钥,id_rsa.pub为公钥
- 在Github配置SSH Key
- 添加远程库
- 在Github上创建Repo
- 将本地与远程库关联
1 |
|
- 将本地的文件推到远程
1 |
|
- 从远程库克隆
用Clone将远程库拖到本地
1 |
|
十二、分支管理
- 创建与合并分支
master指向提交,HEAD指向master
新建一个dev分支时,HEAD指向dev
合并的时候,就是把master指向dev当前的提交
实战
- 创建 dev 分支
1
git checkout -b dev
相当于:
1
2git branch dev
git checkout dev- 查看当前分支
1
git branch
- 合并分支
1
git merge dev
- 删除分支
1
git branch -d dev // -D 可以强行删除尚未合并的分支
switch
- checkout 一功两用,让人迷惑
- 新版本使用Switch来创建分支
1
git switch -c dev
- 解决冲突
<<<<<<<,=======,>>>>>>>标志出不同分支的内容,需要手动修改
查看分支合并情况
1 |
|
- 分支管理策略
使用–no-ff禁用Fast forward,更方便地观察分支在log中的合并情况
1 |
|
- Bug分支
正在开发feature时,突然需要修复临时Bug的解决方案
- 保存当前的工作现场
1 |
|
修复BUG
恢复工作现场
1
2
3
4
5git stash list
git stash pop
git stash apply
git stash apply stash@{0}
git stash drop将修复的BUG合并到当前分支
1 |
|
- 多人协作
- 查看远程库信息
1 |
|
查看远程库详细信息
1
git remote -v
推送分支
哪些分支要推送到远程
- master分支是主分支,需要时刻与远程同步
- dev分支是开发分支,团队成员需要在上面工作,所以也要推送到远程
- bug和feature看你们是否合作开发
使用 Push 推送分支
1
git push origin dev
抓取分支
使用checkout抓取远程分支
1
git checkout -b dev origin/dev
将本地的dev分支与远程的dev分支关联起来
1
git branch --set-upstream-to=origin/dev dev
从远程拉取最新版本
1
git pull
- Rebase
Git会用 HEAD->master 和 origin/master 分别标识本地当前版本和远程仓库的当前版本
使用场景
合并 commit 记录,保持日志简介
合并最近4次提交记录
1
git rebase -i HEAD~4
进入vi模式,修改提交记录
如果不小心退出了vi,使用 –edit-todo 恢复
1
git rebase --edit-todo
修改完保存
1
git rebase --continue
相比 merge 来说会减少分支合并的记录
- 你创建了一个 feature 分支进行开发
- 你的同事完成了一次 hotfix,合并到 master 分支里面,这时 master 已经领先你的 feature 分支
- merge 之后,查看提交记录,这时会发现日志有点混乱
- 回到第二步,使用rebase
1
(feature) git rebase master
- 把 feature 分支里面的每个 commit 取消掉
- 临时保存为 patch 文件,存在 .git/rebase 目录下
- 把 feature 分支更新到最新的 master 分支
- 把上面保存的 patch 文件应用到 feature 分支上
- 你创建了一个 feature 分支进行开发
是一个危险命令,改变了提交历史,可能会导致其它人提交丢失
十三、标签管理
- 创建标签
打标签
1
git tag <name>
- 默认标签是打在当前 commit 上的
给历史记录打标签
1
git tag <name> <versioncode>
- 使用 -a 指定标签名, -m 指定说明文字
查看所有标签
1
git tag
查看单个标签信息
1
git show <name>
- 操作标签
删除标签
1
git tag -d <name>
推送标签到远程
1
git push origin <name>
推送所有标签到远程
1
git push origin --tags
删除远程标签
1
2git tag -d <name>
git push origin :ref/tags/<name>
十四、自定义Git
- 让Git输出日志显示颜色
1 |
|
- 忽略特殊文件
在根目录创建一个 .gitignore
- 参考配置
需要哪些文件?
- 系统生成的文件
- 编译生成的中间文件和可执行文件
- 带有敏感信息的配置文件
强行提交被忽略的文件
1
git add -f <file>
检查文件是否被忽略
1
git check-igonre -v <file>
- 配置别名
将Status改为st
1
git config --global alias.st status
使用unstage代替回退文件
1
git config --global alias.unstage reset HEAD
显示最后一次提交信息
1
git config --global alias.last 'log -1'
美化log
1
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s%Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件位置
当前仓库
1
.git/config
全局
1
<系统用户目录>/.gitconfig
- 搭建 Git 服务器
- 安装git
1
sudo yum install git
- 安装git
- 创建 git 用户
1
sudo adduser git
- 创建 git 用户
- 创建证书登录
- 把所有 id_rsa.pub 导入到 /home/git/.ssh/authorized_keys
- 初始化 Git 仓库
选定目录为/home/git/sample.git,创建仓库
1
sudo git init --bare sample.git
- 这是一个裸仓库,没有工作区
- 纯粹为了共享,不能直接修改
修改用户为git
1
sudo chown -R git:git sample.git
- 禁用 shell 登录
- 编辑 /etc/passwd
1
2git:x:1001:1001:,,,:/home/git:/bin/bash
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
- 克隆远程仓库
1
git clone ssh://git@<ip>:<port>/home/git/sample.git
- 克隆远程仓库
管理公钥
- Gitosis
管理权限
- Gitolite
十五、取消对文件的跟踪
在项目中遇到一个问题,就是改了一个dev文件之后,不希望上传到服务器。
因为这会导致其他人本地的dev文件也跟着改动。
但是已经提交过的文件,在.gitignore中设置是无效的。
于是在网上搜寻的时候,发现一种方法:
1 |
|
这是一个坑,它会把服务器中的dev文件也一起删除掉
正确的做法是使用以下指令:
1 |
|
参考
Git教程- 廖雪峰
How to stop tracking and ignore changes to a file in Git?
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!