本文是阅读笔记,原文请移步:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
1 创建版本库 版本库又名仓库,英文名
git init
2 提交新文件 或提交修改
git add readme.txt
git commit -m "add distributed"
3 查看提交记录
git log
******
git log --name-status 每次修改的文件列表, 显示状态
git log --name-only 每次修改的文件列表
git log --stat 每次修改的文件列表, 及文件修改的统计
git whatchanged 每次修改的文件列表
git whatchanged --stat 每次修改的文件列表, 及文件修改的统计
git show 显示最后一次的文件改变的具体内容
git show -5 显示最后 5 次的文件改变的具体内容
git show commitid 显示某个 commitid 改变的具体内容
******
4 版本回退
回退到上一版本
git reset --hard HEAD^
回退到上上一版本
git reset --hard HEAD^^
回退到上100个版本
git reset --hard HEAD~100
回退到某一版本
git reset --hard 3628164
注意,假设提交记录里有log1(head为111) log2(head为222) log3(head为333)
通过 git reset --hard 111 可以回退到版本111, 再通过 git reset --hard 333 则可回到版本333
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
5、工作区 和 暂存区
work是文件修改的区域 stage是修改后通过add 命令 添加到.git文件夹中的修改。
6、撤销修改
可以通过 git checkout -- readme.txt 命令撤销工作区的修改这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
注意:情况一是指:
这个命令是撤销工作区的修改。而所谓撤销工作区的修改是指,当你手动删除修改,使文件回到修改前一模一样,但使用git status 命令,扔会显示有文件未提交到stage。
而你使用checkout命令后,再使用git status命令时,就无法查到有文件被modify了。
用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区,git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
7、删除文件
git rm test.txt
git commit -m "remove test.txt"
8、远程仓库
-- 先有本地库,后有远程库的时候 --
8.1、可以在github 等网站申请账号。创建一个仓库
8.2、在本地的仓库下 运行命令 git remote add origin git@github.com:【michaelliao/learngit.git】 使得远程仓库与本
地仓库相连。添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知
道是远程库。
8.3、 git push -u origin master 可以把本地库的所有内容推送到远程库上 由于远程库是空的,我们第一次推送master分支
时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程
的master分支关联起来。
8.4、后续本地master修改,可直接通过git push origin master 推送,
git push <远程主机名> <本地分支名>:<远程分支名>
git pull <远程主机名> <远程分支名>:<本地分支名>
-- 先创建远程库,从远程库克隆 --
8.5、git clone git@github.com:michaelliao/gitskills.git
实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还
有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
8.6 git remote -v 查询远程仓库名以及抓起和推送地址。
8.7 git clone local Repository path 可以复制本地仓库到当前目录。
例如:git clone ~/work/project/public/.git . 当前目录复制 “~/work/project/public/” 目录下工程。
9、分支管理
9.1 创建分支并切换到分支 branchName上
git checkout -b branchName
它相当于两条命令
git branch branchName // 创建分支
git checkout branchName // 切换分支
9.2 查看当前分支
git branch
9.3 合并分支
git checkout master //切换到master分支
git merge branchName // 合并方案一:branchName的修改到master上,这是 Fast-forward 方式合并,当删除branchName分支后,会丢掉分支信息
git merge --no-ff -m "merge with no-ff" branchName // 禁用Fast-forward方式合并,即使删除branchName分支,其信息也会保留
git log --graph --pretty=oneline --abbrev-commit //可查看分支合并信息
9.4 冲突管理
当branchName分支和master分支 都对同一文件进行修改时。git无法进行快速合并(Fast-forward).
执行 git merge branchName 会提示有文件冲突。此时,只能手动修改冲突文件再通过 add 命令添加,再commit。
9.5 删除分支
git branch -d branchName
git branch -D branchName //内容未合并,强行删除分支。
10、分支策略
在实际开发中,几个基本原则进行分支管理:
首先,master作为稳定分支,用于发布新版本;
其次,dev分支是不稳定的,开发过程中使用;
最后,再把dev分支合并到master上 ,通过其发布。
11、Bug分支
git stash //保存工作现场
git stash list //查看工作现场
git stash apply stash@{0} // 恢复工作现场{0},但stash内容不删除
git stash pop
12、标签管理
12.1 创建标签
git tag tagName [commit id] 创建标签.再当前commit上(或过去某一commit id上)打标签
git tag 查询标签
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息。
git tag -a v0.1 -m "version 0.1 released" 3628164 //给标签添加信息
git tag -s v0.2 -m "signed version 0.2 released" fec145a //私钥签名一个标签
注意:签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错
12.2 操作标签
git tag -d v0.1 // 删除标签
git push origin v1.0 // 推送标签到远程
git push origin --tags // 一次性推送所有标签到远程。
删除远程标签,需先删除本地标签,再删除远程标签
git push origin :refs/tags/v0.9
13、自定义Git
13.1 忽略特殊文件
在工作区根目录创建.gitignore 文件,将需要忽略的文件和目录写入,再讲该文件上传至git即可。
git add -f App.class //强制添加忽略的文件。
git check-ignore -v App.class //检查是否包含该隐藏规则
13.2 配置别名
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
global 是当前电脑所有仓库都生效。不加global只对当前仓库生效。
别名保存在 .git/config配置文件里,删除要进入这个文件删除,添加也可以在文件直接添加。