博客新址: http://blog.xuezhisd.top
邮箱:[email protected]
# Ubuntu安装Git
sudo apt-get install git -y
# 设置全局用户名和邮件,该机器上所有仓库使用该配置
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
# 创建一个空目录
mkdir learngit
cd learngit
pwd
# 将目录变成“Git仓库”
git init
Git is a version control system.
Git is free software.
# 添加到仓库
git add readme.txt
# 提交到仓库
git commit –m “wrote a readme file”
-m “….”
是注释,便于查找改动。推荐使用。git commit
相当于保存一个快照,可以用于恢复。# 多次add,一次提交
git add file1.txt
git add file2.txt file3.txt
git commit –m “add 3 file.”
Git is a distributed version control system.
Git is free software.
# 掌握仓库的当前状态
git status #红色
# 查看修改内容
# git diff的显示格式是Unix通用的diff格式
git diff readme.txt
# 添加到仓库
git status #绿色
# 提交到仓库
git commit -m “add distributed”
git status
git log
显示提交日志(从最近到最远)git log –pretty=online
精简显示git reset
版本回退0347cda67cf047da1ad612ab2319e2ef2bf8cff8
是commit id(版本号)。之所以不用1,2…,是为了防止多人在同一个仓库工作时出现冲突。修改readme.txt,如下所示。
Git is a distributed version control system.
Git is free software distributed under the GPL.
输入以下命令练习。
# 提交
git add readme.txt
git commit –m “append GPL”
# 查看提交日志
git log
# 保存提交日志
git log > ../log.txt
# 精简显示日志
git log –pretty=oneline
# 回退到上个版本
git reset –hard HEAD^
# 查看提交日志(最新的已经没有了)
git log
# 恢复最新版本(前提:命令行窗口未关)
# 查看最新版本的版本号。假定为: 73bdb9efc29b3ed95567e57e4640418e8e809307
git reset –hard 73bdb9efc
# 如果命令行窗口已关,通过git reflog命令查看历史命令(包含版本号)
git reflog
修改readme.txt,如下所示。
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
执行以下命令,检查状态和添加文件。
git status
git add readme.txt
git add LICENSE
git status
git commit -m “understand how stage works”
git stauts
# 修改readme.txt
git add readme.txt
git status
# 继续修改
git commit -m “git tracks changes”
git status
#说明:第一次修改提交了,第二次修改没有提交
# 检查工作区和版本库里最新版的区别
git diff HEAD -- readme.txt
rm test.txt
git rm test.txt
git commit -m “remove test.txt”
rm test.txt
# 发现删错了,恢复
git checkout -- tes.txt
Git杀手级功能:远程仓库。Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
实际情况:找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
Github,提供了Git仓库托管服务。国内有类似的coding。
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。
配置:
# 创建SSH Key
ssh-keygen -t rsa
ssh-keygen -t rsa -C “[email protected]”
#~/.ssh目录下生成两个文件:id_rsa(私匙)和id_rsa.pub(公匙)
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的。
Github上的免费托管的Git仓库是公开的,别人可以看到。国内的coding.net可以免费托管私有仓库。
#关联远程库
git remote add origin [email protected]:xuezhisd/learngit.git
#关联后,远程库的名字就是origin
# 推送本地库内容到远程库上
git push -u origin master
# -u把本地的master分支和远程的master分支关联起来,简化以后推送命令。
# 以后使用下面命令推送
git push orgin master
git clone [email protected]:xuezhisd/learngit.git
git clone https://github.com/xuezhisd/learngit.git
cd learngit
ls
# 创建dev分支,然后切换到dev分支
# -b表示创建并切换分支
git checkout -b dev
# 查看当前分支
git branch
# 修改readme.txt
# 提交
git add readme.txt
git commit -m “branch test”
# 切回master分支
git checkout master
# 将dev分支的工作合并到master分支
# 注意:当前在master分支中
git merge dev
# 删除dev分支
git branch -d dev
# 查看剩余分支
git branch
# 添加分支
git checkout -b feature1
#readme.txt最后一行添加
#Creating a new branch is quick AND simple
#提交
git add readme.txt
git commit -m “AND simple”
#切回master
git checkout master
#readme.txt最后一行添加
#Creating a new branch is quick & simple.
gti add readme.txt
git commit -m “& simple”
# 此时,master分支和feature1分支各自有了新的提交。此时,快速合并无法执行
# 尝试合并
git merge feature1
git status
# 查看冲突内容,修改为
# Creating a new branch is quick and simple.
# 重新提交
git add readme.txt
git commit -m “conflict fixed”
# 查看分支合并情况
git log --graph --pretty-oneline --abbrev-commit
# 删除feature1分支
git branch -d feature1
# 创建并切换dev分支
git checkout -b dev
# 随便修改readme.txt文件
# 提交
git add readme.txt
git commit -m “add merge”
# 切回master分支
# 合并dev分支
# --no-ff参数:表示禁用Fast forward
git merge --no-ff -m “merge with no-ff” dev
# 查看分支历史
git log --graph --pretty=oneline --abbrev-commit
# 保存工作现场
git stash
# 查看工作区,就是干净的,可以放心创建分支修复Bug
# 假定需从master分支上修复,就从master创建临时分支
# 切回master分支
git checkout master
# 创建并切到issue-101分支(Bug分支)
git checkout -b issue-101
# 修改Bug
# 提交
git add readme.txt
git commit -m “fix bug 101”
# 切回master分支,合并
git checkout master
git merge --no-ff -m “merged bug fix 101” issue-101
# 删除Bug分支
git branch -d issue-101
# 切回dev分支
git checkout dev
# 查看装填,此时是干净的
git status
# 查看工作现场(此时工作现场存在)
git stash list
# 恢复现场,并删除stash内容
git stash pop
# 查看工作现场(此时无stash内容了)
git stash list
# 为Vulan功能创建并切换分支
git checkout -b feature-vulcan
#开发功能
#开发完毕,提交
git add vulcan.py
git status
git commit -m “add feature vulcan”
# 切回dev分支
git checkout dev
#因某些状况,新功能取消,就地销毁该分支
git branch -D feature-vulcan
# 查看远程库信息
git remote
# 查看更详细的远程库信息
git remote -v
# 推送master分支到远程库master
git push origin master
# 推送dev分支到远程库dev
git push origin dev
# 克隆远程库
git clone [email protected]:xuezhisd/learngit.git
# 从远程库克隆时,默认只有master分支
# 查看分支
git branch
#在dev分支上开发,就必须创建远程origin的dev分支到本地
git checkout -b dev origin/dev
# 多人协作时,可能同时修改了dev分支中的同一文件,这时就会推送失败
# 此时需要先抓取分支
# 地dev分支与远程origin/dev分支的链接
git branch --set-upstream dev origin/dev
git pull
# 有冲突,需要手动解决,再push
# 查看分支情况
git branch
# 切换
git checkout master
git tag name
打标签:git tag v1.0
git tag
commit id
,然后打标签:# 查找标签
git log --pretty=oneline -abbrev-commit
# 为历史提交打标签
# 加入想打标签的commit id是6224937
git tag v0.9 62249
# 查看所有标签
# 注:标签按字母顺序列出
git tag
# 查看标签信息
git show v0.9
# 创建带注释的标签
git tag -a v0.1 -m "version 0.1 released" 3628164
# 查看标签信息
git show v0.1
# -m 用私匙签名一个标签
fec145a是commit id
git tag -s -m "signed version 0.2 released" fec145a
# 查看PGP签名信息
git show v0.2
git tag -d v0.1
# 推送v1.0标签
git push origin v1.0
# 推送所有标签(为上传的)
git push origin --tags
# 先删除本地标签
git tag -d v0.9
# 再从远程删除
git push origin :refs/tags/v0.9