分布式管理工具git
别人的总结是别人,自己学习完要有自己的心得体会。
Git是 分布式 版本控制系统,不管可以管控代码,其他类型的文件也一样可以进行版本控制,很方便多人协作的情况。有点类似与现在的 WPS在线文档 ,是不过WPS是实时的,而Git相当于在线下做完在上传线上,达到同样的效果。
所谓分布式管理,就是代码的管理不依赖于中心服务器,每台终端都可以是代码服务器,这样极大降低了代码丢失的风险。
一、Git安装配置
工欲善其事必先利其器,相对于windows系列的下一步下一步的安装,我们着重看下Ubuntu环境下的Git安装与配置吧。【GitHub示例】
1. Git安装
## 哈哈,很简单!
sudo apt-get install git
2. Git版本库配置
# 创建仓库repository目录
mkdir MySpace
cd MySpace
touch test.txt
touch test.doc
# 初始化仓库,然后这个仓库下的所有文件都会被git监视
git init
ls -ah
# 将文件添加到暂存区stage
git add test.txt test.doc # 或 git add .
# 将文件提交到仓库,-m 后面是提交的备注信息
git commit -m "add test.txt file"
# 上面两步可以合并成一步操作,它会自动跟踪并提交有修改的文件;一般不推荐这种方法,因为它不能将文件添加到git管理里的
git commit -a "add test.txt file"
# 先GitHub推送需要先添加ssh-keygen
cd ~/.ssh
ssh-keygen
cat ~/.ssh/id_rsa.pub
# 将仓库里的数据提交到远程仓库(如:GitHub)
# GitHub中https://github.com/new新建远程仓库
# 将本地仓库与远程仓库关联
git remote add origin git@github.com:Crisimple/test_repository.git
# 把本地库的所有内容推送到远程库上
git push -u origin master # 首次向远程仓库推送加-u
# 从远程库克隆数据
git clone git@github.com:crisimple/test_repository.git
git clone https://github.com/crisimple/test_repository.git # 速度慢每次推送还得输入口令,不建议使用
二、后悔药
【GitHub示例】
1. 版本回退
# 1.版本回退
# 1.1. 查看提交日志
git log
# 简化输出信息
git log --pretty=oneline
# 查看每一次的提交记录,即使是回退的也可以查看
git reflog
# -----------------------------------------------------------------------
# 1.2. 回退版本
# 回退到上一个版本
git reset --hard HEAD^
# 回退到指定的版本
git reset --hard commit_id
# 撤销到暂存区
git reset --soft HEAD@{1}
# 干掉这个修改
git reset --hard HEAD@{1} # 或 git reset HEAD~2
2. 工作区
# 2.1 查看工作区的状态
git status
# 2.2 丢弃工作区的文件
git checkout -- test.txt
# 2.3 删除文件
git rm test.txt
三、分支管理
在多人协作的项目中,为了避免自己开发的代码与其他人产生冲突,拉出一个分支。
创建一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,而在自己的分支上干活,先提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样即安全又不影响别人工作。
1. 创建与合并分支
HEAD指向master(也就是当前分支),master指向提交。
# 创建dev分支,然后切换到dev分支,相当于接下来的两条命令
git checkout -b dev
git branch dev
git checkout dev
# 查看当前分支,当前分支前会标一个 * 号
git branch
# 切换到主分支,这时候查看master分支上是没有任何修改的
git checkout master
# 将dev分支上的工作成果合并到master上, git merge 用于合并指定分支到当前分支
git merge dev
# 合并完dev分支,就可以删除dev分支了
git branch -d dev
# git中更科学的切换分支用 switch
git switch master
# 创建并切换到新的分支上
git switch -c dev
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
2. BUG分支
软件开发中,bug就像是家常便饭一样。每个不管都可以通过一个新的临时分支来修复,修复后合并分支,然后将临时分支删除。
# 创建新的临时分支的时候,看下当前工作区的状态
git status
# 如果当前分支dev上的功能还没开发完毕,那么又需要紧急修复bug,可以将dev的修改存储起来
git stash
git status
# 确定是在那个分支上修复bug,如果是master分支上修复则从master上创建临时分支
git checkout master
git checkout -b issue-101
# 修复bug
git add modify_bug.py
git commit -m "fix issue 101"
# 修复完bug切换到master分支,合并bug分支,再删除issue-101分支
git checkout master
git merge --no-ff -m "merge bug fix 101" issue-101
# 恢复 dev 分支的工作进度
git checkout dev
git status
# 查看刚存储的开发工作
git stash list
# 恢复stash里的内容
# git stash apply恢复后,stash内容并不删除,通过git stash drop删除
git stash apply stash@{0}
git stash drop
# 或者通过git stash pop 恢复的同时会将stash内容删除
git stash pop
# cherry-pick命令,将复制一个特定的提交到当前分支
git cherry-pick commit_id
3. Feature分支
添加一个新的功能时,为了不把主分支搞乱。没添加一个新功能,最好新建一个feature分支,再上面开发完成后,合并,最后删除该feature分支。
# 创建并切换至feature分支
git checkout -b feature-vulcan
# 在feature分支开发
git add feature_test.py
git commit -m "add feature vulann"
# 切换到dev,合并分支
git status
git checkout dev
git merge feature-vulcan
# 突然间接到说该功能不用添加了
git branch -D feature-vulcan
4. 多人协作
以大家共同从GitHub上拉取代码开发合并为例。
# 推送分支
git push origin dev
# 抓取分支
git pull git@github.com:crisimple/crisimple.git
# 本地dev分支上开发,必须创建远程origin的dev分支到本地
git checkout -b dev origin/dev
# 查看远程库信息,使用git remote -v;
# 本地新建的分支如果不推送到远程,对其他人就是不可见的;
# 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
# 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
# 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
# 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
5. 解决冲突
四、标签管理
发布一个版本时,通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本就把那个标签使劲儿的历史版本取出来即可。所以标签也是版本库的一个快照,其实它就是指向commit的指针。
Git有commit,为什么还要引入tag?简化记忆,commit对应id太长,用tag v1.1容易记住且有名字有意义。
1. 创建标签
# 切换到要打标签的分支上
git branch
git checkout master
# 打一个新标签
git tag v1.0
# 查看已打过的所有标签
git tag
# 对指定的commit id打标签
git log --pretty=oneline --abbrev-commit
git tag v1.1 f53c633
# 查看标签信息
git show v1.1
# 打标签带参数,-a 指定标签名,-m 指定说明文字
git tag -a v1.2 -m "parameter introduction add"
2. 操作标签
# 删除标签
git tag -d v1.1
# 将某个标签的推送到远程
git push origin v1.0
# 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
# 删除远程的标签
git push origin :refs/tags/v1.2
五、自定义Git
1. 忽略特殊文件
在git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,git就会自动忽略这些文件。
echo "要忽略文件的名称" >> .gitignoer
# 检查忽略规则
git check-ignore -v app.py
# 强制添加某个文件
git add -f app.py
2. 配置别名
简化git的相关命令,可以给原名令起个别名。
git config --global alias st status
# 配置查看最后一次提交信息
git config --global alias last 'log -i'
# 加上config是针对当前用户生效,如果不加只针对当前的仓库起作用
# 当前仓库的配置文件
cat .git/config
# 当前用户的配置文件
cat .gitconfig
六、搭建Git服务器
搭建一套自己的git代码管理仓库。
# 安装git
sudo apt-get install git
# 创建一个git用户,用来运行git服务
sudo adduser git
# 创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
# 初始化仓库
sudo git init --bare sample.git
# 不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git
sudo chown -R git:git sample.git
# 禁用 shell 登录
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
# 克隆远程仓库
git clone git@server:/srv/sample.git