Refer:廖雪峰的Git教程
git init # 初始化
git add # 添加文件
git commit -m "first version" # 提交
git status # 查看当前状态
git diff file.name # 查看文件修改情况
git log --pretty=oneline # 查看日志
git reset --hard HEAD^ # 强制回退到上一版本
git reset --hard 543264 # 回退到某一版本
git reflog # git命令记录
需要注意的是:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
git checkout -- file.name # 放弃工作区修改
命令git checkout -- readme.txt
意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
用命令git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
rm file.name # 删除文件
git rm file.name # 在git中删除文件
checkout -- file.name # 恢复文件
git remote add https://github.com/jlshix/flaskweb.git # 添加远程库
git push -u origin master # 第一次推送至远程库
git push origin master # 推送至远程库
git clone https://github.com/jlshix/flaskweb.git # 克隆远程库
# Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
git checkout -b dev # 新建并切换到dev分支 相当于以下两条
git branch dev
git checkout dev
git branch # 查看分支
git checkout master # 切换回master分支
git merge dev # 将dev分支合并
git branch -d dev # 删除dev分支
合并分支时若出现冲突需要手动合并,然后
git add
git commit
解决冲突
使用git log --graph --pretty=oneline --abbrev-commit
查看分支图
分支管理,禁用fastforward
$ git checkout -b dev
Switched to a new branch 'dev'
$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge
1 file changed, 1 insertion(+)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了.
所以,团队合作的分支看起来就像这样:
使用git stash命令可以保存当前工作空间
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
git stash pop
$ git stash apply stash@{0}
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
关于协作
- 查看远程库信息,使用
git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交 - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致 - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
- 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突
标签管理
打标签
- 命令
git tag <name>
用于新建一个标签,默认为HEAD,也可以指定一个commit id -
git tag -a <tagname> -m "blablabla...
可以指定标签信息 -
git tag -s <tagname> -m "blablabla...
可以用PGP签名标签 - 命令
git tag
可以查看所有标签
操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签 - 命令
git push origin --tags
可以推送全部未推送过的本地标签 - 命令
git tag -d <tagname>
可以删除一个本地标签 - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签