Git的学习
学习开始 具体参考上面链接就不多说了
最基本的初始化/创建
创建版本仓库
mkdir myGit
cd myGit
pwd
/Users/mac/desktop/myGit
通过 git init
来把这个仓库变成可以管理的仓库,会发现多一个 .git的文件夹
添加一个文本, 先创建一个txt文件, 然后添加到文件夹中
#添加到仓库
git add readme.txt
#提交
git commit -m "wrote a readme file"
小结
初始化一个Git仓库,使用git init命令。
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成。
修改文件
修改文本的内容
#查看当前的状态
git status
#查看当前的改变
git diff <文件名字>
提交的话重新进行
#没有任何输出表示没问题
git add readme.txt
然后查看下当前的状态 有一个是需要提交的状态
git commit -m "add something"
然后再查看下当前的状态
git status
小结
要随时掌握工作区的状态,使用
git status
命令。
如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
前面的命令综合来一遍
#创建一个当前的git仓库
git init
#然后添加文件进去
#把文件添加到仓库中去
git add <fileName>
#查看下状态
git status
#提交状态
git commit -m "注释"
#查看当前状态
git status
#然后修改文件后
#查看文件的变化
git diff
#查看状态
git status
#添加到暂存区
git add <fileName>
#提交状态
git commit -m "注释"
git status
版本回退
#显示所有的版本
git log
#只显示注释部分
git log --pretty=oneline
如果现在要回退的话 使用命令
# HEAD 表示当前版本 ^表示上一个版本
# hard 之后再说
git reset --hard HEAD^
这时会发现 txt 文本发生了变化
# 预览文本信息
cat readme.txt
然后现在 git log
后也没有了之前的版本
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本:
git reset --hard 3242432
所以呢就又回来了
但是如果电脑关闭了, 就没有版本号了, 所以需要下面命令, 会显示前面的版本号
git reflog
小结
git log
显示提交历史 方便回退版本
git reflog
查看命令历史 翻遍回退到未来的版本
工作区 暂缓区
git 相比 svn 是有一个暂缓区的概念
工作区(工作区(Working Directory)
就是能看到的目录 相应的文件夹
版本库(Repository)
隐藏的文件夹 .git 就是版本库, .git 存储着很多东西
其中有个stage(或者index)的暂存区
还有自动创建的master 以及只想master 的一个指针叫做 HEAD
其中
git add
把文件添加进去 就是把文件添加到暂存区
git commit
提交更改 就是把暂存区的内容提交到当前分支
管理修改
#如果操作顺序
第一次修改 -> git add -> 第二次修改 -> git commit
#会导致第二次的没有提交上去,才会提交上去
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
撤销修改
如果仅仅是做了修改没有add
#Git会告诉你,git checkout -- file
#可以丢弃工作区的修改, 回到原来状态
git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销
如果仅仅是做了修改并add
#清空工作区的 是没有用的
git checkout -- <fileName>
如果已经提交到缓存区了 则执行两部
#清空暂存区的
git reset HEAD <fileName>
#清空工作区的
git checkout -- <fileName>
小结
git checkout -- file
命令中的--很重要,没有--
,就变成了“切换到另一个分支”
的命令
删除文件
删除文件也是一个修改操作
git add info.txt
rm info.txt
# 提示有文件删除了
git status
# 回到初始状态
git checkout -- info.txt
#或者就是删除状态
git add info,.txt
rm info.txt
git rm info.txt
#如果发现不需要删除文件 就继续执行
git checkout -- info.txt
git checkout
其实就是用版本库里的东西来替换工作区的东西 一键还原
远程仓库的使用
根据网站上配置SSH 或者账号信息
链接好之后
#推到远程仓库
git push
关联远程库的方法
使用命令
git remote add origin git@server-name:path/repo-name.git;
使用命令
git push origin master推送最新修改;
从远程仓库 克隆 直接创建一个文件夹
git clone https://github.com/isongwei/learngit.git
#然后进入到相应的文件夹下
#就可以查看相关信息了
git log
创建与合并分支
一开始只有master 主分支 HEAD 是指向这个主分支的, master 才是指向提交的
每次提交分支都会往前移动一格
当创建新的分支的时候 Git 创建一个新的指针 指向master 相同的提交
再把HEAD指向 dev
如果dev 的工作完成了 就可以把dev 合并到master 上 最简单的就是把 master 指向dev
分支完成 甚至可以删除 dev 分支 就是把dev 指针删除 删除后就剩下一个master 分支
首先创建 dev
分支
#选择切换到dev分支
git checkout -b dev
命令加上-b 表示创建并切换 相当于下面两条命令
git branch dev
git checkout dev
然后查看当前分支
git branch
命令会列出所有分支 当前的分支前面会带有*
操作尝试下
#一系列的步骤就是
# 创建一个分支
git checkout -b dev
#当前的分支状态
git branch
#对文件进行修改
# 修改放到暂存区
git add <fileName>
# 提交更改
git commit -m ""
#分支上的就完成了
现在切换到master 分支上
#选择你这分支到 主分支上
会发现添加的修改没有了
git checkout master
可以来回切换分支
现在把分支合并到master 上
#合并分支 合并制定分支到当前分支
git merge dev
#其中有一个 Fast-forward 信息 快进模式 不是每次都是
合并后就可以删除分支了
#删除之后就只剩下master了
git branch -d dev
小结
So Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支
git branch
创建分支
git checkout -b dev
分步实现
git branch dev
git checkout dev
合并某merge分支到当前分支
git merge dev
删除分支
git branch -d dev
冲突的解决
当进入分支 修改一个文件后 提交
在切换到master 修改 提交
git merge dev
会提示合并失败
然后再进入文件进行修改
然后常规的提交就可以了
最后删除分支
小结
这个是用来查看分支图的, 打印的是分支的路线
git log --graph
分支管理策略
对于一般的 合并分支是使用的是Fastforward 模式
但是删除分支后 分支的信息就会丢失
现在使用 --no-ff 参数 表示禁用 Fast forward
git merge --no-ff -m "分支的合并"
现在看下结果
#显示简要的提交 以及分支情况
git log --graph --pretty=oneline --abbrev-commit
小结
master 是非常稳定的 平时不在上面操作
dev 不稳定
如果要发布1.0 版本, 再把dev 合并到master上
在master上发布1.0 版本
所以每个人都在自己的dev上干活, 一直往自己的dev上合并
合并分支时 机上
--no-ff
参数就可以用普通模式合并 合并后的历史有分支 能看出来曾经做过合并而 fast forward看不出曾经做过合并
bug 分支
使用情景 当前正在开发其他任务 但是线上出现了Bug 而现在做的有没办法惊醒提交
所以Git 的 stash 功能把当前的工作储存下来 修复好后再继续工作
下面开始进行操作
#命令运行完后会发现 回到了没有修改的状态
git stash
#查看工作区就是干净的
git status
然后确定在哪个分支上进行修改
假如在master 上
#切换到master上
git checkout master
#创建bug 分支
git checkout -b issue-101
#现在开始修复bug
#修改后进行常规的提交操作
git status #提交后都是干净的
然后看下之前的状态
git stash list
现在是有两种方法恢复
1 #恢复后stash的内容不删除
git stash apply
#来进行删除
git stash drop
2 #恢复的同时stash的内容也删除了
git stash pop
开始操作
git stash pop
这是后再次
git stash list
显示已经没有 list 了
如果在一个分支上进行同样的操作 可能就会出现冲突
按照之前的操作进行处理
当然也可以进行制定的
git stash apply stash@{0}
小结
修复Bug 的时候我们通过创建新的分支进行修复 然后合并 最后删除当手头的工作没有完成时 先把现在 git stash一下 然后修复Bug
再git stash pop 回到工作现场
Feature分支
在实际的开发过程中 总是有无尽的需求添加进来
比如 接到一个功能性的需求
先创建一分支
git checkout -b dev_new
一会开发完毕
git add <fileName>
git commit -m "....."
git status
然后切换到现在自己的开发分支 dev 并删除分支
git checkout dev
git merge --no-ff -m dev_new
但是此时 新功能取消 虽然白干了 分支必须删除
git branch -d dev_new
这时会提示销毁失败 因为还没有合并
# 强制删除
git branch -D dev_new
多人合作
把自己的文件 push 到Git Hub 上
#可能需要创建的分支
git checkout -b dev origin/dev
#不时的上传自己分支信息
git push origin dev
但是如果两个人改了同一个东西会导致 后面的人push 失败
#所以需要先pull
#然后解决冲突
git pull
小结
因此多人工作 的工作模式是这样的
1 首先 尝试 git push 推送自己的修改
2 如果推送失败 是因为远程的更新 所以 git pull 尝试合并
3 如果合并有冲突 则解决冲突 并在本地提交
4 没有冲突后 再次 git push
注意 如果git pull失败 提示
no tracking information
则说明本地的分支 和远程的分支的链接关系没有创建
则用命令
git branch --set-upstream branch-name orgin/branch-name
查看远程库信息
git remote -v
本地的分支如果不推送是看不到的
标签处理
发布一个版本时 通常在版本库 打一个标签
这样就唯一确定了打标签时刻的版本
Git的标签是版本库的快照 但是实际就是指向某个commit 的指针
用来替代 commit的难记
先回顾下打分支
#列出当前的分支
git branch
# 切换分支
git checkout dev
打分支
#打分支
git tag v1.0
# 查看当前的分支
git tag
默认打的标签是到最新提交的commit上
如果要给之前的commit 打分支
#方法就是找到之前的提交信息
git log --pretty=oneline --abbrev-commit
#然后
git tag v0.9 commit_id
好像可以打多个标签
#然后 两个的显示效果是一样的
git show tag
git show commit_id
#也可以打的标签详细一点
git tag -a v0.7 -m "version 0.7 released" commit_id
当然在高级一点
还可以通过-s用私钥签名一个标签:
git tag -s v0.2 -m "version" commit_id
签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
小结
1
git tag v1.0.0
新建标签 默认HEAD
2
git tag -a <tagname> -m "blablabla..."
可以指定标签信息3
git tag
所有的标签信息
标签的操作
本地的标签都只存储在本地 所以打错后可以删除
git tag -d v0.1
推送标签
git push origin v0.1
or
git push origin --tags
如果已经推到了远程
#首先本地删除
git tag -d v0.1
#再删除远程的
git push origin :refs/tags/v0.1
如果查看远程是否删除了标签 可以登录Git Hub 看下
小结
1
git push origin <tagname>
可以推送一个本地标签2
git push origin --tags
可以推送全部未推送过的本地标签3
git tag -d <tagname>
可以删除一个本地标签4
git push origin :refs/tags/<tagname>
可以删除一个远程标签
相关配置
一些配置文件, 在根目录区创建一个文件
#这个是随`.git`在同目录的一个文件
.gitignore
#如果要配置全局的可以打开系统的通用配置文件
~/.config/git
如果想添加被忽略的文件
#强制添加
git add -f <fileName>
#这个可以检查忽略文件
git check-ignore
git 别名的设置参考网页的内容
网友评论