文章目录
安装 git
centos 安装 git
sudo yum install git
ubuntu 安装 git
sudo apt-get install git
下载完git
后,在与远程库交互前首先要指定name
,email
(非必需),然后生成密钥对:
[root@izuf6esjmghweowgd0ryazz ~]# git config --global user.name "lzj"
[root@izuf6esjmghweowgd0ryazz ~]# git config --global user.email "lzj@xxx.com"
[root@izuf6esjmghweowgd0ryazz ~]# ssh-keygen -t rsa -C "lzj@xxx.com"
找到/{home}/.ssh/id_rsa.pub
文件,将文件内容(公钥)放到远程仓库上即可
提交文件
- 使用命令
git init
初始化git
仓库 - 使用命令
git add test.txt
把文件添加到暂存区 - 使用命令
git commit -m "a new txt"
提交给版本库,并添加本次提交的说明
可使用git add .
将当前目录下所有修改添加到暂存区
查看 git 状态
修改了文件后,可按照如下的步骤提交文件:
- 使用命令
git status
查看结果 - 使用命令
git diff
查看变更内容 - 确认了变更内容后使用命令
git add test.txt
添加到仓库 - 再次使用命令
git status
得知将要被提交的修改包括test.txt
- 使用命令
git commit -m msg test.txt
提交到版本库
随时使用git status
掌握工作区的状态
查看 git 版本历史
通过命令git log
可查看所有的版本变更记录,会显示从最近到最远的提交日志
通过命令git log --pretty=oneline
简化输出信息,每行的前面一大串字母和数字的组合是十六进制的commit id
(版本号)。由于是分布式的版本控制系统,每次提交产生的commit id
都不同,避免了多人协作时的版本号冲突问题
回退版本
回退到上一个版本:git reset --hard HEAD^
当前版本是HEAD
, 上一个版本是HEAD^
,上上个版本是HEAD^^
,上100个版本是HEAD~100
回退后若想回到原来最新的版本,在保持命令行窗口不关的前提下,往上找到最新版本的commit id
,
使用命令git reset --hard 1094a
。1094a
可以是commit id
的前几位,git
会自己去找,也不能太短
如果关闭了命令行窗口,可以通过命令git reflog
查看每一次的命令,通过查看commit
的那一行版本号(第一个字段),再通过命令回复
暂存区
git add
实际上是将文件存到暂存区(.git目录下的index文件就是暂存区),git commit
就是将暂存区中的所有文件提交到当前分支
每次修改若不add
到暂存区,就不会被commit
到当前分支
撤销修改
未添加到暂存区
当文件修改后,没有add
到暂存区时,使用命令git checkout -- <file>
可将文件恢复到和版本库一样的状态
已添加到暂存区,未提交到版本库
当修改的文件后被add
到暂存区,且未提交到版本库,使用命令git checkout -- <file>
可将文件恢复到最近一次add
到暂存区的状态
也可使用git reset
把暂存区的修改放回工作区
已提交到本地版本库
使用git reset
回退版本
注意:
当把修改push
到远程版本库时,无法撤销修改
提交删除操作
对于git
来说删除也是一个修改,当在工作区中删除了一个文件时,有两个操作待选:
git rm <file>
添加删除到暂存区,再git commit -m <message> <file>
- 撤销删除:git checkout – , 用版本库的版本替换工作区的版本
查看远程仓库
- 查看远程仓库信息使用
git remote
- 查看远程仓库详细信息
git remote -v
删除远程仓库
git remote rm origin
添加远程仓库
在github
上创建新的仓库learngit
,通过以下命令将本地库与远程库关联(origin
是远程仓库的名称,可以修改成其他的,如github
):
git remote add origin https://github.com/<user-name>/learngit.git
将本地库的内容推送到远程库:
git push -u origin master
第一次推送时可加上-u
参数,git
不但会把本地的master
分支内容推送到远程新的master分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令
之后的推送就可以使用命令git push origin master
git
与svn
相比最大的好处就是在没有网络的情况下,也可以正常工作,只要将修改提交给本地,待有网络的时候推送到远程库,而svn
在没有网络的情况下是无法正常工作的
从远程仓库克隆
在github
上创建新的仓库gitskill
,使用以下命令克隆到本地:
git clone git@github.com:<user-name>/gitskill.git
git
支持多种协议,可使用https
,也可使用git
协议。默认的git
协议使用的是ssh
,速度最快,而https
协议速度较慢,每次推送还要输入密码
分支管理
可以创建一个分支进行开发任务,这样既不会影响别人在原来的分支上正常工作,也不怕丢失每天的任务进度,等开发完成后,可将自己的分支进行合并
分支的添加,删除,切换,查看
应当使用分支完成某个任务,完成后合并到master
分支,再删除原来的分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
删除分支可以遵循以下两步骤:
- 先从本地删除
git branch -d <branch-name>
(被merge
到了其他分支)
git branch -D <branch-name>
(没有被merge
到其他分支)
- 删除远程分支
git push origin :<branch-name>
解决冲突
当创建出了一个分支,在这条分支上做了修改并提交,主分支也做了修改并提交后,合并分支就会出现冲突,此时应手动解决冲突再进行提交操作
用git log --graph
命令可以看到分支合并图
分支管理策略
默认合并分支采用的是fast forward模式,此时删除分支后,会丢失分支信息
禁用fast forward模式时,git
会在合并时产生一个新的commit
,会保留分支信息(因为产生了新的提交,需要加上message
)
使用命令git merge **--no-ff** -m "merge with no-ff" dev
禁用fast forward模式来合并分支
使用命令git log --graph --pretty=oneline --abbrev-commit
查看分支历史
注意:
master分支是非常稳定的,只能用来发布新版本
需要在dev分支上进行开发,不断merge到dev上
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
bug分支
修复bug时,可以通过创建新的bug分支进行修复,再merge到master,最后删除bug分支
若是当前有任务未完成,无法commit
时,可以使用git stash
保存现场,然后修复bug
。完成后,再通过git stash pop
回到工作现场
若多次git stash
,可使用命令git stash list
查看,然后恢复指定的stash,如:
git stash apply stash@{0}
feature分支
当接收到开发一个新功能的需求时,可以创建一个feature
分支,若功能开发完毕后已提交,此时需求发生变动,该功能取消,而这时feature
分支没有merge
到dev
分支,需要使用以下命令删除feature
分支:
git branch -D feature
推送分支
推送分支就是把本地的所有提交推送到远程:git push origin master
也可推送dev分支:git push origin dev
bug
分支一般不需要push
feature
分支若是与他人协作,可以push
多人协作的模式
一般可以遵循以下步骤:
-
首先试图推送:
git push origin <branch-name>
-
若推送失败,说明远程库更新,需要拉取远程库到本地:
git pull
-
若有冲突,需要手动解决冲突,然后在本地提交
-
再用
git push origin <branch-name>
推送就能成功 (origin是远程库的名称) -
如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,使用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
创建链接关系 -
若有需要,可在本地创建与远程对应的分支:
git checkout -b branch-name origin/branch-name
标签
标签(tag)与某个commit
绑定在一起,可以通过tag
快速找到某个commit
,而不用依靠无意义的版本号(commit id)
创建标签
使用命令git tag v1.0
给最近的一个commit
打上一个新标签v1.0
使用命令git tag -a <tag-name> -m <tag-message> [<commit-id>]
创建带有说明的标签(-a 指定标签名,-m 指定说明文字)
查看所有标签
git tag
为之前的commit
打上标签
-
使用命令
git log --pretty=oneline --abbrev-commit
查看所有的commit
记录 -
使用命令
git tag <tag-name> <commit-id>
为某个版本打上标签
查看标签具体信息
标签是按照字母顺序排列的,使用命令git show <tag-name>
查看标签的具体信息
操作标签
未推送到远程时删除标签:git tag -d <tag-name>
推送某个标签到远程:git push origin <tag-name>
推送所有标签到远程:git push origin --tags
推送到远程后删除标签依次需要以下两步:
-
先从本地删除:
git tag -d <tag-name>
-
从远程删除:
git push origin[空][空]: refs/tags/<tag-name>
注意:
- 从远程删除标签的命令中有个冒号,且冒号前面有一个空格
- 可以理解为:将一个空推送给了后面的远程
tag
,从而删除了tag
忽略特殊文件
所有 .gitignore 配置文件可以在线找到:
https://github.com/github/gitignore
配置完后将 .gitignore 文件提交即可
通过git status
查看工作目录是否干净来检验配置文件是否满足要求
配置命令别名
若想用git ci -m
代替git commit -m
,可以用以下命令:
git config --global alias .ci commit
配置git
的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
config
位于.git
目录下,若要删除某项别名直接在文件中删除对应的行即可
仓库的 .git/config
只保存当前仓库的local
配置,而用户的global
配置在用户主目录下的 .gitconfig
中