git config
--global
: 用这个参数表示这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址版本库 : 又名
仓库
repository
创建版本库
- 第一步:创建空目录
- 第二步:通过
git init
命令将次目录变成Git可以管理的仓库
git init
- 注 :此时会发现多了一个
.git
目录,此目录用来管理版本库。
将文件加入仓库
- 第一步:用命令
git add
告诉Git,把文件添加到仓库 第二步:用命令
git commit
告诉Git,把文件提交到仓库git log
命令的说明- 参数:
--pretty=oneline
简化日志记录为1行
- 参数:
Git版本回退
HEAD
表示分支的当前版本,上一个版本为HEAD^
,上上个版本为HEAD^^
- 上一百个版本为
HEAD~100
。 - 回退命令 :
git reset
git reset --hard HEAD^
返回刚才回退的版本
- 通过
git reflog
命令找到之前执行过的命令记录 - 找到之前提交
commit
命令的commit id 例如下:
3628164 HEAD@{1}: commit: append GPL
工作区和暂存区
- 工作区:
Working Directory
电脑中可以看到的目录,比如之前建的learngit
版本库:工作区中的隐藏目录
.git
既是Git的版本库- 暂存区:
stage
。命令add
就是把文件修改添加到暂存区 - 第一个分支
master
,指向master的指针HEAD
。命令commit
就是把暂存区的所有内容提交到当前分支。
- 暂存区:
撤销修改
准备提交修改时
git checkout -- <file>
命令:丢弃工作区的修改
git checkout -- readme.txt
- 此时有两种情况:
- 一、readme.txt 还没有被放到暂存区,此时撤销修改就回到 和版本库一模一样的状态
- 二、readme.txt 已经添加到暂存区 后又经过修改,此时撤销修改就回到了添加到暂存区后的状态。
修改提交到暂存区时
- 通过命令
git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
- eg:
git reset HEAD readme.txt
- 注:
git reset
既可以回退版本,也可以把暂存区的修改会退到工作区,HEAD
表示最新的版本。
- eg:
文件删除
目录中文件已删除,git中更新确认
- 1、
git rm test.txt
- 2、
git commit -m "remove test.txt
误删文件,需要恢复到最新版本
git checkout -- test.txt
- 注:这里
git checkout
用版本库里的版本替换工作区的版本。
仓库管理
配置SSH Key
生成公钥
- 通过命令
ssh-keygen -t rsa -C "youremail@example.com"
之后一路回车即可在C:\Users\Administrator\.ssh
目录下生成两个文件id_rsa
,id_rsa.pub
在Coding.net中添加公钥
- 复制
id_rsa.pub
中的全部内容,添加到账户->SSH公钥
页面中,钥名称可以随意起名字。
添加远程库
情况说明 : 本地已经创建了一个Git仓库,想在Coding.net上创建一个Git仓库,并且让这两个仓库进行远程同步。
第一步:在coding上创建一个新的项目,并获取改项目的ssh地址
- 例如:
git@git.coding.net:lutianfei/Gitxxx.git
- 例如:
- 第二步 :在本地的对应仓库下输入命令:
git remote add origin git@git.coding.net:lutianfei/Gitxxx.git
- 注:这里
origin
是远程项目的别名
,但一般都将origin
默认为远程项目名。
- 第三步:将本地库的内容推送到远程库中
git push -u origin master
- 这里实际上是把当前分支
master
推送到远程 - 由于远程库是空的,我们第一次推送master分支时,加上了
-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 之后就可以简化命令为
git push origin master
,把本地master分支的最新修改推送至Coding
- 第四步:获取远程库有但是本地库没有的信息
git fetch origin
克隆远程库
- 对于一个已经存在的远程库,需要拷贝到本地可以使用
git clone
命令。
git clone git@git.coding.net:lutianfei/Gitxxx.git
分支管理
HEAD
表示指向当前的分支。- 由下图可知,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
快进模式合并分支
- 创建并切换到
dev
分支
git checkout -b dev
:相当于下面的两条命令:
git branch dev
git checkout dev
- 查看当前分支
git branch
- 将
dev
分支的工作成果合成到master
分支上
- 第一步:切换回
master
分支 - 第二步:合并分支
git merge dev
:将指定分支合并到当前工作分支中 - 第三步:删除分支
git branch -d dev
- 第一步:切换回
- 如果不需要快速合并模式可以如下命令:
git merge --no-ff -m "version description" dev
普通分支合并
- 分支合并之前,最好使用
git pull
将master
分支的代码更新到最新 如果我们在合并之前对
master
分支和dev
分支都做了一些修改,那合并时就不会像快进合并那么简单了。此时分支状态如下
- 这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
- 查看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 tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
>=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
- Git用
<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容, =======
隔开的上半部分,是HEAD
(即 master 分支,在运行 merge 命令时的工作分支)中的内容,下半部分是在dev
分支中的内容。- 在文档中将冲突部分修改后再重新
add
commit
即可。 此时分支情况如下:
通过
git log --graph
命令可以看到分支合并图。
BUG分支处理
- 在Git中,每个bug都可以通过一个新的临时分支来修复,修复后合并分支,然后将临时分支删除。
- 第一步: 当需要处理一个紧急bug时,
- 首先可以先将当前工作现场保存通过
git stash
命令
- 首先可以先将当前工作现场保存通过
- 第二步:此时工作区就是干净的,可以创建分支来修复bug。
- 首先,确定在哪个分支上修复bug,例如要在
master
分支上修复
git checkout master
git checkout -b bug_branch
- 其次 修复bug并通过
add
、commit
提交到bug分支。 - 最后 切换回
master
分支,合并bug_branch
分支,删除bug分支。
- 首先,确定在哪个分支上修复bug,例如要在
- 第三步,恢复到之前的工作现场
- 首先:查看储存列表
git stash list
- 其次 :恢复工作环境
git stash pop
- 如果用
git stash apply
恢复,还需要git stash drop
将恢复的环境在stash中删除。 - 也可以用
git stash apply stash@{x}
来恢复具体的某个环境。
- 如果用
- 首先:查看储存列表
Feature 分支处理
- 当添加一个新功能时,肯定不希望因为一些实验性质的代码,把主分支搞乱。所以,每添加一个新功能,最好新建一个feature分支,在这个分支上面开发,完成后合并,删除该feature分支。
- 第一步:创建分支
git checkout -b feature-t
- 第二步:开发分支功能,结束后
add,commit
提交到分支。 - 第三步:切回
dev
分支,合并feature分支
git checkout dev
git merge feature-t
- 当feature分支不需要上线,要销毁时,可用如下命令
git branch -d feature-t
, 系统提示此时因feature分支未合并如删除会丢失修改。可通过下面强制删除git branch -D feature-t
分支管理策略
- 合并分支时,如果可能,Git会用
Fast forward模式
,但这种模式下,删除分支后,会丢掉分支信息。 强制禁用
Fast forward模式
,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。不使用
Fast forward模式
,merge后就像这样
分支管理基本原则
首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不在上面干活;干活都在
dev
分支上,也就是说,dev分支是不稳定的- 比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
- 每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
标签管理
创建标签
- 首先,切换到需要打标签的分支上
git checkout master
然后,通过如下命令创建新标签
git tag v1.0
- 查看所有标签:
git tag
默认情况下标签是打在最新提交的
commit
上的,如果想在之前的版本上打标签- 首先 找到历史提交的
commit id
git log --pretty-oneline --abbrev-commit
- 然后 找到对应的
commit id
对其打上标签
git tag v0.9 6222333
- 首先 找到历史提交的
通过
git show <tagname>
可以看到说明文字
操作标签
- 删除标签 :
git tag -d v1.0
- 推送某个标签到远程库:
git push origin <tagname>
- 推送所有标签到远程库:
git push origin --tags
- 从远程库删除标签 :
- 第一步:从本地删除:
git tag -d v1.0
- 第二步:从远程删除:
git push origin :refs/tags/v1.0
- 第一步:从本地删除: