git-总结
安装git
查看git是否安装
git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
安装git
sudo apt-get install git
创建版本库
mkdir learngit
cd learngit
git init
添加文件到git仓库,分两步
第一步:git add <file>
第二步:git commit -m "description information"
git add --all
git add 命令的all参数,表示保存所有变化(包括新建、修改和删除)。从git 2.0开始,all是git add的默认参数,所以也可以用git add . 代替
查看当前git仓库状态
git status
查看修改后的文件跟原先有什么不同
git diff <file>
显示从最近到最远的提交日志
git log
git log --pretty=oneline
版本回退
git reset --hard HEAD^
版本回退到某个版本
git reset --hard 3628164
git是跟踪修改的,每次修改如果不add到暂存区,就不会加入到commit中
撤销修改
git checkout -- file
命令git checkout -- readme.txt 的意思是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况
一种是readme.txt自修改后还没被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区,后又作了修改,现在,撤销修改就回到了添加到暂存区后的状态;
总之,就是让这个文件回到最近一次git commit 或git add的状态。
删除文件
git rm test.txt
git commit -m "remove test.txt"
远程仓库
- 创建ssh key
ssh-keygen -t rsa -C "1126785053@qq.com"
- 登录Github,打开Account settings
Add SSH Key
添加远程仓库
git remote add origin git@github.com:liruizhong/learngit.git
git push -u origin master
git push origin master
克隆一个远程仓库到本地
git clone git@github.com:liruizhong/gitskill.git
分支管理
- 创建与合并分支
- 创建一个dev分支,然后切换到dev分支
git checkout -b dev
等同于
git branch dev
git checkout dev
查看当前分支
git branch
*dev
master
当前分支前会标一个*号
合并指定分支到当前分支
git merge dev
删除分支,此处以删除dev为例
git branch -d dev
小结
- 查看分支:git branch
- 创建分支:git branch
- 切换分支:git checkout
- 创建+切换分支:git checkout -b
- 合并某分支到当前分支:git merge
- 删除分支:git branch -d
解决冲突
git log --graph --pretty=oneline --abbrev-commit 可以查看到分支合并图
分支管理策略
在实际开发中,我们应该按照介个基本原则进行分支管理
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
小结:
- Git分支十分强大,在团队开发中应该充分应用
- 合并分支时,加--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
DUG分支
- 去修复bug前,将当前工作去储存 git stash
- 然后切换到要修复bug的分支git checkout master
- 创建临时分区修复bug :git checkout -b issue-101
- 修复完成提交:git add readme.txt git commit -m "fix bug issue-101"
- 切换回主分支:git checkout master
- 将issue-101分支合并到主分支:git merge --no-ff -m "merged bug fix 101" issue-101
- 删除临时分支issue-101:git branch -d issue-101
- 然后切换回原工作区:git checkout dev
- 查看自己当时的储存工作现场:git stash list
恢复工作现场:
- 一种方法: git stash apply stash@{0} git stash drop
- 另一种方法:git stash pop
Feature分支
小结:
- 开发一个新的feature,最好新建一个分支
- 如果要丢弃一个没有被合并过的分支,可以通过git branch -D
强行删除
多人协作
多人协作的工作模式通常是这样的:
- 首先,可以试图用git push origin branch-name 推送自己的修改
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决冲突后,再用git push origin branch-name推送就能成功
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name
这就是多人协作的工作模式,一旦熟悉,就非常简单。
小结:
- 查看远程库信息,使用:git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
- 建立本地分支和远程分支的关联,使用git branch --set-upsream branch-name origin/branch-name
- 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
标签管理
创建标签
小结
- 命令git tag
用于新建一个标签,默认为HEAD,也可以指定一个commit id; - git tag -a
-m "blablabla..." 可以指定标签信息; - git tag -s
-m "blablabla..." 可以用PGP签名标签; - 命令git tag 可以查看所有标签;
操作标签
小结
- 命令git push origin
可以推送一个本地标签; - 命令git push origin --tags 可以推送全部未推送过的本地标签;
- 命令git tag -d
可以删除一个本地标签; - 命令git push origin :refs/tags/
可以删除一个远程标签
使用GitHub
小结
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。
忽略特殊文件
小结
- 忽略某些文件时,需要编写.gitignore;
- .gitignore文件本身要放到版本库里,并且可以对.gitinore做版本管理!
配置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com