git 简介
-
git
是由C
语言编写的分布式版本控制系统 - 集中式版本控制系统:
CVS
和SVN
- 定义:先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器
git 安装
-
Linux
上安装Git
在Debian
或Ubuntu Linux
使用sudo apt-get install git
指令即可安装 -
Mac OS X
上安装Git
- 方法一:安装
homebrew
,然后通过homebrew
安装Git
,具体方法请参考 homebrew 的文档:http://brew.sh/
- 方法二:从
AppStore
安装Xcode
,Xcode
集成了Git
, 不过默认没有安装,你需要运行Xcode
,选择菜单Xcode
->Preferences
,在弹出窗口中找到Downloads
,选择Command Line Tools
,点Install
就可以完成安装了
创建版本库
- 创建空目录:
mkdir demo
- 初始化为
Git
可以管理的仓库:git init
- 将文件添加到版本库中
- 首先在目录中创建一个文件
touch Readme.md
- 然后将文件添加到仓库
git add Readme.md
- 将文件提交到仓库
git commit -m "info"
版本管理
- 查看历史版本
git log
- 觉得
git log
输出太多行,可执行git log --pretty=oneline
- 输出的大串字符为
commit id
- 版本回退
git reset
- 回退到上一个版本
git reset --hard HEAD^
- 查看回退后的文件
cat Readme.md
- 此时执行
git log
可以看到少了最新的版本状态
- 找到回退前的最新版本
- 命令行窗口未关闭:往上翻阅,直到找到最新的版本的
commit id
,执行命令git reset --head ****
即可找回 - 命令行窗口关闭:
git reflog
可以查看自己的每一次命令,从输出得知最新的版本的commit id
- 工作区和暂存区
- 工作区有一个隐藏目录
.git
, 是Git
的版本库 -
Git
的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index
)的暂存区 -
Git
为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
- 管理修改
- 执行操作:第一次修改
Readme.md
->git add
-> 第二次修改Readme.md
->git commit
- 提示不能被提交,因为工作区的第二次修改并没有被放入暂存区,
git commit
只能提交暂存区的修改,所以第二次的修改不会被提交 - 提交后,可以执行
git diff HEAD -- Readme.md
命令可以查看工作区和版本库里面最新版本的区别 - 正确做法:执行操作:第一次修改
Readme.md
->git add
-> 第二次修改Readme.md
->git add
->git commit
- 撤销修改
- 对文件撤销修改:
git checkout -- file
- 首先,对错误的代码更改,然后将文件恢复到上一个版本的状态
- 通过
git status
查看 - 提示通过
git checkout -- Readme.md
可以丢弃工作区的修改
- 删除文件
- 方法一:
rm Readme.md
,此时工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除 - 方法二:
git rm Readme.md
,此方法为从版本库中删除文件,然后通过git commit -m "删除Readme.md"
提交
远程仓库
- 添加远程仓库
-
GitHub
新建一个Git
库 - 本地目录中执行
git remote add origin git@github.com:yourName/demo.git
- 将本地库的内容推送到远程库中
git push -u origin master
- 把本地库的内容推送到远程,用
git push
命令,实际上是把当前分支master
推送到远程 - 由于远程库是空的,第一次推送
master
分支时,加上了-u
参数,Git
不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令
- 从远程库克隆
git clone git@github.com:yourName/demo.git
分支管理
- 创建、合并与删除分支
- 创建
dev
分支,并切换到dev
分支:git checkout -b dev
(-b
参数表示创建并切换) - 用
git branch
命令查看当前分支,当前分支前面会标一个*
号 - 此时修改
Readme.md
文件并提交:git add Readme.md
和git commit -m "info"
- 此时切换回
master
主分支:git checkout master
- 把
dev
分支的工作成果合并到master
分支上:git merge dev
-
git merge
命令用于合并指定分支到当前分支 - 合并完成后,可以放心地删除
dev
分支:git branch -d dev
- 删除后,查看
branch
,就只剩下master
分支:git branch
- 解决冲突
- 创建
dev1
分支,并切换到dev1
分支:git checkout -b dev1
- 修改
Readme.md
文件并提交:git add Readme.md
和git commit -m "info"
- 切换回
master
主分支:git checkout master
-
Git
会自动提示我们当前master
分支比远程的master
分支要超前1个提交 - 修改
Readme.md
文件并提交:git add Readme.md
和git commit -m "info"
- 此时:
master
分支和dev1
分支各自都分别有新的提交,Git
无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突 - 尝试:
git merge dev1
,Git
告诉我们,Readme.md
文件存在冲突,必须手动解决冲突后再提交,git status
也可以告诉我们冲突的文件 -
Git
用<<<<<<<,=======,>>>>>>>
标记出不同分支的内容,修改后保存:git add Readme.md
和git commit -m "info"
- 用带参数的
git log
也可以看到分支的合并情况 - 删除
dev1
分支:git branch -d dev1
- 用
git log --graph
命令可以看到分支合并图
- 分支管理策略
- 合并分支时,如果
Git
用Fast forward
模式,删除分支后,会丢掉分支信息;如果要强制禁用Fast forward
模式,Git
就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息 - 首先,仍然创建并切换
dev
分支:git checkout -b dev
- 修改
Readme.md
文件并提交一个新的commit
:git add Readme.md
和git commit -m "info"
- 切换回
master
:git checkout master
- 准备合并
dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:git merge --no-ff -m "merge with no-ff" dev
- 合并后,我们用
git log
看看分支历史:git log --graph --pretty=oneline --abbrev-commit
-
Bug
分支
- 将未提交的代码通过
git stash
将当前工作现场“存储”起来:git stash
- 用
git status
查看工作区,是干净的,可以放心地创建分支来修复bug - 确定要在哪个分支上修复
bug
,假定在master
分支上修复,创建临时分支:git checkout master
和git checkout -b issue-101
- 现在修复
bug
,然后提交:git add Readme.md
和git commit -m "info"
- 修复完成后,切换到
master
分支,并完成合并:git checkout master
- 最后删除
issue-101
分支:git merge --no-ff -m "merged bug fix 101" issue-101
- 回到dev分支干活:
git checkout dev
- 用
git stash list
命令看刚才的工作现场存在哪 - 工作现场还在,
Git
把stash
内容存在某个地方了,但是需要恢复一下,有两个办法:- 一是用
git stash apply
恢复,但是恢复后,stash
内容并不删除,你需要用git stash drop
来删除 - 二是用
git stash pop
,恢复的同时把stash
内容也删了
- 一是用
- 再用
git stash list
命令就看不到任何stash内容了 - 可以多次
stash
,恢复的时候,先用git stash list
查看,然后恢复指定的stash
,用命令:git stash apply stash@{0}
-
Feature
分支
- 添加一个新功能时,新建一个feature分支:
git checkout -b feature-vulcan
- 开发成功后提交 :
git add Readme.md
和git commit -m "info"
- 切换
dev
分支,准备合并:git checkout dev
- 如果客户脑子瓦特,又不要新功能了,删除新分支(丢弃一个没有被合并过的分支):
git branch -D feature-vulcan
- 多人协作
- 查看远程库的详细信息:
git remote -v
- 推送分支:把该分支上的所有本地提交推送到远程库
- 推送时,要指定本地分支,这样,
Git
就会把该分支推送到远程库对应的远程分支上:git push origin master
- 如果要推送其他分支,比如
dev
,就改成:git push origin dev
- 推送时,要指定本地分支,这样,
- 抓取分支:多人协作时,大家都会往
master
和dev
分支上推送各自的修改- 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功 - 如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
- 如果推送失败,则因为远程分支比你的本地更新,需要先用
- 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致,如git checkout -b dev origin/dev
- 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
,如git branch --set-upstream-to=origin/dev dev
Rebase
- 用
git log
命令查看:git log --graph --pretty=oneline --abbrev-commit
- 提交历史分叉时,如果现在把本地分支
push
到远程,历史不能变成直线 - 使用
git rebase
后提交,再用git log --graph --pretty=oneline --abbrev-commit
查看,变成了一条直线
标签管理
- 创建标签
- 在Git中打标签非常简单,首先,切换到需要打标签的分支上:
git checkout master
- 敲命令
git tag <name>
就可以打一个新标签 - 可以用命令
git tag
查看所有标签,默认标签是打在最新提交的commit
上的 - 如果忘记打标签,找到历史提交的
commit id
,然后打上就可以了:git tag v0.9 f52c633
- 再用命令
git tag
查看,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>
查看标签信息:git show v0.9
- 还可以创建带有说明的标签,用
-a
指定标签名,-m
指定说明文字:git tag -a v0.1 -m "version 0.1 released" 1094adb
- 用命令
git show <tagname>
可以看到说明文字
- 操作标签
- 如果标签打错了,也可以删除:
git tag -d v0.1
- 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除
- 如果要推送某个标签到远程,使用命令
git push origin <tagname>
- 一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
- 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
- 然后,从远程删除。删除命令也是
push
,但是格式如下:git push origin :refs/tags/v0.9
- 要看看是否真的从远程库删除了标签,可以登陆
GitHub
查看
注:笔记为学习廖雪峰老师的官网:官网
网友评论